Một ví dụ về Select Case
4.7.5 Vòng lặp không xác định Do Loop
Bài giảng Lập trình trong Access Dạng 1: Do [{While/Until}<điều kiện>] [<các lệnh>] [Exit Do] [<các lệnh>] Loop Dạng 2: Do [<các lệnh>] [Exit Do] [<các lệnh>] Loop[{While/Until}<điều kiện>] 4.7.6 Vòng lặp While Wend While <điều kiện> [<các câu lệnh>] Wend 4.7.7 Các lệnh nhảy và kết thúc chương trình Nhảy không điều kiện 9 Cú pháp: Goto <Label> 9 Sự hoạt động:
Chuyển tới câu lệnh có nhãn Label và chương trình tiếp tục thực hiện từ lệnh này. Nhảy tới đoạn chương trình con 9 Cú pháp: Gosub Label .... Label: ....
Return “Trở về câu lệnh ngay sau Gosub”
9 Sự hoạt động:
Chuyển tới câu lệnh có nhãn Label và tiếp tục thực hiện từ lệnh này cho tới khi gặp Return thì quay trở lại câu lệnh đứng ngay sau Gosub.
Nhảy có lựa chọn
9 Cú pháp:
Bài giảng Lập trình trong Access
Trong đó BT là biểu thức nguyên và thoả mãn điều kiện 0≤BT≤255 9 Sự hoạt động: Nếu BT = 1 thì nhảy tới nhãn_1 Nếu BT = 2 thì nhảy tới nhãn_2 ... Nếu BT = n thì nhảy tới nhãn_n Nếu BT = 0 hoặc BT > n thì bỏ qua On BT Goto/Gosubđể thực hiện lệnh tiếp theo. Nếu BT < 0 hoặc BT > 255 thì có lỗi. Nhảy khi có lỗi 9 Cú pháp:
On Error Goto Label ... Exit Sub Label: Xử lí lỗi Resume ⎩ ⎨ ⎧ nhan next ⎭ ⎬ ⎫
Hoạt động: Khi có lỗi, chương trình không dừng mà chuyển đến câu lệnh có nhãn Label.
Các lỗi có thể xảy ra:
9 Xóa một bảng / truy vấn không tồn tại. 9 Tạo mới một bảng / truy vấn đã tồn tại.
9 Nhận giá trị Null từ một ô điều khiển của form / report. 9 Chia cho số 0.
9 Và các lỗi khác...
Khi gặp các lỗi này, chương trình bị rối loạn và có thể bị treo máy.
Các hàm:
9 Error$: cho biết lõi gì đã xảy ra. 9 Err: cho biết số hiệu lỗi.
Câu lệnh Resume: hướng dẫn sự hoạt động tiếp tục của chương trình, thường được viết theo hai cách:
9 Resume Next
Theo cách này, chương trình tiếp tục từ câu lệnh ngay sau câu lệnh gây lỗi. 9 Resume Tiep_tuc
Bài giảng Lập trình trong Access
Chương trình tiếp tục từ câu lệnh có nhãn Tiep_tuc.
Ví dụ: Thủ tục xóa một bảng có tên nhập vào từ bàn phím. Lỗi có thể gặp là bảng không tồn tại. Khi có lỗi, chương trình đưa ra thông báo và kết thúc thủ tục:
Sub DeleteTable() Dim DB As Database Dim tableName As String Set DB = CurrentDB() On Error Goto Xu_li_loi
tableName = InputBox("Input the name of the table that will be deleted:") DB.TableDefs.Delete tableName
MsgBox “Table” + tableName + “was deleted” Exit_Program:
Exit Sub Xu_li_loi:
MsgBox “Table” + tableName + “is not available” MsgBox Error$
Resume Exit_Program End Sub
4.8 Các thao tác trên tệp
Cho phép chuyển dữ liệu ra lưu trữở ngoài tệp mdb.
Mở tệp: Tệp cần được mở trước khi thực hiện các thao tác trên nó. Để mở tệp, ta dùng mệnh đề OPEN:
OPEN Tên_tệp [FOR Kiểu_tệp] [ACCESS quyền_truy_nhập] AS[#]Số_hiệu_tệp
[LEN = Reclen]
Giải thích các tham số:
9 Tên_tệp: biểu thức chuỗi xác định tên tệp và đường dẫn, bắt buộc phải có tham số này. Ví dụ: “file01.ad”, “C:\ABC\hoso.xyz”
9 Kiểu_tệp: Xác định cách thức truy nhập trên tệp, gồm các giá trị sau:
Giá trị Ý nghĩa
Random Đây là kiểu tệp mặc đinh. Đọc ghi theo mẫu tin. Cho phép thực hiện cả ba thao tác: ReadWrite (default), ReadOnly, WriteOnly.
Binary Cho phép đọc/ghi từ một vị trí bất kỳ tính theo byte trên tệp bằgn cách dùng mệnh đề GET (để đọc) và PUT (để ghi). Cho phép thực hiện cả ba thao tác: ReadWrite (default), ReadOnly, WriteOnly.
Bài giảng Lập trình trong Access
Output Ghi trên các tệp tuần tự bằng cách sử dụng mệnh đề Write.
Append Ghi bổ sung trên các tệp tuần tự bằng cách sử dụng mệnh đề Write. Quyền_truy_nhập: Xác định quyền truy nhập trên tệp gồm:
Giá trị Ý nghĩa
Read Chỉ có quyền đọc Write Chỉ có quyền ghi
Read Write Có quyền đọc và ghi. Chỉđúng đối với các kiểu tệp Random và Binary. 9 Số_hiệu_tệp: là một biểu thức nguyên có giá trị từ 1 đến 255. Sau khi mở tệp,
số hiệu tệp sẽ gắn với tệp cho đến khi tệp được đóng lại. Mọi thao tác sẽ thực hiện thông qua số hiệu tệp.
9 Reclen: là một biểu thức nguyên có giá trị từ 1 đến 32767. Đối này thực sự có tác dụng đối với kiểu tệp Random để xác định độ lớn của bản ghi (số kí tự trong mỗi bản ghi). Giá trị mặc định của Reclen là 128 byte.
Ví dụ: Hàm kiểm tra sự tồn tại của tệp trong thư mục hiện hành, đối số là tên tệp cần kiểm tra. Hàm trả về True nếu tệp tồn tại, ngược lại là False. Đoạn mã có dùng hàm xác định một số hiệu tự do chưa dùng FreeFile:
Function Ton_tai(Ten_tep As String) As Integer So_hieu As Integer
So_hieu = FreeFile ‘Chọn một số hiệu chưa dùng Ton_tai = True
On Error Goto Loi
OPEN Ten_tep FOR Input AS So_hieu Close So_hieu ‘Đóng tệp Exit Function Loi: Ton_tai = False Resume Next End Function Đóng tệp
Mệnh đề Close dùng đểđóng 1 hoặc tất cả các tệp đang mở. Cú pháp như sau:
Close [[#]Số_hiệu_tệp], [[#]Số_hiệu_tệp]....
Nếu viết Close không kèm theo tham số gì thì có nghĩa là ta đóng tất cả các tệp đang mở.
Ngoài ra, ta cũng có thểđóng tất cả các tệp đang mở bằng mệnh đề Reset. Ghi lên tệp tuần tự (văn bản)
Bài giảng Lập trình trong Access
Write #<số_hiệu_tệp>,[<danh sách biểu thức>]
Mệnh đề này dùng để ghi dữ liệu kiểu số, chuỗi và kiểu DATE/TIME lên một tệp tuần tự. Mỗi câu lệnh Write sẽ ghi một dòng văn bản lên tệp. Dòng văn bản gồm các giá trị ứng với các biểu thức được phân cách nhau bởi dấu phẩy. Mỗi giá trị chuỗi được bao bọc trong 2 dấu nháy kép. Giá trị kiểu DATE được ghi lên tệp theo định dạng #2006-11-20# (tức là: năm-tháng-ngày). Giá trị kiểu TIME được ghi lên tệp theo dạng #10:27:39# (giờ:phút:giây). Một câu lệnh WRITE không kèm theo biểu thức sẽ ghi một dòng trống lên tệp. Kết quả, ta nhận được một tệp văn bản, nội dung của nó có thể xem được bằng các hệ soạn thảo văn bản. Ví dụ: Chúng ta sẽ viết một thủ tục ghi một số thứ lên một file với tên là “test.abc”, sau đó chúng ta sẽ kiểm tra nội dụng file này. Chú ý: thư mục “C:\access” đã tồn tại.
Dịch và chạy thử chương trình trong cửa sổ Immediate.
Mở thư mục access trong ổ C ra, ta thấy có file “test.abc”. Dùng trình soạn thảo Notepad mở file này, ta có kết quả như sau:
Bài giảng Lập trình trong Access
Đọc từ tệp tuần tự (văn bản)
Input #<số_hiệu_tệp>,[<danh sách các biến>]
Mệnh đề này dùng đểđọc dữ liệu kiểu số, kiểu chuỗi và kiểu DATE/TIME từ một tệp văn bản và chứa vào các biến tương ứng với chú ý: dữ liệu trên tệp và biến tương ứng (biến chứa dữ liệu) phải cùng kiểu. Danh sách các biến phân cách nhau bởi dấu phẩy.
Ví dụ:đọc tệp chứa các số sau:
Bài giảng Lập trình trong Access
Khi thực thi thủ tục trên, ta thu được kết quả như sau:
Ghi trên tệp ngẫu nhiên / nhị phân
Mệnh đề Put dùng để ghi giá trị của một biến (kiểu số, chuỗi và DATE/TIME) lên một tệp ngẫu nhiên / nhị phân. Kết quả, ta nhận được một tệp nhị phân. Cú pháp như sau:
PUT #<số_hiệu_tệp>, [số_hiệu_bản_ghi ,] <tên_biến>
trong đó:
số_hiệu_bản_ghi: là một biểu thức nguyên dương biểu thị số hiệu bản ghi đối với tệp ngẫu nhiên (hoặc số hiệu byte đối với tệp nhị phân). Việc ghi sẽ thực hiện từ bản ghi hoặc byte này.. Nếu vắng mặt, việc ghi sẽ bắt đầu từ bản ghi hoặc byte hiện tại trên tệp. Bản ghi (hoặc byte) đầu ứng với số_hiệu_bản_ghi = 1.
Bài giảng Lập trình trong Access
Chú ý vềđộ dài của bản ghi:
Độ dài của bản ghi được quy định bởi đối Len trong mệnh đề OPEN. Nó chỉ thực sự cần thiết đối với tệp Random. Cách xác định độ dài bản ghi:
9 Với các biến có độ dài xác định (mọi kiểu trừ String) thì độ dài bản ghi cần lớn hơn hoặc bằng độ dài của biến.
9 Riêng đối với biến kiểu chuỗi có độ dài biến đổi cần lường trước độ dài cực đại (số kí tự tối đa cần nhập). Độ dài bản ghi ≥ (độ dài cực đại + 2) (2 byte dùng để ghi nhận độ dài của chuỗi).
Kết quả thực hiện:
9 Đối với tệp ngẫu nhiên, mỗi câu lệnh PUT sẽ:
Đưa nội dung của biến vào một phòng đợi có độ dài Len byte, sau đó ghi cả Len byte của phòng đợi lên tệp tại bản ghi thứ
số_hiệu_bản_ghi.
Nếu phòng đợi quá nhỏ không chứa được giá trị của biến thì sẽ thông báo lỗi: Bad Record Length.
9 Đối với tệp nhị phân:
Ghi giá trị của biến lên tệp tại byte thứ số_hiệu_bản_ghi.
Số byte được ghi sẽ bằng độ lớn của biến. Đọc từ tệp ngẫu nhiên/ nhị phân
Mệnh đề GET dùng đểđọc dữ liệu từ một tệp Random / Binary và chứa vào một biến. Cú pháp như sau:
GET #<số_hiệu_tệp>,[số_hiệu_bản_ghi ,] <tên_biến>
trong đó:
số_hiệu_bản_ghi: là một biểu thức nguyên dương biểu thị số hiệu bản ghi đối với tệp ngẫu nhiên (hoặc số hiệu byte đối với tệp nhị phân). Việc đọc sẽ thực hiện từ bản ghi hoặc byte này.. Nếu vắng mặt, việc đọc sẽ bắt đầu từ bản ghi hoặc byte hiện tại trên tệp. Bản ghi (hoặc byte) đầu ứng với số_hiệu_bản_ghi = 1.
Chú ý:
9 Đối với tệp Random, đối số Len trong mệnh đề OPEN đểđọc cần bằng độ dài bản ghi trên tệp cần đọc.
9 Dữ liệu chứa trên tệp và biến nhận dữ liệu tương ứng phải có cùng kiểu. Kết quả thực hiện:
9 Đối với tệp ngẫu nhiên, mỗi câu lệnh GET sẽ:
Đọc len byte từ tệp và chứa vào phòng đợi (có độ dài Len byte). Lấy một số byte từ phòng đợi (bằng độ dài của biến) và gán cho biến.
Bài giảng Lập trình trong Access
9 Đối với tệp nhị phân, mỗi câu lệnh GET sẽ đọc một số byte bằng độ dài của biến từ tệp và đưa vào biến.
Ví dụ:
Kết quả:
Các hàm dùng trong thao tác tệp:
9 Eof(<số_hiệu_tệp>): Hàm này trả về giá trị True nếu con trỏ tệp đặt tại cuối tệp, ngược lại, hàm trả về trị False.
9 Lof(<số_hiệu_tệp>): cho biết độ dài của tệp tính theo byte. Ví dụ: để xác định số bản ghi trên một tệp Random, ta chia độ dài tệp cho độ dài bản ghi:
Open “DSTS.xyz” For Random As #1 Len = 20 So_ban_ghi = LOF(1)/20
Bài giảng Lập trình trong Access
9 Seek(<số_hiệu_tệp>): cho biết vị trí hiện tại của con trỏ tệp. Đó là một giá trị nguyên trong khoảng từ 1 đến 2147483647. Đối với tệp Random, hàm cho biết số hiệu của bản ghi tính từ 1 mà con trỏ tệp đang định vị. Đối với các tệp còn lại, hàm cho biết số hiệu byte tính từ 1 mà con trỏ tệp đang định vị.
Mệnh đề Seek:
SEEK [#]<số_hiệu_tệp>, Vị_trí
trong đó, Vị_trí là số nguyên dương trong khoảng từ 1 đến 2147483647 xác định vị trí mà con trỏ tệp sẽ di chuyển tới.
9 Đối với tệp Random, Vị_trí là số hiệu bản ghi tính từ 1. 9 Đối với tệp Binary, Vị_trí là số hiệu byte tính từ 1. 9 Chú ý:
Nếu Vị_trí = 0 hoặc âm thì sẽ báo lỗi
Nếu Vị_trí lớn hơn số bản ghi hiện có (Ví dụ: trên tệp chỉ có 6 bản ghi mà Vị_trí = 9) thì con trỏ tệp sẽđịnh vị tại cuối tệp.
Bài giảng Lập trình trong Access
Chương 5