You are on page 1of 49

CƠ SỞ DỮ LIỆU 2

Lớp: 41.2_LT(1+2)
Lớp trưởng: Nguyễn Thái Dương, đt: 085.343.3401
Email: Nguyenthaiduong57.IT@gmail.com
(1) Giảng viên: Vũ Bá Anh
ĐT: 091.323.9292
Email: AnhvbHvtc@gmail.com
(2) Nội dung HP: Cơ sở dữ liệu – HP 2
Nd: Xây dựng phần mềm quản trị CSDL Tài chính – Kế toán
dựa trên Visual FoxPro
Gồm:
- Hệ thống hóa kiến thức về Visual FoxPro
- Bước đầu làm việc với Visual Foxpro
- Làm quen với các đối tượng và lớp trong VFP
- Tạo giao diện trong quản trị CSDL
- Tạo báo cáo trong quản trị CSDL
- [Kết hợp dữ liệu với các ứng dụng khác]
- Quy trình xây dựng phần mềm.
(3) Tài liệu học tập
- Giáo trình: CSDL hp2 (HVTC)
- Tài liệu tham khảo:
+ Các tài liệu Tin học về Visual FoxPro
+ Các tài liệu hướng dẫn xây dựng phần mềm quản lí
+ Các tài liệu Kế toán: Giáo trình Nguyên lí kế toán,
Giáo trình Kế toán tài chính 1, 2.
(4) Yêu cầu:
- Ghi chép nội dung cơ bản
- Cài đặt Visual Foxpro để tự thực hành.
Chương 1: Hệ thống hóa kiến thức về Visual FoxPro
I. Khái quát chung về Visual FoxPro
1- Giới thiệu sản phẩm
- VFP là sản phẩm của MicroSoft, phát triển qua nhiều phiên
bản:
+ FoxBase
+ FoxPro
+ FoxPro for Windows
+ Visual FoxPro (5.0 – 9.0)
- VFP là hệ quản trị CSDL, tích hợp cả 3 chức năng cơ bản
để viết phần mềm, gồm:
+ Quản trị CSDL (3 chức năng chính):
 Create: Tạo lập CSDL (tạo ra các tệp dữ liệu và tạo
MQH giữa các tệp)
 Update: Cập nhật dữ liệu (Thêm, sửa, xóa)
 Query: Truy vấn – cung cấp thông tin.
+ Ngôn ngữ lập trình: VFP cung cấp hệ ngôn ngữ đủ để viết
trình trong quản trị CSDL.
+ Công cụ tạo lập báo cáo
Do đó, VFP là công cụ xây dựng phần mềm quản trị
CSDL rất phù hợp cho các đơn vị có quy mô nhỏ và vừa.
- VFP là sản phẩm phải cài đặt lên máy.
+ Tìm kiếm trên Google, từ khóa “Visual Foxpro Dowload”
+ Tải về máy
+ Cài đặt: Chạy tệp tệp chương trình Setup.exe hoặc Install
(Hiển thị: Done / Finish là xong)
+ Thư mục chứa: “Microsoft visual Foxpro 9” nằm trong thư
mục “Program files” của ổ đĩa chủ.
2- Môi trường làm việc của VFP
- Tệp chương trình chính để khởi động VFP: VFP9.EXE
- Khởi động xong: xuất hiện giao diện chính, quan tâm đến 2
thành phần chính, gồm:
+ Thanh thực đơn: Chứa hệ thống thực đơn để lựa chọn công
việc cần làm;
+ Cửa sổ lệnh (Command): Là nơi gõ lệnh vào để máy tính
thực hiện ở chế độ hội thoại.
- Thoát khỏi VFP: hoạt động trên Windows => có 5 cách
chung để thoát khỏi. Ngoài ra, dùng lệnh: QUIT
3- Một số khái niệm:
a. Tệp dữ liệu:
Có phần kiểu .DBF (Data Base File)  gọi mỗi tệp là DBF, là
bảng, gồm các bản ghi (records – dòng chứa thông tin 1 đối
tượng) và Fields (cột), mỗi field chứa thông tin của 1 thuộc
tính.
Field được xác định nhờ 4 thuộc tính:
- Name (tên trường): không quá 10 kí tự
- Type (kiểu dữ liệu của trường), gồm:
+ Character (C): Chứa xâu
+ Numeric (N): Chứa số
+ Date (D): Chứa ngày
+ Logical (L): Chứa T/F – đúng/sai
+ General (G): Kiểu chung chứa tệp ảnh/ âm thanh/ vedeo.
- Width (độ rộng):Số kí tự tối đa ghi trong trường, quy định:
+ Kiểu C, đr <=254
+ Kiểu N, đr <=20
+ Kiểu D, đr = 8 (dd, mm, yyyy)
+ Kiểu L, đr = 1 (chứa T/F)
- Decimal (số chữ số thập phân)
b. Khóa quan hệ:
- ĐK trở thành khóa: Trường phải được index (sắp xếp tăng
hoặc giảm dần)
- Các loại khóa:
+ Khóa chính (Primery): Chỉ có 1 khóa chính trong 1 tệp, nó
đặc trưng cho phía 1 của quan hệ;
+ Khóa dự tuyển (Candidate): Tương tự như khóa chính, mỗi
bảng có thể có nhiều khóa Candidate;
+ Khóa thường (Regular): khóa đặc trưng cho phía nhiều
trong quan hệ 1-n  Trong trường xác định là khóa
regular, có thể có nhiều bản ghi cùng giá trị.
c- Một số kiểu tệp sử dụng trong VFP
- .DBF (Data Base File) – tệp dữ liệu
- .IDX (Index) – Tệp chỉ dẫn để sắp xếp
- . PJX (Project) – Tệp dự án
- .DBC (Data Base Contain) – bộ chứa CSDL
….
Trong tệp DBF cho phép chứa không quá 1 tỉ bản ghi.
II. Các yếu tố cơ bản trong VFP
1- Bộ kí tự
VFP sử dụng cả 2 bộ kí tự: Bộ mã ASCII (8 bit) và mã Unicode
(16).
2- Từ khóa
VFP sử dụng các từ tiếng Anh, cho phép viết tắt đên 4 kí tự đầu.
Vd: Modify = MODI; Structure = STRU
Chú ý: VFP không phân biệt chữ in và chữ thường, trừ trong xâu
kí tự.
3- Lời chú thích
- Các dòng bắt đầu bằng dấu * là chú thích (bị máy bỏ qua)
- Trong 1 dòng, các kí tự viết sau && là chú thích.
4- Các đại lượng
a. Hằng
Cách viết:
- Hằng số (kiểu Numeric)
±n.m (hằng thực), ±n (hằng nguyên)
- Hằng xâu (Character)
‘Bác Hồ’ hoặc “Bác Tôn” hoặc [Vietnam]
- Hằng ngày (kiểu date)
{^yyyy-mm-dd}
Vd: {^2021-10-20}
- Hằng logic (kiểu Logical)
.T. – Đúng, .F. – sai
b. Biến
VFP có 2 loại biến:
- Biến trường (Field): Tên các trường trong tệp dữ liệu đang
mở (để làm việc). Tên trường <=10 kí tự, tệp trong CSDL
thì tên trường cho phép <=254 kí tự, bắt đầu phải là chữ
cái.
- Biến nhớ (Variable): Là biến trung gian do NSD đặt khi lập
trình, khác với tên trường. Tên biến nhớ <=254 kí tự, bắt
đầu không là số. Vd: x1, x2, hoten, _nhap
c- Hàm mẫu
Toàn bộ các hàm: Đọc giáo trình, chỉ giới thiệu 2 nhóm hàm
thường dùng trong xử lí dữ liệu quản lí.
(*). Các hàm xử lí xâu
- Left(xâu,n) và Right(xâu,n) trích trái / phải n kí tự từ xâu.
Vd: Left(‘ABC123’,2) = ‘AB’
Số hiệu SV có dạng: CQ|57|41|02|001 tên trường: sohieu C(10)
Đkiện sinh viện chính quy: Left(sohieu,2)=’CQ’
(đây là thuộc tính gộp – phức hợp)

- SubStr(xâu, m, n) trích n kí từ từ vị vị m trong xâu.


Vd: Đkiện xác định là sviên chuyên ngành Tin học TCKT là:
SubStr(sohieu, 5, 2) = ‘41’
- 3 hàm LTRIM(xâu), RTRIM(xâu), ALLTRIM(xâu): cắt bỏ
hết kí tự trống ở phía Trái, Phải, cả hai phía của xâu.
- Hàm UPPER(xâu), LOWER(xâu) chuyển xâu thành chữ

in, chữ thường

(*). Các hàm chuyển kiểu dữ liệu

- Hàm Val(xâu) chuyển xâu thành số

Vd: Val(‘123.45’) = 123.45; Val(‘12A4H’) = 12; Val(‘abc’) =0

- Hàm STR(số, n [,m]) chuyển số thành xâu với độ dài là n và


m kí tự sau dấu chấm. Ngầm định m=0 (số nguyên)
Vd: STR(20/3,5,2) = “b6.67” với b-khoảng trống (blank)
Str(20/3,5) = ‘bbbb7’
- Hàm DTOC(ngày) chuyển ngày thành xâu
- Hàm CTOD(xâu) chuyển xâu thành ngày
- 3 hàm Year(ngày), Month(ngày), Day(ngày) cho giá trị là
năm, tháng, ngày trích từ ngày (mỗi thành phần đều là số)
Vd: Day({^2021-10-20}) = 20
- Hàm Date() cho giá trị là ngày hiện tại
- Hàm IIF(bt_logic, bt1, bt2) nhận giá trị là gtrị bt1 nếu
bt_logic đúng, ngược lại thì cho giá trị bt2.
Vd: viết công thức tính số tiền = kl*dg
Đơn giá là 100 nếu kl<=10
Là 90 nếu kl thuộc (10, 20]
Là 80 nếu kl >20
IIF(kl<=10, kl*100, IIF(kl<=20, kl*90, kl*80))

5.Biểu thức

a- Bt số:

- Sử dụng các dpt số học: +, -, *, /, ^ (**) – lũy thừa


- Tính giá trị: Nhận giá trị là số, trật tự ưu tiên: Tính hàm,
Trong ( ), Tính lũy thừa, * /, + -
Cùng mức độ thì từ trái sang phải, riêng lũy thữ thì phải
sang trái. Vd: 2^2^3 = 256

b- Bt xâu:

- Gồm các đlượng xâu liên kết bằng dpt ghép xâu: +
- Giá trị: Giá trị các đại lượng ghép lại tuần tự
“ABC” + Left(“XYZ123”,2) = “ABCXY”

c- BT ngày
- Dạng: Ngày ± số
- Giá trị: Hiểu ± bao nhiêu ngày => BT ngày nhận giá trị là
ngày.
Vd: {^2021-10-20} + 5 = {^2021-10-25}

d- BT quan hệ:

- Là BT so sánh 2 đại lượng cùng kiểu, thông qua các dấu


phép toán quan hệ: <, >, =, <=, >=, # (<>) khác. Riêng với 2
xâu, có thêm dpt $ (xâu con)
- Vd:
(1) 1 > 5 +1
(2) “Bac Ho” > “Bac Mao”
(3) {^2021-10-20} < {^2021-10-25}
(4) ‘uon’ $ “Phuong”
- Tính giá trị: Nếu thỏa mãn thì nhận .T., không thỏa mãn thì
nhận .F.
(1) Nhận .F.
(2) Nhận .F.
(3) Nhận .T.
(4) Nhận .T.

e. BT logic

- Là tập các đl logic và BT quan hệ liên kết bằng dpt logic, ( ). Các dpt
gồm: .NOT. (!) – phủ định, .AND. – Và, .OR. – hoặc

- Giá trị: .T. hoặc .F., tính theo trật tự ưu tiên: ( ), NOT, AND, OR

6- Phạm vi
- Kn: Phạm vi là một yếu cơ bản của VFP để xác định một
tập hợp các bản ghi trong tệp chịu tác động của lệnh.
- Các phạm vi thường dùng:
+ Các giá trị tường minh:
ALL – Tất cả các bản ghi trong tệp
(Vd: Delete ALL)
NEXT [n] - gồm n bản ghi kế tiếp kể từ bản ghi hiện tại
(ngầm định n = 1)
RECORD n - Chỉ gồm 1 bạn ghi thứ n
REST - Gồm các bản ghi kể từ hiện tại đến cuối tệp.

+ Các giá trị ngầm định: ALL hoặc bản ghi hiện thời, tùy mỗi
lệnh.

III. CÁC LỆNH CƠ BẢN CỦA VFP


1- Các lệnh tạo tệp dữ liệu
a- Lệnh CREATE
- Dùng tạo tệp dữ liệu
- Dạng:
+ Dạng khi tạo CSDL: tạo trực quan
CREATE tên_tệp
(ngầm định .DBF)
Sau đó khai báo trực quan cấu trúc tệp, xong: ^W / nút OK
+ Dạng sử dụng khi viết trình:
CREATE TABLE tên_tệp (khai_báo_cấu_trúc)
- Ví dụ: Tạo tệp dữ liệu chứa phiếu thu và chi tiền mặt (kế
toán vốn bằng tiền), gồm các thuộc tính sau: Số phiếu, ngày
lập, TK ghi nợ, TK có, Nội dung, Số tiền, Nguyên tệ
(+ Phiếu ghi nợ TK 111 là phiếu thu, Ghi có TK 111 là
phiếu chi;
+ TK 111 có 2 TK cấp 2 là 1111 (tiền VN) và 1112 (tiền
ngoại tệ;
+ TK 1112 có tk cấp 3 gồm 2 kí tự để mã chi tiết ngoại tệ:
111201 – USD, 111202 – EUR, 111203 – JPN, 111204 –
CHN, …)

Cần tạo tệp dữ liệu bằng lệnh:


CREATE TABLE phieutc (sophieu C(10), ngaylap D(8), Tkno C(10),
Tkco C(10), nd C(40), sotien N(15,2), nguyente N(10,1))
Nếu sử dụng dạng trực quan: CREATE phieutc rồi khai báo trực
quan.
b- Mở và đóng tệp dl
- Tệp nằm trên đĩa, muốn làm việc với nó, phải đọc vào RAM
–gọi là mở tệp; Xong, phi tệp trở lại địa – gọi là đóng tệp.
- Các lệnh:
+ Mở: USE tên_tệp
+ Đóng:
USE && đóng tệp đang làm việc
CLOSE DATABASE && Đóng CSDL (All tệp trong
CSDL)
CLOSE ALL && Đóng tất cả các tệp
c-Lệnh APPEND
- Dùng: Bổ sung các bản ghi vào cuối tệp
- Dạng:
+ Để nhập liệu từ bàn phím: APPEND
(NSD nhập lần lượt các bản ghi, kết thúc: ^W)
+ Nhập liệu trong chương trình:
APPEND BLANK  thêm 1 bản ghi trắng vào cuối bảng, sau
đó viết các lệnh khác để đưa dữ liệu vào bản ghi trắng đó.
+ Để lấy dữ liệu từ tệp khác đưa vào tệp đang làm việc:
APPEND FROM tên_tệp [FOR bt_logic]
Vd: trên USB (định danh ổ G:) có tệp NHAP.DBF cùng cấu
trúc bảng phieutc. Cần lấy các chứng từ nhập ngày 19/10/2021
là phiếu thu trên USB bổ sung vào cuối phieutc
USE phieutc
APPEND FROM g:\nhap.dbf FOR ngaylap={^2021-10-
19}.AND. Left(tkno,3)=’111’
USE
d.Các lệnh COPY STRUCTURE, COPY TO, COPY FILE đọc giáo
trình.
COPY TO tên_tệp [FIELDS ds_trường] [FOR bt_logic]
Vd: sao tệp Phieutc sang USB, tên Thu.dbf. chỉ lấy chứng từ trong
tháng 9/2021 và chọn 4 cột: sophieu, tkno, tkco, sotien
USE phieutc
COPY TO g:\thu.dbf FIELDS sophieu, tkno, tkvco, sotien FOR
MONTH(ngaylap)=9.and. Year(ngaylap)=2021
ĐK tháng 9/2021:
ngaylap>={^2021-09-01}.and.ngaylap<={^2021-09-30}
2-Di chuyển con trỏ bản ghi
a-Khái niệm: Con trỏ bản ghi là cơ chế đánh dấu bản ghi đang làm
việc, khi làm việc với bản ghi nào thì con trỏ đặt vào bản ghi đó, khi
trỏ đặt vào bản ghi nào thì bản ghi đó là bản ghi làm việc (hiện thời).
Mới mở tệp, trỏ đặt vào bản ghi đầu tiên
b-Các lệnh di chuyển
-Lệnh GOTO n / TOP / BOTTOM: Chuyển con trỏ đến bản ghi thứ n/
đầu tiên / bản ghi cuối cùng.
- Lệnh SKIP [n]: Chuyển trỏ đi |n| bản ghi kể từ bản ghi hiện thời.
Nếu n>0 thì chuyển về phía cuối tệp, n<0 thì chuyển về phía đầu tệp.
Ngầm định n=1.
-Ví dụ: Giả sử tệp Phieutc.dbf có 100 bản ghi
Lệnh Con trỏ
USE phieutc Record: 1/100
GOTO 50 50/100
SKIP 10 60/100
SKIP -5 55/100
SKIP 56/100
GO TOP 1/100
GO BOTTOM 100/100
SKIP EOF/100 (End Of File)
SKIP Lỗi: Out of range!
Chú ý: Khi con trỏ đặt eof, hàm eof() nhận .T., ngược lại, khôn: g
nằm ở eof thì hàm eof( ) nhận .F.
Tương tự, có dấu hiệu BOF (Begin Of File – bắt đầu tệp)
GO TOP : 1/100
SKIP – 1 : BOF
Khi trỏ ở bof thì hàm bof() nhận .T., ngược lại thì nhận .F.
Hai dấu hiệu eof và bof (quản lí nhờ 2 hàm eof() và bof()) là căn cứ kết
thúc chu trình duyệt các bản ghi từ đầu đến cuối hoặc từ cuối lên đầu
tệp.
-Lệnh LOCATE (định vị)
+ Để định vị con trỏ đến bản ghi thỏa mãn một điều kiện  Tìm kiếm
bản ghi thỏa mãn đk đó.
+ Dạng: LOCATE FOR bt_logic
Bt_logic – điều kiện tìm kiếm
Cơ chế tìm kiếm: Tìm tuần tự từ đầu tệp.
Lưu ý: Nếu tìm thấy thì hàm FOUND() nhận .T. (eof() nhận sai), nếu
không thấy thì FOUND() nhận .F. (eof() nhận .T.).
3-Các lệnh xem tệp dữ liệu
a.Lệnh LIST STRUCTURE
- Để hiển thị cấu trúc tệp
- Dạng: LIST STRUCTURE [TO PRINTER]
b.Hai lệnh LIST và DISPLAY
- Đều để hiển thị nội dung các bản ghi
- Dạng:
LIST [phạm_vi] [FIELDS ds_trường] [FOR bt_logic] [TO PRINTER]
DISPLAY …. (tương tự list)
Khác nhau: Phạm vi ngầm định của List là All, của Display là bản ghi
hiện thời (nếu có For thì là ALL)
-Ví dụ:
+ In các phiếu chi tiền ngoại tệ trong quý 4 năm 2021
USE phieutc
LIST ALL FOR left(tkco,4)=’1112’.and.month(ngaylap)>=10.and.
year(ngaylap)=2021 TO PTINTER
+ Xem nội dung chứng từ số 123456
USE phieutc
LOCATE FOR sophieu=’123456’
DISPLAY
(Có thể viết 2 lệnh trên là: List for sophieu=’123456’ nhưng Bờm!)
4-Sửa tệp dữ liệu
a-Lệnh Modify Structure
-Để sửa cấu trúc tệp dữ liệu
- Dạng: Modify Structure
- Có 3 dạng sửa chữa:
+ Thêm trường: Nút Insert
+ Bớt trường: Nút Delete
+ Sửa trường: Sửa tên, kiểu, độ rộng, Decimal
(Xong: Phím ^W / Nút OK)
b-Lệnh BROWSE
-Dùng: Sửa nội dung bản ghi thủ công (thao tác trên Excel)
- Dạng: BROWSE [FIELDS ds_trường] [FOR bt_logic]
- Vd: Sửa lại các chứng từ đã nhập trong ngày 25/10/2021
USE phieutc
BROWSE FOR ngaylap = {^2021-10-25}
(xong: ^W)
USE
c-Lệnh REPLACE (thay thế)
-Dùng: Thay nội dung trường dữ liệu bởi một giá trị của biểu thức
(Sửa dữ liệu bằng lệnh)
-Dạng: REPLACE [Phạm_vi] trường_1 WITH bt_1 [, trường_2
WITH bt_2] [,…] [FOR bt_logic]
Phạm vi ngầm định là bản ghi hiện thời, nếu có FOR … thì là ALL
Chú ý: bt1, bt2, … cùng dl với các trường tương ứng.
-Ví dụ:
+ Vd1: Xét trên Phieutc.dbf; Yêu cầu: Sửa lại tỉ giá ngoại tệ USD (mã
001) trên các chứng từ lập ngày 27/10/2021 thành 23600.
USE phieutc
REPLACE ALL sotien WITH nguyente*23600 FOR ngaylap={^2021-
10-27}.and.(left(tkno,6)=’111201’ .or.Left(tkco,6)=’`111201’)
USE
+ Vd2: Giả sử có bảng dssv.dbf (danh sách sinh viên), có cấu trúc: (htd
C(30), ten C(10), sohieu C(10), ngaysinh D(8), d1 N(4,1), d2 N(4,1), d3
N(4,1), dtb N(5,2), pl C(4))
Tình điểm trung bình (dtb) biết số tín chỉ tương ứng: 3,2,3
Phân loại: Giỏi (nếu dtb>=8.5), khá (dtb thuộc [7, 8.5), TB (nếu dtb
thuộc [5,7), Yếu nếu dtb<5.
USE dssv
REPL ALL dtb WITH (d1*3 + d2*2 + d3*3)/8
REPL ALL pl WITH IIF(dtb>=8.5, “Giỏi”, IIF(dtb>=7, “Khá”,
IIF(dbt>=5, “TB”, “Yếu”)))
Có thể viết:
REPL ALL pl WITH “Giỏi” FOR dtb>=8.5
REPL ALL pl WITH “Khá” FOR dtb>=7.and. dbt<8.5

(viết cách này không hay!)
Nhận xét: REPL vừa dùng để sửa dữ liệu, cũng hay dùng để tính toán
rồi ghi giá trị vào trường.
5-Xóa bản ghi
a-Lệnh DELETE
-Để đánh dấu xóa các bản ghi
-Dạng: DELETE [Phạm_vi] [FOR bt_logic]
Pvi ngầm định là bản ghi hiện thời, có FOR thì là ALL
-Ví dụ:
+ Đánh dấu xóa bản ghithứ 50
USE phieutc
GOTO 50
DELETE
+ Đánh dấu xóa các chứng từ không định khảon kế toán (bỏ trống
Tkno và Tkco)
DELETE ALL FOR empty(tkno).and. empty(tkco)
b-Lệnh RECALL
-Để: Gọi lại bản ghi bị đánh dấu xóa (hủy bỏ đánh dâu xóa)
- Dạng: RECALL [Phạm_vi] [FOR bt_logic]
c-Lệnh PACK
- Dùng để xóa các bản ghi đã bị đánh dấu xóa
- Dạng: PACK
(Nếu phải dúng 3 lệnh, trình tự: DELETE > RECALL > PACK)
Nếu đã pack thì không khôi phục lại bản ghi được nữa.
6-Sắp xếp bản ghi
a-Lệnh SORT
-Để: Sắp xếp các bản ghi rồi gửi kết quả sắp xếp sang tệp dữ liệu khác
- Dạng: SORT ON ds_trường TO tên_tệp_dbf [FOR bt_logic]
Trong đó:
+ds trường: là tên các trường dùng làm tiêu thức sắp xếp. Sau mỗi tên
trường, có thể có các tham số:
/A (Ascending – tăng dần) – là tham số ngầm định;
/D (Descending – giảm dần)
/C (Character) – bỏ qua sự khác nhau của chữ in và thường
Nếu có nhiều tên trường thì ưu tiên các trường viết trước.
+ Tên_tệp_dbf: là bảng dữ liệu chứa kết quả sau sắp xếp
- Ví dụ: In các phiếu thu trong tháng 10/2021 xếp theo ngày, cùng
ngày xếp theo số phiếu tăng dần.
USE phieutc
SORT ON ngaylap, sophieu/a TO vd1.dbf FOR left(tkno,3)=’111’.and.
month(ngaylap)=10.and.year(ngaylap)=2021
USE vd1
LIST TO PRINTER
Chú ý: SORT chỉ sx dựa trên từng trường, không dựa trên biểu thức
tổng quát.
b-Lệnh INDEX (Chỉ dẫn)
-Dùng: Tạo ra tệp chỉ dẫn để chỉ dẫn đọc tệp dữ liệu theo trình tự đã
sắp xếp.
- Dạng: INDEX ON biểu_thức TO tên_tệp_Idx [FOR bt_logic]
Trong đó:
+ bthức: Là tiêu thức index = tiêu thức sắp xếp. Index chỉ dẫn truy
nhập các ghi của tệp dữ liệu sao cho biểu thức có giá trị tăng dần.
Nếu muốn xếp theo nhiều tiêu thức, phải ghép các tiêu thức tuần tự
thành biểu thức xâu.
+ Tệp idx là tệp chỉ dẫn, chi ghi 2 thông tin: số thứ tự bản ghi và giá
trị khóa sắp xếp.
-Ví dụ:
+ vd1: In các phiếu thu trong tháng 10/2021 xếp theo ngày, cùng ngày
xếp theo số phiếu tăng dần
USE phieutc
INDEX ON str(year(ngaylap),4) + str(month(ngaylap),2) +
str(day(ngaylap),2) + sophieu TO vd1.idx FOR
left(tkno,3)=’111’.and. month(ngaylap)=10.and.year(ngaylap)=2021
LIST TO PRINTER
+Vd2: In các phiếu chi tạm ứng trong năm 2021 xếp theo tháng, cùng
tháng xếp theo mã đối tượng tạm ứng.
(Chi tạm ứng: Có 111, Nợ 141xxx với xxx là mã đtượng tạm ứng)
USE phieutc
INDEX ON str(month(ngaylap),2)+substr(tkno,4,3) TO vd2.idx FOR
left(tkco,3)=’111’.and.left(tkno,3)=’141’.and.year(ngaylap)=2021
LIST TO PRINTER
(Ví dụ này, nếu dùng SORT là bó tay.com)

7-Một số tính toán trên tệp dữ liệu


a-Lệnh COUNT (đếm)
-Dùng: Đếm số bản ghi để suy ra số đtượng tương ứng.
- Dạng: COUNT [TO biến] [FOR bt_logic]
Biến – biến nhớ (không trùng tên trường) để chứa kết quả sau đếm.
-Ví dụ:
+ vd1: Đếm xem có bao nhiêu lần chi ngoại tệ EUR trong năm 2021
COUNT TO sl FOR left(tkco,6)=’111202’ .and.year(ngaylap)=2021
? “Số lần chi EUR là:”, sl
+ vd2: Tệp dssv.dbf, cần xác định tỉ lệ sinh giỏi, sv khá = ?
USE dssv
COUNT TO tsv &&đếm tổng sinh viên
COUNT TO tgioi FOR pl=’Giỏi” &&Đến tổng SV giỏi
COUNT TO tkha FOR pl=’Khá” &&Đến tổng SV khá
? “Tỉ lệ SV giỏi =”, tgioi/tsv*100, “%”
? “Tỉ lệ SV Khá =”, tkha/tsv*100, “%”
b-Lệnh SUM (tổng số)
-Dùng: Tính tổng các trường số
-Dạng: SUM [ds_trường] [ds_biến] [FOR bt_logic]
Trong đó: ds_trường là các tên trường cần tính tổng, ngầm định là
mọi trường số; ds_biến là tên các biến để ghi ghi nhớ kết quả.
-Ví dụ: Tính tổng tiền còn chưa thanh toán tạm ứng năm 2021
(Tứ: Ghi nợ 141xxx, Thanh toán tứ, ghi có 141xxx)
USE phieutc
SUM sotien TO tongtu FOR left(tkno,3)=’141’.and.
left(tkco,3)=’111’.and. year(ngaylap)=2021
SUM sotien TO tongtt FOR left(tkco,3)=’141’.and.
year(ngaylap)=2021
? “Tổng tiền chưa thanh toán tạm ứng trong năm 2021=”, tongtu-
tongtt
c-Lệnh Average (tính Trung bình cộng)
Đọc giáo trình
Chú ý: Thường dùng 2 số trung bình:
+ TBCộng = kquả SUM / kquả COUNT (vd: Lương bquân CBCNC)
+ TB gia quyền = Kquả SUM/Kquả SUM khác (vd: Tính giá vtư nhập
kho bình quân).
d-Lệnh TOTAL (tổng cộng)
-Dùng: Tính tổng các trường số trên từng nhóm bản ghi.
Khái niệm nhóm bản ghi: Là tập các bản ghi kế tiếp có có cùng giá trị
của tiêu thức phân nhóm. Vd: Có bảng Phieuvt.dbf, nội dung:
Tenvt Mavt kl dg st
Sắt 10 LX 001 1 2 2
Gạch 002 3 4 12
Sắt F10 001 5 6 30
Căn cứ mã vật tư (mavt), tệp có 3 nhóm bản ghi <= sai!
Để phân nhóm đúng, trước khi phân nhóm, phải sắp xếp theo tiêu
thức phân nhóm.
Vd: INDEX ON mavt TO vd1.idx
Các bản ghi sẽ có thứ tự: 1 > 3 > 2 > eof
-Dạng lệnh:
TOTAL ON biểu_thức TO tên_tệp_dbf [FIELDS ds_trường] [FOR
…]
Biểu thức: Tiêu thức phân nhóm
Tên tệp_dbf: là tệp dữ liệu để chứa kết quả sau khi tính tổng nhóm,
được xác định như sau:
+ Cấu trúc: Trùng cấu trúc tệp gốc;
+ Số bản ghi = số nhóm được tính tổng (tổng mỗi nhóm chứa trên 1
bản ghi)
+ Nội dung bản ghi: trường được tính tổng sẽ nhận giá trị là tổng
nhóm, ở trường không được tính tổng thì lấy giá trị trên bản ghi đầu
của nhóm tương ứng.
Ds_trường: Tên các trường số cần tính tổng, ngầm định là tất cả các
trường số.
-Vd:
+vd1: Xét bảng phieuvt.dbf. Cần tính tổng khối lượng và số tiền mỗi
loại vật tư
USE phieuvt
INDEX ON mavt TO vd1.idx
TOTAL ON mavt TO ketqua1.dbf FIELDS kl, st
USE ketqua1
LIST FIELDS tenvt, mavt, kl, st
+ vd2: Xét tệp Phieutc.dbf. Cần xác định tổng tiền tạm ứng của từng
đối tượng. (Tkno: 111, tk có 141xxx)
USE phieutc
INDEX ON substr(tkno, 4, 3) TO vd2.idx FOR left(tkno,3)=’141’.and.
left(tkco,3)=’111’
TOTAL ON substr(tkno, 4, 3) TO ketqua2
USE ketqua2
LIST FIELDS tkno, sotien, nguyente
+ Ví dụ 3: BT về nhà
Xét Phieutc, Lập báo cáo tổng tiền chưa thanh toán của từng đối
tượng tạm ứng?
Tứ: Nợ TK 141xxx, Thanh toán tứ: Có tk 141xxx
Gợi ý: Khi thanh toán (ghi có 141) chuyển số tiền thành – số tiền, rồi
cộng dồn. Tính xong lại thay số tiền = - số tiền để trả lại giá trị ban
đầu.
8-Làm việc với nhiều tệp dữ liệu
Nhiều bài toán, phải lấy dữ liệu từ nhiều tệp đồng thời  phải mở để
làm việc với nhiều tệp.
a. Mở nhiều tệp dữ liệu
- Nguyên lí: Bộ nhớ đệm cho tệp có thể được chia thành
nhiều vùng riêng biệt để đọc nhiều tệp vào đồng thời. Các
vùng được đánh số từ 1 – 10.000, riêng 10 vùng đầu có thể
gọi bằng chữ A-J)
- Lệnh:
Cách 1: USE tên_tệp IN vùng [ ALIAS bí_danh]
Cách 2:
SELECT vùng
USE tên_tệp [ALIAS bí_danh]
Giải thích:
Vùng có giá trị từ 1=10.000, thường dùng kế tiếp để dễ nhớ. Nếu
vùng=0 thì tệp được mở ở vùng rỗi gần nhất.
Bí_danh: Tên ngắn do NSD đặt để gọi cho dễ, Ngầm định là tên
tệp.
- Ví dụ:
USE phieutc IN 1
USE danhmuctaikhoan IN 0 ALIAS dmtk && mở ở vùng 2
SELECT 3
USE dmdoituong ALIAS dmdt
b-Chọn tệp để làm việc
- Nguyên tắc: Muốn làm việc với tệp nào thì chọn vùng làm
việc chứa tệp đó
- Dạng lệnh:
SELECT vùng/bí_danh
- Vdụ: Muốn sắp xếp bảng dmtk theo sohieu C(10) và sửa
bảng dmdoituong bằng browse

USE phieutc IN 1
USE danhmuctaikhoan IN 0 ALIAS dmtk && mở ở vùng 2
SELECT 3
USE dmdoituong ALIAS dmdt
SELECT 2 && hoặc sele dmtk
INDEX ON sohieu TO vd.idx
SELECT dmdt && hoặc viết sele 3
BROWSE
(xong: ^W)
c-Đóng tệp
-Nếu đóng tất cả: CLOSE ALL hoặc CLOSE DATABASE
-Nếu đóng từng tệp: Phải chọn vùng rồi đóng tệp trong vùng đó:
SELECT vùng/bí_danh
USE
-Vd: Đóng tệp dmtk:
SELECT 2 && hoặc sele dmtk
USE
d-Tham chiếu đến dữ liệu ở vùng khác (trong bảng khác)
-Nguyên tắc: Tham chiếu kiểu quan hệ: bí_danh.tên_trường
- Vd: Cần hiển thị chứng từ số 123456 trong đó tk nợ có kèm theo tên
(tên TK lấy trong bảng danhmuctk (tentk C(30), sohieutk C(10), loaitk
C(1))
USE phieutc IN 0
USE danhmuctk IN 0 ALIAS dmtk
SELECT 1
LOCATE FOR sophieu = ‘123456’
Nhap=tkno
SELECT dmtk
LOCATE FOR sohieutk=nhap
SELECT 1
DISPLAY FIELDS ngaylap, tkno, dmtk.tentk, sotien, nguyente
e-Thiết lập mối quan hệ giữa 2 bảng
-Hai bảng có thể có quan hệ với nhau (1-1 hoặc 1-n) thông qua khóa
quan hệ. Theo mức độ quan hệ, chia thành 2 loại quan hệ:
+ Quan hệ bền vững: Là quan hệ được thiết lập chặt chẽ từ khi tạo ra
CSDL. Có đặc điểm:
 Luôn tồn tại khi mở CSDL
 Khi con trỏ di chuyển trên bảng này không ảnh hưởng đến con
trỏ ở bảng quan hệ.
+ Quan hệ tạm thời: Là quan hệ được thiết lập bằng lệnh tạo quan hệ
SET RELATION. Có đặc điểm:
 Chỉ tồn tại sau thiết lập, tự động mất khi 1 trong 2 bảng bị đóng.
 Khi con trỏ di chuyển trên bảng này thì ở bảng có quan hệ sẽ tự
động di chuyển đến dòng tương ứng với khóa quan hệ.
-Thiết lập MQH
+ Tạo MQH bền vững: Xét trong phần tạo CSDL
+ Tạo MQH tạm thời
Để tạo MQH tạm thời, bảng được quan hệ (bảng con) phải được
INDEX theo khóa quan hệ.
Lệnh: SET RELATION TO khóa INTO bí_danh
Trong đó: Khóa là khóa quan hệ ở bảng cha; Bí_danh để xác định
bảng con (được đặt quan hệ). Khóa quan hệ ở bảng con chính là biểu
thức đã dùng để index nó.
-Ví dụ: Hiển thị nội dung một bảng gồm các cột: số phiếu, ngaylập, tk
nợ, số tiền, tên tk nợ (lấy từ bảng dmtk, gồm các trường: sohieutk
C(10), tentk C(30), loạitk C(10))
USE phieutc IN 0
USE dmtk IN 0
SELECT dmtk
INDEX ON sohieutk TO vd.idx
SELECT phieutc
SET RELATION TO tkno INTO dmtk
LIST FIELDS sophieu, phieutc.ngaylap, tkno, sotien, dmtk.tentk
9-Các lệnh tổ chức cấu trúc chương trình
a-Lệnh IF
- tổ chức cấu trúc điều kiện – rẽ nhánh)
-Dạng:
IF bt_logic
Các_lệnh_1
[ELSE
Các_lệnh_2]
ENDIF
-Ví dụ: Kiểm tra delta khi giải ptb2
IF delta <0
? “Phương trình ứ có nghiệm”
WAIT “Ấn phím bất kì để tiếp tục”
ELSE
? “x1 =”, (-b-sqrt(delta))/(2*a)
? “x2 =”, (-b+sqrt(delta))/(2*a)
Wait “Press any key to continue …”
ENDIF
b-Lệnh DO CASE (xử lí trường hợp)
Đọc giáo trình
c-Lệnh FOR
-Dùng: tổ chức chu trình có số lần lặp biết trước
- Dạng:
FOR biến = bt1 TO bt2 [STEP bt3]
Các lệnh trong thân chu trình
ENDFOR
-Vdụ: Chương trình tính n!
INPUT “Vào số nguyên n=?” TO n
p=1
FOR i=1 TO n STEP 1
p= p*i
ENDFOR
? n, “!=”, p
d-Lệnh DO WHILE
-Để tổ chức 1 chu trình bất kì
- Dạng:
DO WHILE bt_logic
Thân _ chu _trình
ENDDO
Chú ý: Trong thân chu trình (của For và Do while), lệnh Break sẽ
thoát khỏi chu trình; Lệnh Continue bỏ qua các lệnh từ sau Cont đến
cuối chu trình.
e-Lệnh SCAN
-Để quét (duyệt) lần lượt từng bản ghi của tệp từ đầu đến cuối tệp.
-Dạng:
SCAN
Các lệnh
ENDSCAN
Tương tự chu trình sau:
GO TOP
DO WHILE .not.EOF()
Các lệnh
SKIP
ENDDO
10-Các lệnh SET (đọc giáo trình)
-Nội dung: SET để thiết lập lại môi trường làm việc. Sau khi khởi
động VFP, máy đã thiết lập một môi trường ngầm định (theo thói
quen của người Mỹ). Nếu không phù hợp với NSD thì thiết lập lại.
- Một số SET hay gặp:
 SET DATE TO american/FRENCH / ITALIAN
 SET CENTURY off/ ON &&hiển thị 2/4 chữ số năm
 SET SAFETY on/OFF && bật/tắt chế độ cảnh báo dl
 SET DEFAU LT TO [path] && đặt lại địa chỉ ngầm định
SET DEFA TO c:\TH
….
Chương 2: Bước đầu làm việc với quản trị CSDL
I. Khởi tạo dự án xây dựng phần mềm
1-Khởi tạo dự án
Mỗi bài toán xdựng phần mềm quản trị CSDL được gọi là một
Project (dự án). Để bắt đầu xây dựng (từ giao diện chính của VFP),
tạo tạo Project:
File > New > Project > New Project: Cửa sổ để đặt tên tệp Project
(.PJX)
Xuất hiện cửa sổ Project Manager để quản lí các thành phần cần
triển khai của dự án.
2- Các thành phần của Project
a- Data: phần dữ liệu của bài toán, gồm:
- DataBase (CSDL): các bảng và mối quan hệ giữa các bảng;
- Free Table: Các bảng tự do – không có quan hệ với bảng nào
khác (bảng thông tin cơ quan, bảng người dùng, …)
- Query (truy vấn): các bảng trung gian cấu thành từ các bảng
đã có trong CSDL
b- Documents (tài liệu do NSD tạo ra), gồm:
- Forms: mỗi form là một giao diện người-máy (cửa sổ).
Thường gồm các loại cửa sổ: Cửa sổ nhập, xem, sửa dữ liệu;
Cửa sổ truy vấn thông tin; Giao diện chính (giao diện xuất
hiện sau khi khởi động phần mềm).
- Reports (báo cáo): Là truy vấn để cung cấp thông tin cho
người sử dụng theo mẫu định trước.
- Class Libraries (Thư viện lớp): Nơi chứa các lớp do NSD tự
định nghĩa, nhằm dễ dàng nhơn khi lập trình.
c- Code (mã): Gồm các tệp chương trình do NSD viết, lưu thành
tệp .PRG (Program). Tệp PRG được chạy bằng lệnh
DO tên_tệp_prg
Chú ý: Trong các prg, phải chọn một tệp làm chương trình chính (là
tệp được tự động chạy đầu tiên khi khởi động phần mềm).
Trình tự chọn: Code > chọn prg > chuột phải > Set main
d- Other (khác):
- Menu: Là hệ thống bảng chọn công việc cần thực hiện, gồm
2 loại:
+ Menu: Gắn lên Form, luôn hiển thị cùng form khi form
được kích hoạt.
+ Shortcut (Thực đơn tắt): Gắn lên đối tượng, chỉ xuất hiện
khi kích chuột phải tại đối tượng.
- Other files: Thường gồm tệp hướng dẫn sử dụng, hướng
dẫn cài đặt, giới thiệu/quảng cáo, …
3-Trình tự triển khai Project
- Phải triển khai thông qua cửa sổ Project manager
- Trình tự triển khai các thành phần:
+ Tạo phần Data;
+ Tạo Form nhập, xem, sửa dữ liệu
(nguyên tắc: mỗi bảng đều phải có các form để nhập, xem,
sửa dữ liệu)
+ Tạo các Report
(tạo mẫu report, tạo form để chạy report)
+ Ngoài ra, còn có các form để truy vấn dữ liệu
+ Tạo FORM dùng làm giao diện chính
+ Tạo Menu
+ Gắn các menu lên Form
- Build: Dịch toàn bộ phần mềm ra ngôn ngữ máy
(thực hiện sau khi đã hoàn tất các thành phần của Project)
Dịch xong, có tệp cùng tên với .PJX, mở rộng là: .EXE
Chú ý: Có thể chạy ngay từng thành phần trong quá trình xây
dựng (giúp cho việc test thuận lợi)
II.Triển khai phần DATA
1. Tạo CSDL
a- Tạo các bảng
b- Tạo mối quan hệ giữa các bảng
2. Tạo Free table
Chú ý: Khi tạo bảng, cần quan tâm đến 2 trang (trên cửa sổ Designer
Table): Fields và Index
- Trang Fields để thiết kế bảng: Những trường nào sử dụng
là khóa quan thì buộc phải Index.
- Trang Index: Mỗi khóa đã định nghĩa ở trang Fields (chọn
Index) là một thẻ sắp xếp (Tag) có tên ngầm định trùng tên
trường (không nên đặt lại). Mỗi khóa thuộc 1 trong 3 loại:
+ Khóa Primery (khóa chính): Mỗi bảng chỉ có thể có đúng
1 khóa chính, với đặc trưng: Không có hơn 1 giá trị trùng
nhau trên trường đó; Trong quan hệ, khóa chính đặc trưng
cho phía 1 trong MQH.
+ Khóa Candidate (dự tuyển ~ khóa ngoại): Tương tự như
khóa chính, nhưng, mỗi bảng có thể có nhiều khóa ngoại.
+ Khóa Regular (khóa thường): Khóa có thể xuất hiện
nhiều lần giá trị trên 1 cột.

3.Sử dụng Index trong CSDL


a-Mở các bảng trong CSDL
Nguyên tắc: Mở CSDL rồi mới mở bảng trong CSDL, mẫu:
OPEN DATABASE tên_csdl
USE bảng_1 IN 0 [Alias bí_danh]
USE bảng_2 …
….
b-Sử dụng Index trong các bảng
Khi thiết kế, đã đánh dấu các trường được index (tăng/giảm dần).
Để sử dụng index trong 1 bảng:
SELECT bảng
SET ORDER TO [tên_tag]
Trong đó tag – thẻ index đã xác định khi thiết kế CSDL
Ví dụ: In các phiếu chi trong phieutc.dbf xếp theo số phiếu:
OPEN DATABASE ketoan
USE phieutc IN 0
USE dmtk IN 0
SELECT phieutc
SET ORDER TO sophieu
LIST TO PRINTER FOR …
Chú ý: Khi mới mở tệp, chưa thẻ index nào có hiệu lực. Khi đã set
order to tên_tag, muốn không sử dụng index đó nữa thì viết SET
ORDER TO
Chương 3: Làm quen với đối tượng và lớp trong VFP
I-Giới thiệu chung về đối tượng và lớp trong VFP
1-Khái niệm về đối tượng và lớp
-Đối tượng (Object): được coi là “thực thể tư duy” trong lập trình
hướng đối tượng để thực hiện một công việc (trong lập trình cấu trúc,
tương ứng với 1 hàm hoặc thủ tục). Mỗi đối tượng được xác định (định
nghĩa – define) thông qua tập hợp thuộc tính của đối tượng. Mỗi đối
tượng có thể tiếp nhận 1 tập hữu hạn các tác động lên nó – gọi là sự
kiện. Sự phản ứng lại của đối tượng đối với 1 sự kiện xảy ra gọi là
phương thức của sử kiện. Phương thức được đàm bảo bằng 1 tập lệnh
do NSD viết – gọi là mã phương thức (Code).
Vd: Một nút lệnh (Command Button), Combo, …là các đối tượng, có
thể nhận các sự kiện (click, dbclick – kích đúp chuột, rightClick,
keypress, …) khi đó máy làm gì là do tập lệnh của mã sự kiện được
viết.
Vậy: Lập trình hướng đối tượng, bản chất gồm 2 việc: Chọn đối tượng
và viết mã sự kiện (mã sự kiện là lập trình cấu trúc)
-Lớp (Class):
2-Các đối tượng và lớp trong VFP
MS đã định nghĩa sẵn choi NSD tập các đối tượng thuộc lớp cơ bản,
chi thành 2 nhóm:
- Các đt thuộc lớp chứa (lưu trữ): Các đt có thể các đối tượng
khác trên nó. Vd: Form, Command Group, Grid, Page
Frame, …
- Các đt thuộc lớp điều khiển (cấp nhỏ nhất): không thể chứa
các đ khác. Vd: Text Box, Combo Box, Spinner, …
3-Truy nhập đến đối tượng
Truy nhập theo nguyên tắc quan hệ: Đt_chứa.đối_tượng
Rong truy nhập đối tượng, cho phép sử dụng các từ khóa sau:
Parent: Đối tượng thuộc lớp cha
This : Chính đối tượng đó
ThisForm : Chính Form hiện tại – đang làm việc
4-Xác định thuộc tính cho đối tượng
MS gán ngầm định giá trị các thuộc tính cho mỗi đối tượng, khi không
phù hợp với người dùng thì định nghĩa lại. Có thể xác định lại giá trị
thuộc tính của đối tượng trong 2 ngữ cảnh:
- Khi định nghĩa đối tượng trực quan: Gán lại giá trị thuộc
tính trực quan trên cửa sổ Properties; Kích hoạt: Chọn đối
tượng > chuột phải > Properties.
- Khi viết trình, muốn thay đổi lại giá trị thuộc tính:
Đtượng_chứa.đổi_tượng.Thuộc_tính = Giá_trị
Vd: ThisForm.Text1.Value = “123456”
5-Gọi phương thức
Đt_chứa.Đtượng.Phương_thức
Vd: ThisForm.Comm1.Click
II. Thuộc tính, Phương thức và sự kiện trong VFP
1-Thuộc tính
a- Form là đt thuộc lớp chứa dùng để sinh ra 1 cửa sổ - giao diện
người-máy.
Thuộc tính cần quan tâm:
- Name
- Caption là tiêu đề của cửa sổ
- ShowWindow cho phép/không hiển thị một số thông tin
- BackColour
- Picture

b-Label: thuộc lớp đk để hiển thị các thông báo cho người dùng
Thuộc tính:
- Name
- Caption: Xâu văn bản hiển thị để thông báo.

c-Text Box: thuộc lớp điều khiển, dùng để nhận dữ liệu do NSD nhập
vào. Ngầm định có kiểu Character, muốn chọn kiểu khác: Kích chuột
phải > Builder > kiểu (N/D/L)
Các thuộc tính:
- Name
- Value : Giá trị mà đt nhận
d-Edit box (tương tự như text box, dùng để sửa dữ liệu trong các
trường)
e-Combo box: Thuộc lớp điều khiển để chọn 1 giá trị trong 1 chuỗi giá
trị cho trước. Các thuộc tính:
- Name
- Value: Giá trị sau khi đã lựa chọn
- ListIndex: Số thứ tự của dòng lựa chọn
Để đưa các giá trị lựa chọn vào combo thông qua các thuộc tính:
+ Với giá trị lựa chọn là tập cố định:
Viết lệnh trong sự kiện Init (định nghĩa đối tượng) của combo:
This.RowSourceType = 1 && loại nguồn của dòng chọn là 1 (cố định)
This.RowSource = “Nam, Nữ, Gay, Les”
This.Refresh

+ Với giá trị lựa chọn là cột (trường) trong bảng dữ liệu:
Viết lệnh trong sự kiện Init (định nghĩa đối tượng) của combo:
SELECT vùng/Bí_danh
This.RowSourceType = 2 && loại nguồn của dòng chọn là 1 (cố định)
This.ColumnCount = Số_cột
This.RowSource = “ds_trường”
This.Refresh

f-List Box Tương tự combo


g-Command Button
Là đt thuộc lớp điều khiển thường dùng để thực hiện một/ một dãy
lệnh thông qua sự kiện Click.
Các thuộc tính:
- Name
- Caption (dãy văn bản hiển thị trên nút lệnh)
- Picture (hình ảnh hiện thi trên nút lệnh)
- ToolTipText: Dãy thông tin được hiện thị khi đưa trỏ lên
đối tượng (Thuộc tính ShowWindow =.T.)
h-Command Group
Là đt thuộc lớp chứa, chứa nhiều nút lệnh. Muốn vào đt thuộc
lớp bên trong thì kích chuột phải > Edit
Các thuộc tính:
- Name
- ButtonCount: Số nút trong nhóm
i-Check Box (hộp kiểm tra)
Đt thuộc lớp điều khiển để xác định có được chọn hay không
chọn. Các thuộc tính:
- Name
- Value = .T. nếu chọn/ .F. nếu không chọn (1/0)
j-Spinner (bộ tăng/giảm)

thuộc lớp điều khiển để nhận một giá trị số qua việc tăng giảm.

Thuộc tính:

- Name
- Value: Giá trị mà Spinner nhận
k-Grid (ô lưới)

Thuộc lớp lưu trữ, dũng để hiển thị, sửa chữa dữ liệu giống
như một bảng Browse

Đọc giáo trình cách sử dụng Grid để nhập dữ liệu vào bảng.

AllowAddnew =T/F (thêm dòng mới vào bảng?)

ColumnCount = số cột

l-Page Frame

m- Image
n- OLE

(đọc giáo trình)

2-Sự kiện và phương thức

Sự kiện (của đối tượng) là các tác động lên đối tượng bởi người
hay máy tính (Click, Init, Load, …); Sự phản ứng lại của đt đối với sự
kiện – phương thức(gắn liền với sự kiện). Mỗi phương thức là một tập
lệnh được viết trong mã phương thức. Các sự kiện thường dùng:

a- Sự kiện Activate
-Là sự kiện kích hoạt đối tượng (cho đối tượng hiển thị)
- Cú pháp gọi: Đt_chứa.Đối_tượng. Activate
b- Sự kiện Deactivate
-Là sự kiện hủy bỏ kích hoạt đối tượng
- Cú pháp gọi: Đt_chứa.Đối_tượng. Deactivate

c-Sự kiện Click

-Là sự kiện kích chuột vào đối tượng


- Cú pháp gọi: Đt_chứa.Đối_tượng. Click

d-Sự kiện DbClick

-Là sự kiện kích đúp chuột vào đối tượng


- Cú pháp gọi: Đt_chứa.Đối_tượng. DbClick

e-Sự kiện Destroy

-Là sự kiện giải phóng đối tượng khỏi bộ nhớ


- Cú pháp gọi: Đt_chứa.Đối_tượng. Destroy

f-Sự kiện Init

-Là sự kiện định nghĩa đối tượng  Gán giá trị các thuộc tính của
đtượng.

- Cú pháp gọi: Đt_chứa.Đối_tượng. Init

g-Sự kiện Load


-Là sự kiện tải đối tượng vào bộ nhớ, được thực hiện trước Init.
- Cú pháp gọi: Đt_chứa.Đối_tượng. Load

h-Sự kiện SetFocus

-Là sự kiện đặt quan tâm (tâm điểm) vào đối tượng.
- Cú pháp gọi: Đt_chứa.Đối_tượng. SetFocus

i-Sự kiện GosFocus

-Là sự kiện chuyển tâm điểm đến đối tượng bằng Click/
KeyPress/bấm TAB.
- Cú pháp gọi: Đt_chứa.Đối_tượng. GosForcus

k-Sự kiện KeyPress

-Là sự kiện bấm phím tại đối tượng.


- Cú pháp gọi: Đt_chứa.Đối_tượng.KeyPress

l-Sự kiện Show

-Là sự kiện hiển thị đối tượng.


- Cú pháp gọi: Đt_chứa.Đối_tượng.Show
3- Lập trình hướng sự kiện
Trong lập trình hướng đối tượng, lập trình chính là viết viết mã sự
kiện của mỗi sự kiện đối với các đối tượng. Để viết viết mã sự kiện,
thực hiện theo trình tự:
- Chọn đối tượng;
- Kích chuột phải, chọn Code;
- Chọn sự kiện cần viết (Load, Init, Click, …)
- Viết mã sự kiện
- Bấm ^W để ghi lại
 Quá trình này, với bản chất: Lập trình hướng sự kiện.

4-Một số lệnh phương thức


(đọc giáo trình), chỉ giới thiệu 2 lệnh:
- Lệnh Release: Để nhả đối tượng và thoát khỏi nó
Vd: ThisForm.Release
- Refresh: Làm tươi lại dữ liệu
Vd: ThisForm.Refresh
Chương 4: THIẾT KẾ GIAO DIỆN TRONG QUẢN TRỊ
CSDL BẰNG VFP
I. Phân loại giao diện và nguyên tắc thiết kế giao diện

1-Phân loại giao diện

Giao diện là mặt giao tiếp giữa người và máy (người cung cấp
thông tin cho máy và ngược lại). Mỗi giao diện là một cửa sổ được tạo
ra bởi một Form hoặc một đối tượng chứa khác. Trên giác độ mục
tiêu, giao diện chia thành 3 loại:

a- Giao diện chính: Là gd xuất hiện ngay sau khi khởi động phần
mềm, thường gồm các thành phần chủ yếu:
- Thanh thực đơn (menu bar): Chứa hệ thống thực đơn được
tổ chức phân cấp để lựa chọn các công việc mà phần mềm
có thể thực hiện;
- Thanh công cụ (Tool bar): Gồm các nút lệnh để thực hiện
các thao tác thường gặp nhất.
- Thanh trạng thái (không nhất thiết có): hiển thị thông tin về
một số trạng thái đang làm việc của máy.
b- Giao diện nhập dữ liệu: Là ghiao diện để thực hiện việc nhập,
xem, sửa dữ liệu trong các bảng dữ liệu.
Thông thường, mỗi bảng cần ít nhất 1 cửa sổ để
nhập+xem+sửa.
c- Giao diện truy vấn dữ liệu: Là cửa sổ để người sử dụng lựa
chọn các dữ liệu được kết xuất (đưa ra)

2-Các nguyên tắc thiết kế giao diện

(Đọc giáo trình)

- Nguyên tắc phân cấp;


- Nguyên tắc vét cạn;
- Nguyên tắc thân thiện (hình thức, nội dung)
II.Thiết kế giao diện nhập dữ liệu

Bản chất: Tạo ra cửa sổ để nhập, xem, sửa dữ liệu trong các bảng.
1-Thiết kế bằng công cụ Form Wizard

Bản chất: Là sử dụng các Form được MS tạo sẵn rồi sửa lại cho phù
hợp với bài toán

Cách thực hiện: Đọc giáo trình.

2-Thiết kế bằng công cụ Form Designer

-Trình tự: Từ cửa sổ Project Manager > Documents > Form > New
Form. Sẽ xuất hiện Form rỗng và mới để thiết kế hiao diện.

- Các đối tượng cần thiết cần đặt trên Form để nhập liệu, gồm:

+ Các Label: Để thông báo cho người nhập liệu (nội dung thuộc tính
Caption)

+ Các đối tượng có thể nhập thông tin người nhập vào: Text Box,
Combo box , Check Box, Option Group, Spinner, …

+ Các nút lệnh: Để điều khiển quá trình nhập liệu, chẳng hạn: Nhập
tiếp dữ liệu, Ghi dữ liệu vào tệp, Thoát khỏi việc nhập, …

-Tạo Form xong: ^W để ghi lại thành tệp .FRT

- Chạy Form:

+ Nếu chạy trực tiếp để thử khi lập trình: Chọn Form > Chọn RUN

+ Nếu viết lệnh trong chương trình:

DO FORM tên_tệp_Form [WITH ds_tham_số]

-Ví dụ: Tạo Form để nhập các phiếu thu và phiếu chi vào tệp
PhieuTC.dbf trong CSDL.
Chú ý: Phải viết code cho 4 sự kiện (ít nhất):

+ Load của Form

+ Click của 3 nút lệnh


Nút Ghi:

SELECT phieutc
*** co the dung lenh INSERT INTO (Thieu)
APPEND BLANK && Tao ban ghi trong cuoi bang
REPLACE sophieu WITH ThisForm.text1.Value, ngaylap
WITH ThisForm.text2.Value
REPLACE tkno WITH ThisForm.text3.Value, tkco WITH;
ThisForm.text4.Value, nd WITH ;
ThisForm.text5.Value, sotien WITH;
ThisForm.text6.Value, nguyente WITH;
ThisForm.text7.Value

Nút “Nhập tiếp”


ThisForm.text1.Value = ''
ThisForm.text2.Value = DATE()
ThisForm.text3.Value = ''
ThisForm.text4.Value = ''
ThisForm.text5.Value = ''
ThisForm.text6.Value = 0
ThisForm.text7.Value = 0
ThisForm.Text1.Setfocus

ThisForm.Refresh

Bài tập: Thiết kế giao diện nhập liệu (các phiếu nhập kho và xuất kho)
vào tệp “Phieuvt.dbf”

Yêu cầu: Tạo Form và viết các code cần thiết, Copy ra bản Word (như
thầy đã làm ở trên), gửi cho thầy vào: AnhvbHvtc@Gmail.com

(Làm bài kiểm tra định kì)

III.Thiết kế giao diện chính

1- Thiết kế Form
Yêu cầu:
- Thuộc tính: ShowWindow = 2 (As top level Form)
- Trong sự kiện Init: dấu cửa sổ của ứng dụng
Application.Visible = .F.
- Trong sự kiện Destroy:
Application.Visible = .T.
2- Thiết kế menu
a-Tạo thực đơn: Tạo trực quan từ cửa sổ PM. >Other >Menu:
- Lựa chọn Menu: Tạo thực đơn để gắn lên Form
- Lựa chọn Shotcut: Thực đơn tắt để gắn lên đối tượng
(chỉ hiển thị khi kích chuột phải)

Chú ý: Thực đơn được thiết kế kiểu phân cấp, từ Menu Bar >
Sub menu > … > Lệnh (Command) hoặc thủ tục
(Procedure)

b- Thực hành tạo menu


c- Gắn thực đơn lên Form
- ĐK: Tệp menu nguồn (do ta tạo) được ghi thành tệp .MNX,
muốn gắn lên Form, phải dịch .MNX thành tệp .MPR
- Trình tự dịch: Chọn thực đơnMenu > Gennerate
- Viết lệnh: Trong sự kiện Init của Form, viết lệnh:
DO tên_tệp.MPR WITH This, .T.
Chương 5: Tạo báo cáo trong quản trị CSDL
I-Khái niệm, phân loại và các thành phần của báo cáo
1-Khái niệm: Báo cáo (report) là vật mang tin để chứa thông
tin đầu ra của phần mềm để cung cấp thông tin cho người
sử dụng. Báo thường dùng dạng in ra giấy theo một khuôn
mẫu cho trước.
Ví dụ: Báo cáo kế toán

Cty XXX BÁO CÁO CHI TIỀN MẶT


Từ ngày …x đến ngày … y

STT Số CT Ngày Nội TK nợ Số tiền Nguyên tệ


lập dung
1
2
……
TỔNG CỘNG ***** *****
Người lập biểu Kế toán trưởng Giám đốc
2-Phân loại báo cáo
(Giáo trình)
3- Các thành phần của báo cáo
a- Về cấu trúc, mỗi báo cáo gồm 3 phần:
- Phần Page Header: Hiển thị ở đầu trrang báo cáo;
- Phần Detail: Phần chi tiết hiển thị nội dung báo cáo;
- Phần Page Footer: Hiển thị ở cuối trang báo cáo.
Phần chi tiết của báo cáo gồm 2 nội dung:
+ Dòng dữ liệu lấy từ các bảng trong CSDL;
+ Các thông tin tổng quan.
b- Về nội dung của các yếu tố cấu thành, báo cáo gồm:
- Các Label: giá trị cố định (hằng) để giải thích nội dung
thông tin;
- Các biến để nhận các giá trị dữ liệu khác nhau, gồm 2 loại:
+ Fields: Các trường trong các bảng của CSDL;
+ Variables: Biến trung gian (không trùng tên trường), gồm
2 loại:
 Các biến do người sử dụng nhập giá trị vào (x, y);
 Các biến được quản lí bởi report – gọi là biến report
(biến ghi số thứ tự - biến report có kiểu tính toán
Calculater type là Count).
- Các đường kẻ, hình ảnh
II-Tạo report
1-Thiết kế report
Nguyên tắc: Sử dụng các đối tượng hợp lí để thiết kế report theo đùng
khuôn dạng và nội dung. Bao hàm việc các đối tượng (Label, Fields,
Line, …) và đặt ở vị trí thích hợp.
Thiết kế xong, ghi lại (^W) thành tệp .FRX
Trình tự: Từ cửa sổ PM > Documentss > Report > New > New report.
Khi đó, sẽ xuất hiện cửa sổ Report Designer để thiết kế.
2-Chạy report
Tạo Form chạy report, thường gồm các thành phần:
- Các Label để giải thích;
- Các đối tượng có khả năng tiếp nhận thông tin (để NSD
nhập)
- Các nút lệnh để điều khiển việc thực hiện
Lệnh để chạy Report:
REPORT FORM tên_tệp_frx PREVIEW / TO PRINTER
[PROMPT]
Trong đó:
Preview: Hiển thị cho xem trước khi in;
To printer: In ra giấy, nếu có PROMPT hiển thị cửa sổ
Printer để NSD lựa chọn.
Chú ý: Thông thường, trên Form sẽ mở CSDL và các bảng cần thiết
tại sự kiện Load; Trong các nút lệnh, phải có nút để quyết định in, sự
kiện Click thường có các các thủ tục:
- Chọn bảng dữ liệu
- Lọc dữ liệu để đưa ra report, bằng cách:
+ Cách 1: Nếu có lệnh Index, lọc dữ liệu qua điều kiện của
mệnh đề For của Index;
+ Cách 2: Sử dụng lệnh lọc dữ liệu
SET FILTER TO [bt_logic]
(bt_logic nếu có thì đặt lọc, không có thì bỏ đặt lọc)
- REPORT FORM tên_frx PREVIEW
III- Ví dụ điển hình
1- Tạo report với dữ liệu trong phần detail lấy từ 1 bảng
Yêu cầu: Tạo báo cáo chi ở trên
Chú ý:
-Những thông tin lấy trường dl : Chọn trường tương ứng;
-Các biến không lấy từ bảng dữ liệu, gọi là biến report, gồm 2 loại:
+ Biến report (stt): chọn kiểu tính toán là Count / Sum / Average
(thực hiện: Thực đơn Report > Variables: Add biến, định nghĩa biến:
khởi tạo giá trị ban đầu, chọn kiểu Calculation type
+ Các biến bộ nhớ không phải biến report được sử bình thường.
-Phần đầu biểu:
+ Nếu đặt ở phần Page Header: Nó sẽ xuất hiện tên mọi trang báo cáo;
+ Nếu muốn chỉ hiển thị đầu biểu ở trang đầu tiên (không hiện ở các
trang sau) thì phải đặt trong phần “Title Band” – luôn ở đầu phần
Detail. Những thông tin muốn hiển thị ở ngay sau Detail thì phải đặt ở
phần Summrry Band.
Trình tự: thực đơn Report > Optional Band: Có thể tích vào Title
band và Summary Band.
Code sự kiện Click của nút “Xem trước”:
x= ThisForm.text1.Value
y= ThisForm.Text2.value
SELECT phieutc
SET FILTER TO ngaylap>=x AND ngaylap<= y AND
LEFT(tkco,3)='111'
SUM sotien, nguyente TO _sotien, _nguyente
REPORT FORM bcchi PREVIEW
Code sự kiện LOAD của Form:
SET date TO FRENCH
SET CENTURY ON
SET TALK OFF
CLOSE ALL
OPEN DATABASE ketoan
USE phieutc IN 0
USE dmtk IN 0
2-Report với dữ liệu trong phần Detail lấy từ 2 bảng có quan
hệ tạm thời.
Nguyên tắc: Mở 2 bảng > Thiết lập quan hệ giữa 2 bảng bằng
SET RELATION
Chọn 1 bảng làm việc, muốn tham chiếu đến dữ liệu ở bảng
kia, phải viết: bí_danh.tên_trường
Ví dụ: Tương tự ví dụ trong phần 1, nhưng, thêm cột “Tên TK
nợ” (lấy từ bảng dmtk.dbf).
- Thiết kế report: Thêm cột “Tên tài khoản”, nội
dung: phieutc.tentk
- Code của sự kiện Click nút “Xem trước”:

x= ThisForm.text1.Value
y= ThisForm.Text2.value
SELECT dmtk
INDEX ON sohieutk TO p.idx
SELECT phieutc
SET FILTER TO ngaylap>=x AND ngaylap<=
y AND LEFT(tkco,3)='111'
SUM sotien, nguyente TO _sotien,
_nguyente
SET RELATION TO tkno INTO dmtk
REPORT FORM bcchi PREVIEW

3-Tạo Report với dữ liệu trong phần Detail chưa có sẵn trong
bảng dữ liệu.
Ví dụ: Lập báo cáo tổng hợp nợ phải thu của khách hàng,
dạng (chú ý: chỉ xét đối tượng tiền mặt).
BÁO CÁO NỢ PHẢI THU CỦA KHÁCH HÀNG
Từ ngày: x đến ngày y

Tên KH Mã Dư đầu Tăng Giảm Số còn


ST KH kì trong trong lại
T kì kì
1
2

TỔNG CỘNG (x) (x) (x) (x)

Về nguyên tắc: Phải tạo bảng trung gian để tập hợp dữ liệu
cho báo cáo. Bảng trung gian phải đủ số trường tương ứng với
số cột trong báo cáo.
(1) Về dữ liệu: Cần các bảng sau:
- Bảng danh mục khách hàng (Dmkh.dbd), cấu trúc:
(Tenkh C(50), Makh C(10), diachi C(60))
- Bảng số dư đầu kì (Dudk.dbf) chứa số dư từng
khách, cấu trúc:
(Makh C(10), duno N(15,1), duco N(15,1))
- Bảng phiếu thu chi (Phieutc.dbf), cấu trúc như bài
giảng.
Code sự kiện Click của nút “In báo cáo” viết như sau:
x=ThisForm.Text1.Value
y=ThisForm.text2.value
OPEN DATABASE ketoan
USE Phieutc IN 0
USE dmkh IN 0
USE dudk IN 0
CREATE TABLE trunggian (tenkh C(50), Makh C(10), Dudk
N(15,1), tang N(16,1), giam N(16,1), Duck N(16,1))
*** Bảng mới tạo đang được mở
SELECT trunggian
APPEND FROM dmkh
SELECT dudk
INDEX ON makh TO 1.idx
SELECT trunggian
SET RELATION TO makh INTO dudk
REPLACE ALL dudk WITH IIF(dudk.duno>0, duno, - duco)
*** Tính tổng nhóm theo Makh xác định số tăng của từng KH
SELECT phieutc
INDEX ON substr(tkno,4,3) TO 2.idx FOR ngaylap>=x AND
ngaylap<=y AND left(tkno,3)=’131'
TOTAL ON substr(tkno,4,3) TO tongtang
USE tongtang IN 0
SELECT tongtang
INDEX ON substr(tkno,4,3) TO 3.idx
SELECT trunggian
SET RELATION TO makh INTO tongtang
REPLACE ALL tang WITH tongtang.sotien
*** Tính tổng nhóm theo Makh xác định số giảm của từng KH
SELECT phieutc
INDEX ON substr(tkco,4,3) TO 4.idx FOR ngaylap>=x AND
ngaylap<=y AND left(tkco,3)=’131'
TOTAL ON substr(tkco,4,3) TO tonggiam
USE tonggiam IN 0
SELECT tonggiam
INDEX ON substr(tkco,4,3) TO 5.idx
SELECT trunggian
SET RELATION TO makh INTO tonggiam
REPLACE ALL giam WITH tonggiam.sotien
*** Xác định số nợ còn lại của KH
SELECT trunggian && Có thể không viết
REPLACE ALL duck WITH dudk + tang – giam
*** Xóa danh sách KH không nợ
SELECT trunggian
DELETE ALL FOR dudk =0 AND tang = 0 AND giam = 0
PACK
REORT FORM bcnopt PREVIEW
------------
Vẫn trong tệp này, các bài toán sau là tương tự:
- Lập báo cáo tổng hợp về tạm ứng của CNV;
- Lập báo cáo tổng hợp về trả nợ nhà CC
Bài tập: 1- Tìm hiểu mẫu một sổ kế toán (Sổ cái tài khoản
111), thiết kế report để in sổ cái tk 111.
2- Tìm hiểu mẫu sổ chi tiết vật tư, thiết kế report ínổ chi tiết
đó.
3- Lập báo cáo tổng hợp vật tư “Nhập – Xuất – Tồn”
(mẫu: Nhà nước ban hành – tra mạng)

Thiết kế report: Trường hợp 1 (đl lấy từ 1 bảng – trung


gian)
Chương 6: Liên kết dữ liệu với các ứng dụng khác
1- Nhập dữ liệu:
Lấy dữ liệu từ ứng dụng khác đưa vào VFP (Lấy từ bảng
tính Excel)
2- Xuất thông tin:
Xuất dữ liệu từ DBF ra ứng dụng khác (Excel)
(Đọc giáo trình)
Chương 7: Thiết kế phần mềm
(Đọc giáo trình)
Trình tự chạy phần mềm:
Bắt đầu: Chạy tệp chương trình chính (được set main) > Hiển
thị giao diện chính > Vào chức năng chi tiết thể hiện trên giao
diện chính thông qua Menu, nút lệnh: Chạy các Form giao
diện để thực hiện từng chức năng: Nhập liệu, xem – sửa dữ
liệu, lập báo cáo, lập sổ sách, …
Chương trình chính thường có cấu trúc:
*** Các lệnh để thiết lập lại môi trường
SET DATE TO french / Italian
SET CENTURY ON
SET TALK off
SET DEFAULT TO đường_dẫn && địa chỉ ngầm định
*** Có thể thêm nhiều SET khác
*** chạy form đăng nhập
DO FORM tên_form
** Form đăng nhập có tối thiểu các đối tượng: User nam (text
box), PassWord (text box), Nút lệnh “Đăng nhập” có mã skiện
Click:
T1=Thisform.text1.value
T2= Thisform.text2.value
USE nguoidung
LOCATE FOR tennd=t1 .and. matkhau = t2
IF Found()
DO FORM gd_chinh && chạy form giao diện chính
READ EVENTS
ELSE
Massagebox(“Bố ở đâu vào trộm à?”)
QUIT
ENDIF

Chú ý: Giao diện chính của PM luôn được chạy từ tệp chương
trình chính.

You might also like