Visual Foxpro - Bài 7: Lập trình trong Visual Foxpro
Tạo và chạy một chương trình
Visual Foxpro làm việc ở hai chế độ:
o Cửa sổ lệnh - Các lệnh được đưa vào cửa sổ lệnh và thực thi.
o Chương trình - Tập các lệnh được thực hiện theo một thứ tự nào đó.
Chương trình trong Visual Foxpro được lưu trong các file có phần mở rộng là PRG.
• Tạo một chương trình
Lệnh (từ cửa sổ lệnh)
MODIFY COMMAND <TenChuongtrinh>
Trong đó: <Tenchuongtrinh> là tên chương trình
Khi đó xuất hiện cửa sổ soạn thảo cho phép soạn thảo văn bản chương trình.
Kết thúc soạn: Nhấn Ctrl+W để ghi lại.
Sửa chương trình: cũng dùng lệnh MODI COMM <tenchuongtrinh>
Một chương trình đơn giản
HOSOSV RETURN Chú ý: Có thể sử dụng cấu trúc IF ENDIF lồng nhau. IF BT1 THEN && IF thứ 1 .... IF BT2 THEN && IF thứ 2 .... ELSE .... ENDIF && Kết thúc IF thứ 2 ELSE .... ENDIF && Kết thúc IF thứ nhất. 2. Lệnh DO CASE ... ENDCASE Kiểm tra nhiều điều kiện logic, và thực hiện tập lệnh đầu tiên mà biểu thức logic có giá trị TRUE. Cú pháp: DO CASE CASE BieuThucLogic1 Lệnh 1 CASE BieuThucLogic2 Lệnh 2 ... CASE BieuThucLogicN Lệnh N [ OTHERWISE Lệnh N+1 ] ENDCASE Trong đó: BieuThucLogicK - Biểu thức logic Thực hiện lệnh: Kiểm tra từ BieuThucLogic1 đến N nếu tồn tại một BieuThucLogicK =TRUE thì chương trình sẽ thực hiện các câu Lệnh K và kết thúc, trường hợp tất cả các BieuThucLogic=FALSE và sử dụng mệnh đề OTHERWISE thì các Lệnh N+1 được thực hiện. Ví dụ 2: Tính điểm trung bình chung và tính xếp loại của một sinh viên nào đó. SET TALK OFF CLOSE ALL SELECT 0 USE monhoc SET ORDER TO Ma SELECT 0 USE diem SET RELATION TO mamon INTO Monhoc SUM monhoc.sodvht*diem.diem1,monhoc.sodvht TO tongdiem,tongdvht FOR masv="SV-0624 " DTBC=tongdiem/tongdvht DO CASE CASE dtbc>9 WAIT WINDOW "Xep loai: Xuat sac" CASE dtbc>8 WAIT WINDOW "Xep loai: Gioi" CASE dtbc>7 WAIT WINDOW "Xep loai: Kha" CASE dtbc>6 WAIT WINDOW "Xep loai: Trung Binh Kha" CASE dtbc>5 WAIT WINDOW "Xep loai: Trung Binh" OTHERWISE WAIT WINDOW "Xep loai: Yeu" ENDCASE USE IN monhoc USE IN diem RETURN 3. Lệnh DO WHILE ... ENDDO Thực hiện một tập các lệnh trong vòng lặp có điều kiện. Cú pháp: DO WHILE Lệnh 1 [LOOP] [EXIT] Lệnh 2 ENDDO Trong đó: BieuThucLogic - Biểu thức logic Thực hiện: Nếu BieuThucLogic=TRUE sẽ thực các Lệnh 1, Lệnh 2, khi đến ENDDO sẽ quay trở lại kiểm tra BieuThucLogic; trường hợp BieuThucLogic=FALSE sẽ kết thúc lệnh. Lệnh LOOP cho phép (ngay lập tức) trở lại bắt đầu vòng lặp (Kiểm tra BieuThucLogic), bỏ qua các lệnh giữa LOOP và ENDDO. Lệnh LOOP có thể đặt vào bất cứ đâu giữa DO WHILE và ENDDO. Lệnh EXIT cho phép (ngay lập tức) kết thúc lệnh DO WHILE ...ENDDO và bỏ qua các lệnh giữa EXIT và ENDDO. Lệnh EXIT có thể đặt vào bất cứ đâu giữa DO WHILE và ENDDO. Ví dụ 3: Tìm xem trong danh sách sinh viên có bạn Nữ (Gioi=.T.) nào có điểm trung binhg chung đạt >=8.0? SET TALK OFF CLEAR CLEAR ALL CLOSE ALL SELECT 0 USE monhoc SET ORDER TO MONLOP && MA+MALOP SELECT 0 USE diem SET RELATION TO mamon+malop INTO Monhoc SELECT 0 USE Hososv GO TOP DO WHILE !EOF() IF hososv.gioi=.F. Then SKIP LOOP ENDIF SELECT diem SUM monhoc.sodvht*diem.diem1,monhoc.sodvht ; TO tdiem,tdvht FOR masv=Hososv.masv dtbc=tongdiem/tongdvht IF dtbc>=8 THEN WAIT WINDOW "SV: "+ hososv.hoten +" DTBC: "+ STR(dtbc) EXIT ENDIF SELECT hososv SKIP ENDDO USE IN hososv USE IN monhoc USE IN diem RETURN 4. Lệnh FOR ... ENDFOR Thực hiện một tập các lệnh với số lần lặp xác định. Cú pháp: FOR Bien = initValue TO FinalValue [STEP K] Lệnh 1 [LOOP] [EXIT] Lệnh 2 ENDFOR Trong đó: Bien - Đóng vai trò như một biến đếm, initValue - Giá trị đầu, FinalValue - Giá trị cuối. Thực hiện: Thực hiện các lệnh giữa FOR và ENDFOR khi biến Bien có giá trị từ initValue đến FinalValue. Tham số STEP K qui định bước thay đổi của biến Bien bằng K (K có thể âm), mặc định (khi không thên tùy chọn STEP K) K =1. Lệnh LOOP cho phép (ngay lập tức) trở lại bắt đầu vòng FOR, bỏ qua các lệnh giữa LOOP và ENDFOR. Lệnh LOOP có thể đặt vào bất cứ đâu giữa FOR và ENDFOR. Lệnh EXIT cho phép (ngay lập tức) kết thúc lệnh FOR ...ENDFOR và bỏ qua các lệnh giữa EXIT và ENDFOR. Lệnh EXIT có thể đặt vào bất cứ đâu giữa FOR và ENDFOR. Ví dụ 4: Tính điểm trung bình chung học kỳ 1 năm 2004-2005 của lớp 3E-04. SET TALK OFF SET SAFETY OFF CLEAR CLEAR ALL CLOSE ALL SELECT 0 USE monhoc SET ORDER TO MONLOP && MA+MALOP SELECT 0 USE diem SET RELATION TO mamon+malop INTO Monhoc SET FILTER TO monhoc.hocky=1 AND monhoc.namhoc=2004 SELECT 0 USE Hososv COPY TO c:\temp\HOSOLOP FOR malop="3E-04" USE IN hososv SELECT 0 USE c:\temp\HOSOLOP ALIAS Hososv EXCLUSIVE ALTER table c:\temp\HOSOLOP ADD COLUMN Dtbc N(5,2) n=RECCOUNT() FOR i=1 TO n SELECT diem SUM monhoc.sodvht*diem.diem1,monhoc.sodvht ; TO tongdiem,tongdvht FOR masv=Hososv.masv SELECT hososv REPLACE dtbc WITH IIF(tongdvht>0,tongdiem/tongdvht,0) SKIP ENDFOR SELECT Hososv BROWSE FIELDS masv,hoten,ngaysinh,dtbc ; TITLE "Tong ket ket qua hoc ky 1, 2004-2005" USE IN hososv USE IN monhoc USE IN diem RETURN 5. Lệnh SCAN ... ENDSCAN Di chuyển con trỏ bản ghi trên một vùng làm việc nào đó, tương ứng với mỗi bản ghi tìm thấy sẽ thực hiện một tập các lệnh. Cú pháp: SCAN [Scope] [FOR BieuthucLogic] Lệnh 1 [LOOP] [EXIT] Lệnh 2 ENDSCAN Trong đó: Tùy chọn Scope cho phép xác định phạm vi tác động của lệnh (ALL, NEXT n, RECORD n, REST). Tùy chọn [FOR BieuThucLogic] cho phép lệnh SCAN duyệt trên các bản ghi thỏa mãn BieuThucLogic. Nếu không đưa tham số này vào thì lệnh SCAN sẽ duyệt trên tất cả các bản ghi. Thực hiện: (*) Nếu còn bản ghi (trong phạm vi Scope và thỏa mãn BieuThucLogic) trong vùng làm việc -> Thực hiện các lệnh giữa SCAN và ENDSCAN, tiếp đến dịch chuyển con trỏ bản ghi đi 1 vị trí (SKIP 1) rồi trở lại (*); Nếu không còn bản ghi nào-> Kết thúc lệnh SCAN. Lệnh LOOP cho phép (ngay lập tức) trở lại bắt đầu vòng SCAN bỏ qua các lệnh giữa LOOP và ENDSCAN. Lệnh LOOP có thể đặt vào bất cứ đâu giữa SCAN và ENDSCAN. Lệnh EXIT cho phép (ngay lập tức) kết thúc lệnh SCAN ...ENDSCAN và bỏ qua các lệnh giữa EXIT và ENDSCAN. Lệnh EXIT có thể đặt vào bất cứ đâu giữa SCAN và ENDSCAN. Ví dụ 5: Tính điểm trung bình chung học kỳ 1 năm 2004-2005 của lớp 3E-04 (như ví dụ 4 nhưng thay FOR bằng SCAN). SET SAFETY OFF SET TALK OFF CLEAR CLEAR ALL CLOSE ALL SELECT 0 USE monhoc SET ORDER TO MONLOP && MA+MALOP SELECT 0 USE diem SET RELATION TO mamon+malop INTO Monhoc SET FILTER TO monhoc.hocky=1 AND monhoc.namhoc=2004 SELECT 0 USE Hososv COPY TO c:\temp\HOSOLOP FOR malop="3E-04" USE IN hososv SELECT 0 USE c:\temp\HOSOLOP ALIAS Hososv EXCLUSIVE ALTER table c:\temp\HOSOLOP ADD COLUMN Dtbc N(5,2) GO TOP SCAN SELECT diem SUM monhoc.sodvht*diem.diem1,monhoc.sodvht ; TO tongdiem,tongdvht FOR masv=Hososv.masv SELECT hososv REPLACE dtbc WITH IIF(tongdvht>0,tongdiem/tongdvht,0) ENDSCAN SELECT Hososv BROWSE FIELDS masv,hoten,ngaysinh,dtbc ; TITLE "Tong ket ket qua hoc ky 1, 2004-2005" USE IN hososv USE IN monhoc USE IN diem RETURN III. Chương trình con 1. Thủ tục (PROCEDURE) Người sử dụng có thể tạo ra các thủ tục riêng bằng cách sử dụng khai báo PROCEDURE Cú pháp: PROCEDURE [PARAMETERS ] Lệnh [ENDPROC] Trong đó: ProcName: Tên thủ tục (do người sử dụng tự đặt) Tùy chọn PARAMETERS cho phép khai báo các tham số “hình thức”, các tham số này sẽ nhận giá trị thực từ chương trình chính khi thực hiện lời gọi thủ tục, para1, para2 ,..., paraN là tên các tham số hình thức. Lời gọi thủ tục: Các thủ tục sau khi hoàn tất có thể được gọi từ một chương trình nào đó. Lời gọi chương trình con có dạng như sau. DO [With value1, value2 ... valueN] [IN ProgName] Trong đó: ProcName là tên thủ tục cần gọi; value1, value ... valueN là giá trị thực được truyền tương ứng cho các tham số hình thức của chương trình con; tùy chọn IN ProgName cho phép xác định file chương trình chứa thủ tục cần gọi (mặc định là trong bản thân chương trình đang thực hiện). Ví dụ 6: Viết thủ tục cho phép hiển thị thứ (trong tuần) của một ngày nào đó. CLEAR ALL CLOSE ALL CLEAR DO HienThiThu WITH DATE() * --------------- Khai bao thu tuc ------------------- PROCEDURE HienThiThu PARAMETERS date1 WAIT WINDOW CDOW(Date1) ENDPROC Trong ví dụ trên, date1 là tham số “hình thức” trong thủ tục HienThiNgay và nhận tham số thực là Date() trong lời gọi thủ tục trong chương trình chính. Giả sử ví dụ 6 được lưu vào file Vidu6.PRG, khi đó trong một chương trình khác có thể thực hiện lời gọi thủ tục HienThiThu như sau: DO HienThiThu WITH DATE() IN Vidu6.PRG Chú ý: Với các tham số hình thức Para1, para2 ... có thể không truyền giá trị cho các tham số này khi thực hiện lời gọi thủ tục, tuy nhiên các tham số khi đó sẽ nhận giá trị FALSE (giá trị Logic) và như vậy rất có thể dẫn đến lỗi. 2. Hàm (FUNCTION) Ngoài các hàm do Visual Foxpro cung cấp sẵn, người sử dụng có thể tạo ra các thủ tục riêng bằng cách sử dụng khai báo FUNCTION Cú pháp: FUNCTION [PARAMETERS ] Lệnh RETURN [ENDFUNC] Trong đó: FuncName: Tên hàm (do người sử dụng tự đặt) Tùy chọn PARAMETERS cho phép khai báo các tham số “hình thức”, các tham số này sẽ nhận giá trị thực từ chương trình chính khi thực hiện lời gọi hàm para1, para2 ,..., paraN là tên các tham số hình thức. BieuThuc: Giá trị của biểu thức này là giá trị trả về của hàm. Lời gọi hàm: Các hàm tự tạo hoặc hàm do Visual Foxpro cung cấp đều được gọi như sau: FuncName(With value1, value2 ... valueN) Trong đó: FuncName là tên hàm cần gọi; value1, value ... valueN là giá trị thực được truyền tương ứng cho các tham số hình thức của chương trình con. Lời gọi hàm chỉ tham gia vào trong các biểu thức. Ví dụ 7: Viết hàm tính tổng của 2 số. CLEAR ALL CLOSE ALL CLEAR a=10 b=20 WAIT WINDOW STR(a)+"+"+STR(b)+"="+STR(tong(a,b)) * --------------- Khai bao ham ------------------- FUNCTION Tong PARAMETERS x,y RETURN x+y ENDPROC Ví dụ 8: Viết hàm trả về thứ (tiếng việt) của một ngày nào đó. CLEAR ALL CLOSE ALL CLEAR WAIT WINDOW “Hom nay la: ”+ ThuVN(DATE()) * --------------- Khai bao thu tuc ------------------- FUNCTION ThuVN PARAMETERS d kq="" i=DOW(d) DO CASE CASE i=1 kq="Chu Nhat" CASE i=2 kq="Thu Hai" CASE i=3 kq="Thu Ba" CASE i=4 kq="Thu Tu" CASE i=5 kq="Thu Nam" CASE i=6 kq="Thu Sau" CASE i=7 kq="Thu Bay" ENDCASE RETURN kq ENDPROC Bài tập Thực hiện các ví dụ trong bài. Hoàn thành hàm TENVN đẽ nêu trong bài 3.
File đính kèm:
- Visual Foxpro - Bài 7 Lập trình trong Visual Foxpro.doc