Chương 7 Lập trình trong Visual Foxpro
Chƣơng 7
LẬP TRÌNH TRONG VISUAL FOXPRO
7.1. Giới thiệu về lập trình
Trong Visual FoxPro, lập trình thủ tục (lập trình cấu trúc) và phƣơng pháp lập
trình hƣớng đối tƣợng làm việc chung với nhau, vì thế ta có thể tạo các ứng dụng một
cách mềm dẻo. Lập trình thủ tục là viết một dãy các lệnh liên tiếp với nhau để thực
hiện một nhiệm vụ nào đó.
Thơng thƣờng bất cứ nhiệm vụ nào làm bằng chƣơng trình đều có thể làm bằng
hội thoại hoặc sử dụng cơng cụ nếu có thời gian.
7.1.1. Các kỹ thuật lập trình trong Visual FoxPro
Ta có thể viết chƣơng trình trong Visual FoxPro bằng cách viết các câu lệnh
trong:
- Cửa sổ lệnh
- Trong một file chƣơng trình
- Trong các cửa sổ tình huống (Sự kiện- Event) hay phƣơng thức (Method) của
Form Designer,....
- Trong các cửa sổ thủ tục của Form Designer, ....
1) Sử dụng cửa sổ lệnh
Ta có thể thực hiện các câu lệnh bằng cách gõ chúng vào cửa sổ lệnh rồi ấn
phím Enter. Để thực hiện lại các câu lệnh này ta di chuyển con trỏ đến dòng chứa câu
lệnh đó rồi ấn phím Enter. Ta cũng có thể cho thực hiện nhiều dòng lệnh một lúc bằng
cách sau:
- Chọn các dịng lệnh cần thi hành.
- Ấn phím Enter.
Việc thi hành lệnh trên cửa sổ lệnh có ƣu điểm là không lƣu các lệnh cần thực
hiện vào một file chƣơng trình mà vẫn thực hiện đƣợc các lệnh đó.
111
Chương 7 Lập trình trong Visual Foxpro
2) Các bước tạo một file chương trình
a) Một file chƣơng trình Visual FoxPro là một file văn bản chứa dãy các câu
lệnh có phần mở rộng là PRG. Để tạo một file chƣơng trình ta thực hiện một trong các
cách sau:
Trong cửa sổ Project Manager, chọn trang Code, sau đó chọn mục Program
rồi chọn nút New.
Trong cửa sổ lệnh gõ vào lệnh Modify Command <Tên chƣơng trình>
b) Mẫu một File chƣơng trình
Phần giới thiệu: Tên chƣơng trình, ngày viết, tác giả .... . Trƣớc mỗi dịng
của phần này đều có dấu *
Phần thiết lập môi trƣờng nhờ các lệnh SET
Phần nhập dữ liệu: Khởi tạo các hằng, biến. Nhập dữ liệu cho các biến nhớ,
mở các CSDL
Phần tính tốn: Thực hiện các nhiệm vụ của chƣơng trình.
Phần in kết quả tính tốn
Phần kết thúc: Đóng các bảng CSDL, trả về mơi trƣờng làm việc cũ
Ví dụ: Chƣơng trình sau tìm và in ra họ tên, ngày sinh và năm làm việc của một nhân
viên trong bảng nhanvien.dbf có mã nhân viên nhập từ bàn phím.
set talk off
set date to french
set default to c:\dulieu
clear
close all
use nhanvien
accept 'nhap ma nhan vien:' to bma
locate for MANV =bma
if found()
? 'Ho va ten:' , hoten
? ' ngay sinh:', ngaysinh
?'nam lam viec:', namlv
112
Chương 7 Lập trình trong Visual Foxpro
else
?'khong phai la nhan vien cua cong ty'
endif
Close All
set talk on
7.1.2. Lƣu file chƣơng trình
Sau khi tạo xong một file chƣơng trình để lƣu chƣơng trình lên đĩa ta chọn
Menu File/ Chọn Save.
Nếu tạo file chƣơng trình trong cửa sổ Project Manager, chƣơng trình này sẽ
đƣợc đƣa vào đề án (Project).
7.1.3. Sửa chƣơng trình
Để sửa một chƣơng trình đã có ta thực hiện một trong các cách sau:
- Trong cửa sổ Project Manager chọn trang Code/ chọn mục Program/ Chọn
chƣơng trình cần sửa/ Chọn nút Modify.
- Trong cửa sổ lệnh gõ vào lệnh Modify Command <Tên chƣơng trình>
7.1.4. Thực hiện chƣơng trình
Để thực thi một chƣơng trình, ta thực hiện theo các cách sau:
- Nếu chƣơng trình nằm trong một Project, chọn chƣơng trình trong Project
Manager , rồi chọn nút Run.
- Trong cửa sổ lệnh, gõ lệnh Do <Tên file chƣơng trình>. Có thể gõ do ? để
hiện lên danh sách các chƣơng trình (Nếu khơng nhớ chƣơng trình).
7.1.5. Ghi chú trong chƣơng trình
Trong khi soạn thảo một chƣơng trình, nên tập thói quen ghi chú cho từng câu
lệnh. Việc ghi chú giúp cho chƣơng trình dễ đọc, dễ hiểu, dễ bảo trì. Khi chạy chƣơng
trình máy bỏ qua phần ghi chú.
Để ghi chú trong chƣơng trình, ta sử dụng kí hiệu * hoặc && đặt trƣớc mỗi câu
ghi chú.
* Sử dụng cho câu ghi chú nằm trên một dòng.
&& Sử dụng cho câu ghi chú nằm cuối câu lệnh.
113
Chương 7 Lập trình trong Visual Foxpro
7.2. Chƣơng trình con
Chƣơng trình con là một chƣơng trình đƣợc một chƣơng trình khác gọi nó tại
một nơi nào đó trong thân chƣơng trình. Chƣơng trình gọi chƣơng trình con gọi là
chƣơng trình gọi. Chƣơng trình gọi có đi là .PRG đƣợc ngƣời sử dụng gọi nó tại cửa
sổ lệnh gọi là chƣơng trình chính.
Visual FoxPro có hai loại chƣơng trình con: thủ tục và hàm. Các tệp chƣơng trình
riêng lẻ trên đĩa cứng cũng coi nhƣ là một thủ tục. Thủ tục và hàm cho phép lƣu đoạn
chƣơng trình thƣờng đƣợc sử dụng trong một nơi và có thể gọi thi hành nó mọi nơi
trong ứng dụng . Điều này làm cho ứng dụng dễ dàng trong việc bảo trì vì nếu có sửa
đổi thì chỉ cần sửa đổi một nơi thay cho nhiều nơi.
7.2.1 Hàm tự tạo
Hàm tự tạo là một chƣơng trình do ngƣời dùng lập ra, nó nhằm trả về cho chƣơng
trình gọi nó một giá trị duy nhất thuộc một kiểu dữ liệu nào đó. Hàm tự tạo có cấu trúc
sau:
FUNCTION <Tên_Hàm>
[PARAMETER <Danh_sách_tham_số_hình_thức>]
<Dãy_lệnh>
RETURN [<biểu thức>]
Tên hàm bắt đầu bằng chữ cái, sau đó là chữ cái hoặc chữ số có thể thay chữ cái
hay chữ số bằng dấu gạch dƣới. Tên hàm không đƣợc trùng với tên các từ khoá.
Lời gọi hàm: ta gọi hàm theo mẫu
<Tên_hàm([danh_sách_tham_số_thực_sự])>
Và đặt lời gọi hàm vào trong các biểu thức.
Ví dụ:
Chƣơng trình sau có sử dụng hàm xét loại tốt nghiệp phổ thông dựa trên điểm
thi 4 môn:
Tổng số điểm 34 xếp loại giỏi;
34 >Tổng số điểm 28 xếp loại khá;
28 >Tổng số điểm 20 xếp loại trung bình;
cịn lại là trƣợt.
*Chƣơng trình chính
114
Chương 7 Lập trình trong Visual Foxpro
SET TALK OFF && bật chế độ lập trình
CLEAR
ACCEPT „Họ và tên: ‟ TO ht
INPUT „Điểm toán: ‟ TO t
INPUT „Điểm văn: ‟ TO v
INPUT „Điểm lý: ‟ TO l
INPUT „Điểm anh: ‟ TO a
? ht + „ tốt nghiệp loại: ‟ + loai(t,v,l,a)
WAIT „‟
SET TALK ON && bật chế độ đối thoại
* Phần trình bày chƣơng trình con
FUNCTION loai
PARA m1,m2,m3,m4
s = m1 + m2 + m3 + m4
DO CASE
CASE s >= 34
r = „Giỏi‟
CASE 28 <= s AND s < 34
r = „Khá‟
CASE 20 <= s AND s < 28
r = „Trung bình‟
OTHERWISE
r = „Trƣợt‟
ENDCASE
RETURN r
7.2.2. Thủ tục
Thủ tục là một chƣơng trình thực hiện một chức năng nào đó. Cấu trúc của thủ tục
có dạng:
PROCEDURE <Tên_thủ_tục>
[PARAMETER <danh_sách_các_tham_số_hình_thức>]
<Dãy_lệnh>
115
Chương 7 Lập trình trong Visual Foxpro
ENDPROCEDURE | RETURN
Lệnh gọi thủ tục: Ta gọi thủ tục theo mẫu
DO <Tên_thủ_tục> WITH <d.sách_tham_số_thực_sự> [IN <Tên_tệp>]
Danh sách các tham số thực sự phải tƣơng ứng với các tham số hình thức. Phần
IN <Tên_tệp> dùng để chỉ ra tệp chứa thủ tục cần gọi. Lời gọi thủ tục đƣợc sử dụng
nhƣ một câu lệnh. Visual FoxPro coi các tệp chƣơng trình nhƣ là các thủ tục.
Ví dụ:
Chƣơng trình sau có sử dụng thủ tục tính chu vi, diện tích và độ dài đƣờng
chéo của hình chữ nhật khi biết hai cạnh
SET TALK OFF
CLEAR
INPUT „Chiều dài: ‟ TO dai
INPUT „Chiều rộng: ‟ TO rong
STORE 0 TO p, s, c
DO chunhat WITH dai,rong,p,s,c
? „Chu vi: ‟, p , ‟Diện tích: ‟ , s , „Đƣờng chéo: ‟, c
WAIT „ ‟
set talk on
Procedure chunhat
PARA a,b,chuvi,dientich,duongcheo
chuvi = 2*(a+b)
dientich = a*b
duongcheo = sqrt(a*a + b*b)
RETURN
7.2.3 Cách tổ chức chƣơng trình con
1) Tổ chức thành các tệp chƣơng trình riêng biệt
Ta có thể viết các chƣơng trình con dƣới dạng các chƣơng trình (có đi
.PRG) và lƣu thành từng tệp riêng biệt trên đĩa. Giả sử trên đĩa có các tệp ct1.PRG,
ct21.PRG, ct22.PRG, ct221.PRG.
Trong chƣơng trình ct1.PRG có các lệnh:
DO CT21
116
Chương 7 Lập trình trong Visual Foxpro
DO CT22
Trong chƣơng trình ct22.PRG có lệnh:
DO CT221
Từ cửa sổ lệnh ta gõ lệnh:
DO CT1
Kết quả đồng thời tất cả 4 chƣơng trình này đều chạy. Khi đó CT1 gọi là
chƣơng trình con cấp một; CT21 và CT22 gọi là chƣơng trình con cấp hai; CT221 là
chƣơng trình con cấp ba. Visual Foxpro cho phép thi hành đến các chƣơng trình con
(thủ tục) cấp 32. Các chƣơng trình gọi ở cửa sổ lệnh có cấp 0 (chƣơng trình chính),
đây là cấp cao nhất.
Cách tổ chức trên có ƣu điểm là các chƣơng trình con có tính độc lập. Song có
nhƣợc điểm thời gian thực hiện chƣơng trình lâu vì máy phải đọc chƣơng trình trên đĩa
nhiều lần. Cách tổ chức này tiện lợi khi thử chƣơng trình. Sau khi chƣơng trình chạy
thơng, ta nên gộp các chƣơng trình con thành một tệp thủ tục.
2) Tổ chức các chƣơng trình con ngay trong chƣơng trình gọi
Nếu độ dài các chƣơng trình con khơng dài q, ta có thể tổ chức chúng thành
các hàm hay thủ tục và viết chúng vào cuối chƣơng trình gọi theo mẫu:
<Chƣơng trình gọi>
<Các lệnh của chƣơng trình gọi có chứa lời gọi chƣơng trình con>
<Kết thúc chƣơng trình gọi>
<Các chƣơng trình con>
3) Tổ chức thành tệp thủ tục
Các chƣơng trình con đƣợc viết trong một tệp chƣơng trình (ví dụ là
THUVIEN1.PRG, THUVIEN2.PRG,...).
Để sử dụng các thủ tục trong THUVIEN1.PRG (chẳng hạn thủ tục CT21), ở
đầu chƣơng trình CT1.PRG phải có các lệnh:
SET PROCEDURE TO THUVIEN1.PRG
<Dãy_lệnh>
DO CT21
<Dãy_lệnh>
SET PROCEDURE TO
&& đóng tệp thủ tục
117
Chương 7 Lập trình trong Visual Foxpro
Ta có thể khơng cần dùng tới lệnh SET PROCEDURE TO THUVIEN1.PRG mà
dùng lệnh sau:
DO <Tên_thủ_tục> [ WITH <d.sách_th.số_thực_sự>] IN THUVIEN1.PRG
Ví dụ: DO CT21 IN THUVIEN1.PRG
4) Tổ chức các chƣơng trình con trong các cửa sổ thủ tục, sự kiện, phƣơng thức,
trang code của project manager, ...
(sẽ giới thiệu ở phần sau)
7.3. Biến toàn cục, biến cục bộ
7.3.1. Biến toàn cục
Biến toàn cục đƣợc tạo ra ở khung cửa sổ lệnh hoặc đƣợc khai báo trong
chƣơng trình nào đó bằng lệnh:
PUBLIC <danh_sách_biến>
Biến này có thể sử dụng ở mọi nơi. Chúng chỉ mất đi khi gặp một trong các
lệnh sau: QUIT, CLEAR ALL, CLEAR MEMORY, RELEASE<danh_sách_biến>.
Theo ngầm định các biến trƣờng của CSDL đều là biến toàn cục.
7.3.2. Biến cục bộ
Biến cục bộ là biến chỉ có thể sử dụng trong chƣơng trình khai báo nó và trong
những chƣơng trình con mà chúng gọi thực hiện. Biến cục bộ là những biến đƣợc khai
báo trong phần khai báo tham số hình thức sau từ khố PARAMETER đầu chƣơng
trình con hoặc đƣợc tạo ra bởi các lệnh của Visual Foxpro chẳng hạn lệnh gán,
STORE hoặc các lệnh có mệnh đề TO <ds biến nhớ> trong các chƣơng trình. Biến cục
bộ tự động mất đi khi chƣơng trình con khai báo nó thực hiện xong hoặc gặp trong các
lệnh: QUIT, CLEAR ALL, CLEAR MEMORY, RELEASE <danh_sách_biến>.
7.3.3. Che các biến nhớ
Biến toàn cục và biến cục bộ có thể đƣợc che chắn bởi từ khố PRIVATE.
Cú pháp:
PRIVATE <danh_sách_biến_nhớ>
hay
PRIVATE ALL [LIKE <danh sách_biến nhớ> | EXCEPT
nhớ> ]
118
Chương 7 Lập trình trong Visual Foxpro
Khi đã che chắn một biến thì việc thay đổi các giá trị của biến ở chƣơng trình
cấp dƣới khơng làm thay đổi các giá trị vốn có của nó ở chƣơng trình cấp cao hơn.
Ví dụ:
SET TALK OFF
CLEAR
x = 11
y = 22
DO ctrcon
? „Lần 3: x = ‟,x,‟ y = ‟,y
WAIT „ ‟
***********************************
PROCEDURE ctrcon
? „Lần 1: x = ‟,x,‟ y = ‟,y
PRIVATE x,y
* Đến đây biến x,y không xác định
x = 33 && khai báo biến x mới và khởi đầu
y = 44
&& khai báo biến y mới và khởi đầu
? „Lần 2: x = ‟,x,‟ y = ‟,y
RETURN
Kết quả chạy chƣơng trình
Lần 1: x = 11
y = 22
Lần 2: x = 33
y = 44
Lần 3: x = 11
y = 22
Lệnh PRIVATE tiện dùng trong trƣờng hợp trong một chƣơng trình con ta cần
dùng một số tên biến (Ví dụ các biến a, b, i, j, alpha, z), nhƣng các tên biến này đã
đƣợc dùng ở các chƣơng trình con cấp cao hơn. Khi đó để khơng làm ảnh hƣởng tới
giá trị của các biến này trong các chƣơng trình cấp cao hơn ta phải khai báo trong
chƣơng trình con này:
PRIVATE a, b, i, j, alpha, z
119
Chương 7 Lập trình trong Visual Foxpro
7.4. Truyền tham số
Khi một chƣơng trình A gọi thực hiện chƣơng trình con B, chƣơng trình A có thể
truyền cho B một giá trị (hằng, biến, biểu thức) để sử dụng. Ngƣợc lại trong q trình
thực hiện, B có thể thay làm đổi giá trị một số biến của A. Đó chính là sự truyền tham
số. Có hai hình thức truyền tham số:
7.4.1. Truyền theo giá trị (truyền theo tham trị):
A truyền tham số cho B, trị của tham số trong B có thể bị thay đổi, nhƣng trị
nguyên thủy của tham số trong A không bị thay đổi.
7.4.2. Truyền theo địa chỉ (truyền theo tham biến):
A truyền tham số cho B, nếu trị của tham số trong B bị thay đổi thì trị nguyên thủy
của tham số trong A cũng thay đổi theo.
Việc truyền tham số cho thủ tục: Visual Foxpro mặc định các biến nhớ truyền theo
địa chỉ, các tham số khác (các biểu thức và các biến trƣờng) truyền theo giá trị. Để cho
một biến đơn truyền theo giá trị ta phải đặt nó trong 2 dấu ngoặc đơn (xem nhƣ là một
biểu thức).
Ví dụ 1: Biến LUONG đƣợc truyền cho thủ tục theo giá trị.
SET TALK OFF
CLEAR
hoten = „Nguyễn Văn An‟
ngaysinh = {09/23/49}
luong = 500
phucap = 200
Do Thutuc1 WITH hoten, ngaysinh, (luong), phucap IN Thutuc
? hoten, ngaysinh,luong, phucap
WAIT „‟
*Tệp Thutuc.PRG có nội dung sau:
PROCEDURE Thutuc1
PARA ht,ns,lg,ph
? ht,ns,lg,ph
ht = „Trần Bình‟
ns = „Khơng nhớ ngày sinh‟
120
Chương 7 Lập trình trong Visual Foxpro
lg = 1000
ph = 300
RETURN
Kết quả khi chạy chƣơng trình:
Nguyễn Văn An
09/23/49
500
200
Trần Bình
Khơng nhớ ngày sinh
500
300
Việc truyền tham số cho hàm tự tạo có thể theo địa chỉ và theo giá trị, mặc định
là theo giá trị. Để thiết lập việc truyền tham số cho hàm tự tạo theo địa chỉ thì phải
dùng lệnh:
SET UDFPARMS TO REFERENCE
Khi kết thúc chƣơng trình nên thiết lập lại chế độ truyền tham số theo giá trị
(mặc định) bằng lệnh:
SET UDFPARMS TO VALUE
Ta cũng có thể truyền tham số theo giá trị hay theo địa chỉ cho hàm tự tạo mà
không cần dùng lệnh SET UDFPARMS TO REFERENCE bằng cách: muốn truyền
theo giá trị thì đặt các tham số của hàm trong dấu ngoặc đơn bình thƣờng, muốn truyền
theo tham biến thì trƣớc tham số truyền theo tham biến phải có dấu @. Hãy xem Ví dụ
2 ở dƣới.
Các tham số là biến mảng khi truyền vào hàm tự tạo nhất thiết phải truyền theo
địa chỉ, nếu truyền theo giá trị sẽ bị lỗi. Muốn truyền các biến mảng vào hàm thì ta
phải dùng SET UDFPARMS TO REFERENCE hoặc đặt @ trƣớc tên biến mảng.
Chú ý:
Lệnh SET UDFPARMS TO VALUE khơng có tác dụng đối với thủ tục
Khi dùng lệnh SET UDFPARMS TO REFERENCE mà cuối chƣơng trình
khơng có SET UDFPARMS TO VALUE thì lệnh SET UDFPARMS TO VALUE vẫn
bị ảnh hƣởng tới các lần chạy sau đối với các chƣơng trình khác. Lỗi này rất khó phát
hiện. Nói chung nên dùng @ để truyền theo địa chỉ.
Ví dụ 2:
SET TALK OFF
CLEAR
SET UDFPARMS TO REFERENCE
121
&& Lệnh (1)
Chương 7 Lập trình trong Visual Foxpro
x=1
y=1
? „Ban đầu: x = ‟,x,‟ y = ‟ ,y
&& Lệnh (2)
t = cong(x,y)
? „ Trị hàm = ‟,t
? „ Sau khi gọi hàm: x = ‟,x,‟ y = ‟,y
WAIT „ ‟
SET TALK ON
*****************************
FUNCTION cong
PARA u,v
u=u+2
v=v+2
RETURN u + v
Kết quả khi chạy chƣơng trình:
Ban đầu: x =1
y=1
Trị hàm = 6
Sau khi gọi hàm: x = 3
y=3
Chú ý:
Nếu bỏ lệnh (1), lệnh (2) thay bằng t = cong(@x,@y) thì kết quả chạy chƣơng
trình vẫn nhƣ trên (tức là truyền tham số theo địa chỉ).
Nếu bỏ lênh (1) (về chế độ truyền tham số ngầm định cho hàm) hoặc thay bằng
lệnh (1) bằng SET UDFPARMS TO VALUE, cịn lệnh (2) giữ ngun nhƣ trong
chƣơng trình thì kết quả chạy chƣơng trình sẽ là:
Ban đầu: x = 1
y=1
Trị hàm = 6
Sau khi gọi hàm: x = 1
y=1
Ví dụ 3:
Lập chƣơng trình tính tích vơ hƣớng của hai véctơ
SET TALK OFF
SET UDFPARMS REFERENCE
122
&& Lệnh (1)
Chương 7 Lập trình trong Visual Foxpro
CLEAR
INPUT „Vào số phần tử của mảng: ‟ TO n
DIME a(n),b(n)
FOR i =1 TO n
INPUT „a(„+LTRIM(STR(i)+‟) = ‟ TO a(i)
INPUT „b(„+LTRIM(STR(i)+‟) = ‟ TO b(i)
ENDFOR
&& Lệnh 2
t = tvh(n,a,b)
? „Tích vo hƣớng: ‟+ STR(t,9,5)
WAIT „ ‟
SET UDFPARMS TO VALUE
*************************************
FUNCTION tvh
PARA n,a,b
s=0
FOR i=1 TO n
s = s+a(i)*b(i)
ENDFOR
RETURN
Nếu bỏ lệnh (1) thì lệnh (2) là sai cú pháp vì phần tử mảng bao giờ cũng truyền
theo địa chỉ. Nếu bỏ lệnh (1) hoặc lệnh (1) là SET UDFPARMS TO VALUE thì lệnh
(2) phải đổi là: t = tvh(n,@a,@b).
7.5. Một số câu lệnh của Visual FoxPro
7.5.1 Các câu lệnh thiết lập môi trƣờng làm việc
SET DATE TO FRENCH | AMERICAN thiết lập ngày tháng dạng dd/mm/yy
hoặc mm/dd/yy (ngầm định là AMERICAN)
SET CENTURY ON | OFF : thiết lập năm có 4 chữ số (ngầm định là OFF)
SET TALK ON | OFF : bật/tắt chế độ đối thoại (ngầm định là ON)
SET DEFAULT TO <đƣờng dẫn> : chọn thƣ mục làm việc
CLEAR : xố sạch màn hình
123
Chương 7 Lập trình trong Visual Foxpro
CLEAR ALL: xố sạch biến nhớ
CLOSE ALL: đóng tất cả các tệp đang mở
7.5.2 các câu lệnh vào, ra dữ liệu đơn giản
1) Lệnh gán
Cú pháp:
<biến> = <biển thức>
Chức năng: Khi gặp lệnh này máy tính tốn giá trị của biểu thức, kết quả lƣu
vào biến.
Ví dụ:
a= 5
ngay = Date()
2) Lệnh STORE
Cú pháp:
STORE <bthức> to <ds biến>
Chức năng: Gán giá trị của <bthức> cho <ds biến>
Ví dụ: STORE 0
To
a, b, c
3) Các lệnh nhập giá trị cho biến từ bàn phím
a) Lệnh ACCEPT
Cú pháp
ACCEPT [<lời nhắc>] to <biến chuỗi>
Chức năng : Khi gặp lệnh này máy in ra màn hình lời nhắc (nếu có), chờ ngƣời
sử dụng nhập một chuỗi từ bàn phím vào cho biến chuỗi.
Ví dụ:
ACCEPT „nhap ho ten‟ to bhoten
b) Lệnh INPUT
Cú pháp: INPUT [<Lời nhắc>] to <biến nhớ>
Chức năng: Tƣơng tự lệnh ACCEPT nhƣng khác ở chỗ ngƣời sử dụng có thể
nhập dữ liệu có kiểu bất kỳ cho biến nhớ. Khi nhập dữ liệu cần chú ý:
- Kiểu Character: Phải đƣợc đặt trong cặp dấu ' ... ' hay "... ".
- Kiểu Numberic: Nhập nhƣ số bình thƣờng.
- Kiểu Date: Phải đƣợc để trong dấu {}.
- Kiểu Logic: Nhập giá trị .T. hay .F.
Ví dụ:
INPUT 'Nhap ngay sinh' TO bngaysinh
INPUT 'Nhap diem‟ TO bdiem
124
Chương 7 Lập trình trong Visual Foxpro
c) Lệnh WAIT
Cú pháp: WAIT [< lời nhắc>] to <biến chuỗi> [WINDOW]
Chức năng: In ra màn hình lời nhắc (nếu có) và chờ ngƣời sử dụng ấn một phím
bất kỳ, ký tự gõ vào đƣợc lƣu vào biến chuỗi. Nếu khơng có lời nhắc máy in ra màn
hình dịng chữ “Press any key to continue…”. Từ khoá WINDOW dùng để hiện lời
nhắc ở cửa sổ nhỏ góc trên, bên trái màn hình.
7.5.3 Các lệnh in dữ liệu ra màn hình
1) Lệnh ? và ??
Cú pháp:
? <danh sách các biểu thức>
?? <danh sách các biểu thức>
Chức năng: Các lệnh này dùng để in kết quả của các biểu thức trong danh sách ra
màn hình.
Lệnh ? đƣa con trỏ xuống dòng mới, in kết quả của các biểu thức, in xong con trỏ
ở cuối giá trị của biểu thức sau cùng.
Lệnh ?? không đƣa con trỏ xuống dòng mới, in ngay kết quả các biểu thức tại vị
trí con trỏ, in xong con trỏ ở cuối giá trị của biểu thức sau cùng.
Ví dụ:
? „Chƣơng trình quản lý cán bộ‟
? „Phƣơng trình có nghiệm kép : ‟, -b/(2*a)
? (3.543 + 7.872) * 6.43101 / 9.65038
? date()
2) In một biểu thức ra màn hình có tọa độ xác định
Cú pháp: @dòng, cột SAY <biểu thức>
Chức năng: Lệnh này in giá trị của biểu thức ra màn hình tại vị trí dịng, cột đã
đƣợc chỉ ra.
Ví dụ 1:
hoten = „Trần Văn Thanh‟
ngaysinh = {12/25/60}
gioitinh = .T.
125
Chương 7 Lập trình trong Visual Foxpro
luong = 554.550
phucap = 150.50
clear
@11,20 say „Họ và tên: ‟ + hoten
@12,20 say „Ngày sinh: ‟ + dtoc(ngaysinh)
@13,20 say „Giới tính: ‟ + iif(gioitinh,‟Nam‟,‟Nữ‟)
@14,20 say „Lƣơng chính: ‟ + str(luong,7,2)
@15,20 say „Tổng số tiền lĩnh: ‟
@15,40 say luong + phucap
Ví dụ 2:
clear
@1,1 say (2/5233 + 7.543)*40.231 /3.876
@2,1 say {05/28/97} + 50
@3,1 say 5.2 > 3.1
7.5.4 Lệnh SAY…GET…READ
Cú pháp:
@dòng1, cột1 SAY <Lời nhắc1> GET <biến1>
@dòng2, cột2 SAY <Lời nhắc2> GET <biến2>
@dòng n, cột n …
READ
Chức năng: Lệnh này dùng để nhập dữ liệu cho các biến 1, biến 2, …, biến n từ
bàn phím.
Ví dụ: Lệnh sau dùng để nhập dữ liệu thông tin về một khách hàng từ bàn phím.
Clear
@1,1 say 'Ma khach hang: ' get Makh
@3,1 say 'Ho ten: ' get Tenkh
@4,1 say 'Gioi tinh: ' get Gioitinh
@5,1 say 'Dia chi: ' get Diachi
@6,1 say 'Dien thoai: ' get Dienthoai
@7,1 say 'An Ctrl+W de ghi lai ban ghi vua sua'
Read
126
Chương 7 Lập trình trong Visual Foxpro
7.6. Các cấu trúc điều khiển chƣơng trình
7.6.1 Cấu trúc tuần tự (ngầm định)
Chƣơng trình đƣợc thực hiện từ đầu đến cuối chƣơng trình, lệnh viết trƣớc thực
hiện trƣớc, lệnh viết sau thực hiện sau.
7.6.2 Cấu trúc rẽ nhánh
1) Dạng rẽ nhánh khuyết
Cú pháp:
IF <Bthức L>
<Dãy lệnh>
ENDIF
Chức năng: Khi gặp cấu trúc này, trƣớc hết <Bthức L> sẽ đƣợc tính, nếu có
giá trị .T. thì <dãy lệnh> sẽ đƣợc thực hiện, ngƣợc lại <dãy lệnh> sẽ bị bỏ qua rồi
thực hiện lệnh tiếp theo sau ENDIF.
Ví dụ: Viết chƣơng trình nhập vào hai số, cho biết số lớn nhất
set talk off
clear
Input “Nhap so thu nhat” to so1
Input „Nhap so thu hai' to so2
max=so1
If max < so2
max=so2
Endif
? "So lon nhat la:”, max
set talk on
return
127
Chương 7 Lập trình trong Visual Foxpro
2) Dạng rẽ nhánh đầy đủ
Cú pháp:
IF <Bthức L>
<dãy lệnh 1>
ELSE
<dãy lệnh 2>
ENDIF
Chức năng: Khi gặp cấu trúc này, trƣớc hết <Bthức L> sẽ đƣợc tính. Nếu có giá
trị .T. thì <dãy lệnh 1> đƣợc thực hiện, ngƣợc lại có giá trị .F. thì <dãy lệnh 2> đƣợc
thực hiện . Sau đó chuyển đến thực hiện lệnh tiếp theo sau ENDIF.
Ví dụ: Dựa vào bảng nhanvien.dbf, hãy nhập vào một họ tên nhân viên, tìm
xem có đúng là nhân viên của cơng ty hay khơng, nếu đúng thì thơng báo năm sinh và
năm làm việc, ngƣợc lại thì thơng báo là khơng phải nhân viên của công ty.
set talk off
set date to french
set defaut to c:\dulieu
clear
close all
use NHANVIEN
accept 'nhap ho ten nhan vien:' to bhoten
locate for HOTEN =bhoten
if found()
? ' ngay sinh là:', ngaysinh'
? 'nam lam viec:', namlv
else
? 'khong phai la nhan vien cua cong ty'
endif
set talk on
return
128
Chương 7 Lập trình trong Visual Foxpro
3) Dạng rẽ nhiều nhánh
Cú pháp
DO CASE
CASE <Bthức L1>
<dãy lệnh 1>
CASE <Bthức L2>
<dãy lệnh 2>
......
CASE <Bthức Ln>
<dãy lệnh n>
[OTHERWISE
<dãy lệnh n+1>]
ENDCASE
Chức năng: Khi gặp cấu trúc này, các <Bthức Li> sẽ đƣợc tính bắt đầu với i=1.
Nếu <Bthức Li> với i = 1,...., n nào đó có giá trị .T. đầu tiên thì dãy lệnh i tƣơng ứng
sẽ đƣợc thực hiện và kết thúc cấu trúc DO CASE, sau đó chuyển đến thực hiện lệnh
sau ENDCASE.
Trong trƣờng hợp khơng có <bthức Li> nào với i từ 1 đến n có giá trị .T. thì
<dãy lệnh n+1> sẽ đƣợc thực hiện nếu có
OTHERWISE
<dãy lệnh n+1>
hoặc cấu trúc DO CASE bị bỏ qua nếu khơng có
OTHERWISE
<dãy lệnh n+1>
Ví dụ: Viết chƣơng trình nhập vào một năm (có 4 chữ số), sau đó nhập thêm một
tháng, cho biết tháng này có bao nhiêu ngày.
set talk off
set date to french
set defaut to c:\dulieu
clear
close all
129
Chương 7 Lập trình trong Visual Foxpro
input 'nhap vao mot nam' to bnam
input 'nhap vao mot thang' to bthang
do case
case bthang = 4 or bthang = 6 or bthang = 9 or bthang = 11
songay =30
case bthang = 2
if (mod(bnam, 4) = 0 and (mod(bnam, 100) <> 0)
songay = 29
else
songay = 28
endif
otherwise
songay =3 1
endcase
? 'thang', bthang, 'nam', bnam, 'co', so ngay, 'ngay'
set talk on
return
7.6.3. Cấu trúc lặp
1) Cấu trúc DO WHILE
Cú pháp:
DO WHILE <Bthức L>
<dãy lệnh>
ENDDO
Chức năng: Khi gặp cấu trúc này trƣớc hết <Bthức L> sẽ đƣợc tính, nếu có giá
trị .F. thì kết thúc cấu trúc DO WHILE và chuyển đến thực hiện các lệnh sau ENDDO.
Ngƣợc lại nếu có giá trị .T. thì dãy lệnh trong thân vòng lặp sẽ đƣợc thực hiện và tự
130
Chương 7 Lập trình trong Visual Foxpro
động quay lại kiểm tra điều kiện trong <Bthức L> và cứ tiếp tục nhƣ thế mãi cho đến
khi <Bthức L> có giá trị .F.
Ví dụ: Cho biết dang sách họ tên của các nhân viên trong công ty.
set talk off
set date to french
set defaut to c:\dulieu
clear
close all
use NHANVIEN
? 'danh sach ho ten hoc vien la:'
do while !eof()
? HOTEN
skip
enddo
set talk on
return
Chú ý: Khi sử dụng cấu trúc này, dãy lệnh trong thân vòng lặp phải làm thay đổi đƣợc
giá trị của <Bthức L> để đảm bảo tính kết thúc, nếu khơng có thể sẽ rơi vào vịng lặp
vơ hạn.
Ví dụ: Nhập vào một năm, hãy thông báo danh sách họ tên, ngày sinh của những nhân
viên làm việc trong năm đó, nếu khơng có thì thơng báo là khơng có.
set talk off
set date french
set defaut to c:\dulieu
clear
close all
use NHANVIEN
input “nhap nam lam viec" to bnam
set filter to NAMLV = bnam
count to dem
if dem = 0
131
Chương 7 Lập trình trong Visual Foxpro
? ' khong co nhan vien nao'
else
go top
? 'danh sach nhan vien lam viec năm', bnam
? "HO TEN
NGAY SINH'
do while !eof()
? HOTEN, NGAYSINH
skip
enddo
endif
set filter to
set talk on
return
2) Cấu trúc lặp FOR
Cú pháp:
FOR <biến đếm> = <btN1> TO <btN2> [STEP <btN3>]
<dãy lệnh>
ENDFOR
Chức năng: Khi gặp cấu trúc này trƣớc hết <biến đếm> đƣợc gán giá trị của
<btN1>, rồi kiểm tra xem giá trị của <biến đếm> có nhỏ hơn hoặc bằng giá trị của
<btN2> khơng? ( nếu <btN3> lớn hơn 0) hoặc kiểm tra xem giá trị của <biến đếm> có
lớn hơn hoặc bằng giá trị của <btN2> không? ( nếu <btN3> nhỏ hơn 0) nếu việc kiểm
tra cho kết quả đúng thì <dãy lệnh> đƣợc thực hiện và biến đếm đƣợc cộng thêm giá
trị của <btN3> rồi tự động quay lại việc kiểm tra, cứ tiếp tục nhƣ thế cho đến khi việc
kiểm tra cho kết quả sai thì kết thúc cấu trúc lặp FOR và chuyển đến thực hiện lệnh
sau ENDFOR. Trƣờng hợp khơng có mệnh đề STEP thì ngầm định là STEP 1.
Ví dụ:
Tính tổng của dãy số
1 + 4 + 7 + 10 + 13 + ..... + (3n-2)
SET TALK OFF
132
Chương 7 Lập trình trong Visual Foxpro
CLEAR
INPUT „ N = „ TO n
s=0
FOR i=1 TO 3*n -2 STEP 3
s=s+i
ENDFOR
? „Tổng 1 + 4 + 7 + .... là : ‟, s
WAIT „‟
set talk on
Chú ý: Có thể thay lệnh for trên bằng lệnh sau
FOR i=1 TO n
s = s + 3*i-2
ENDFOR
3) Lệnh LOOP và EXIT
Lệnh Loop và Exit đƣợc sử dụng trong thân vòng lặp, hỗ trợ và làm thay đổi sự
hoạt động bình thƣờng của lệnh lặp. Trong thân vịng lặp, nếu gặp lệnh Loop thì sẽ bỏ
qua các lệnh sau lệnh loop trong thân vòng lặp và nhảy ngay lên đầu vòng lặp để thực
hiện lần lặp tiếp theo, nếu gặp lệnh Exit thì thốt khỏi vịng lặp trong cùng chứa nó (vì
các lệnh lặp có thể lồng nhau).
Ví dụ:
Nhập vào một dãy số dƣơng từ bàn phím, quá trình nhập dừng khi nhập vào số 0,
nếu nhập vào số âm thì yêu cầu nhập lại và in ra màn hình tổng các số dƣơng vừa
nhập.
SET TALK OFF
CLEAR
S=0
DO WHILE .T.
INPUT „n = ‟ TO n
IF n < 0
LOOP
133
Chương 7 Lập trình trong Visual Foxpro
ELSE
IF N = 0
EXIT
ELSE
S=S+n
ENDIF
ENDIF
ENDDO
? „Tổng các phần tử dƣơng vừa nhập là: ‟, s
WAIT „‟
SET TALK ON
7.7. Một số câu lệnh thao tác với bảng dữ liệu
7.7.1. Mở và đóng bảng dữ liệu
1) Mở bảng dữ liệu
Cú pháp:
USE <tên bảng dữ liệu>
Chức năng : Dùng để mở bảng dữ liệu tại vùng làm việc hiện thời
Ví dụ:
USE hsns
2) Đóng bảng dữ liệu trong vùng làm việc hiện hành:
USE
Để đóng các bảng dữ liệu cịn có thể dùng các lệnh:
CLOSE ALL: Đóng tất cả các loại tệp đang mở
CLOSE DATABASES: Đóng tất cả các bảng CSDL trên tất cả các vùng.
7.7.2. Dịch chuyển con trỏ bản ghi – Lệnh GO và SKIP
Tại một thời điểm Visual FoxPro chỉ làm việc với bản ghi, bản ghi này gọi là bản
ghi hiện hành.
Sau khi mở bảng CSDL bằng lệnh USE, bản ghi hiện hành là bản ghi đầu tiên
trong CSDL. Để dịch chuyển con trỏ bản ghi dùng lệnh sau:
134
Chương 7 Lập trình trong Visual Foxpro
GO <n>: Chuyển tới bản ghi có số hiệu là n
GO TOP: Chuyển tới bản ghi đầu tiên
GO BOTTOM: Chuyển tới bản ghi cuối cùng
SKIP: Dịch chuyển theo chiều tiến (về phía cuối bảng) một bản ghi
SKIP <n>: Dịch chuyển theo chiều tiến n bản ghi (nếu n>0) hoặc lùi lại n bản
ghi (nếu n<0)
7.7.3. Lệnh LOCATE
Cú pháp:
LOCATE FOR <Bthức L> [<Phạm vi>]
Chức năng: Lệnh này định vị con trỏ bản ghi của bảng dữ liệu hiện thời vào
bản ghi đầu tiên (theo thứ tự trên xuống), thuộc <Phạm vi> thỏa mãn <Bthức L>.
Hàm FOUND() cho giá trị .T. nếu tìm thấy, ngƣợc lại cho giá trị .F. . Trong
trƣờng hợp tìm thấy, để tìm kiếm tiếp tục hãy lặp lại lệnh:
CONTINUE
7.7.4. Lệnh BROWSE
Một số lệnh của Visual Foxpro có các tuỳ chọn:
[Phạm vi] nếu có thì phạm vi là một trong các giá trị sau:
ALL : Tất cả các bản ghi
REST : Tất cả các bản ghi từ bản ghi hiện thời đến hết bảng
NEXT <n> : n bản ghi từ bản ghi hiện thời về phía cuối bảng
RECORD <n> : Bản ghi có số hiệu là n
Nếu khơng có phạm vi thì sử dụng phạm vi ngầm định
[FIELDS <ds trƣờng>] nếu có thì chỉ có các trƣờng trong <ds trƣờng>, nếu
khơng có thì tất cả các trƣờng.
[FOR <Bthức L>] nếu có thì chỉ các bản ghi thoả mãn <Bthức L>, nếu khơng
có thì tất cả các bản ghi.
Lệnh BROWSE là một lệnh rất mạnh của Visual Foxpro, dùng để xem, sửa, bổ
sung và xóa bản ghi.
Cú pháp câu lệnh với các tham số hay dùng:
BROWSE [FIELDS <ds trƣờng>][FOR <btL>]
135