Đối tượng đơn thể trong CSDL Access có tác dụng hỗ trợ thêm các thao tác cho các đối tượng khác nhau như Form, Report, Macro, Table, Query nhằm làm cho các ứng dụng trên Access được uyển chuyển và đáp ứng được nhiều yêu cầu phức tạp.
Đối tượng đơn thể trong CSDL Access là một tâp hợp các chương trình con (thủ tục và hàm) được viết theo ngôn ngữ Access Basic là một ngôn ngữ thông dụng hiện nay và được Microsoft cài đặt trên hầu hết các sản phẩm của mình có hỗ trợ của lập trình.
Các đơn thể trong Access Basic được sử dụng với mục đích khắc phục những hạn chế của macro, nó cho phép người dùng thực hiện được các công việc tỉ mỉ và phức tạp mà công cụ macro không thực hiện được.
Các thủ tục trong đơn thể thường được sử dụng để sử lý các sự kiện của các đối tượng khác như Form, Report, và ngoài ra còn có thể can thiệp chi tiết đến tất cả các đối tượng cúa Access. Các hàm trong đơn thể thường được sử dụng để tính toán các công thức, các thao tác mà không có trong các hàm chuẩn. Các hàm thường sử dụng trong truy vấn, mẫu biểu và báo biểu.
10.2 Một số lệnh và một số quy ước khi lập trình trong Microsoft Access Modules Các kiểu dữ liệu Tên các kiểu dữ liệu Kích thước Giới hạn dữ liệu Byte 1 byte 0->255
Boolean 2 bytes True hoặc False Integer 2 bytes -32,768->32,767
Long 4 bytes -2,147,483,648->2,147,483,647
Single 4 bytes -3.402823E38->-1.401298E-45 cho giá trị âm 1.401298E-45->3.402823E38 cho giá trị không âm
Chương 10: Đơn thể (Module)
4.94065645841247E-324 cho giá trị âm 4.94065645841247E-324-
>1.79769313486232E308 cho giá trị không âm Currency 8 bytes -922,337,203,685,477.5808- >922,337,203,685,477.5807 Decimal 14 bytes +/-79,228,162,514,264,337,593,543,950,335 không có phần thập phân +/-7.9228162514264337593543950335 với 28 chữ số thập phân
Object 4 bytes Kiểu đối tượng nhúng String (không xác định kích trước chiều dài 10 bytes + chiều dài chuỗi 0 xấp xỷ 2 tỷ ký tự
String (chiều dài xác định trước) Length of string 1 đến xấp xỷ 65,400 ký tự Variant(dùng cho số)
16 bytes Một số bất kỳ trong giới hạn kiểu Double Variant(dùng ho
ký tự)
22 bytes + chiều dài chuỗi
Như giới hạn trong chuỗi String không xác định chiều dài trước
Khai báo biến
Lệnh: Dim Tên_biến[As kiểu]
Lệnh Dim cho phép khai báo 1 hoặc nhiều biến với kiểu xác định hoặc không xác định kiểu thì biến có kiểu Variant.
Khai báo mảng: Dim tên_biến_mảng(<số phần tử>)[As kiểu]
Khai báo với số phần tử xác định. Chỉ số bắt đầu của mảng là 0 hay 1 tuỳ thuộc vào tuỳ chọn Option Base khai báo ở đầu đơn thể.
Có thể khai báo mảng với phần tử đầu và cuối được xác định rõ theo cú pháp: Dim tên_tên_mảng(<chỉ số đầu> to <chỉ số cuối>) [As kiểu]
Một số hàm sử dụng khi lập trình access
ABS(số): Trả về giá trị tuyệt đối. INT(số): Trả về phần nguyên của số.
Chương 10: Đơn thể (Module)
NOW(): Trả về ngày giờ hiện hành của hệ thống.
DAY(ngày), MONTH(ngày), YEAR(ngày): Trả về ngày tháng năm của
môt ngày.
WEEKDAY(ngày): Trả về từ 1 đến 7 là thứ của ngày trong tuần theo quy
định 1: chủ nhật, 2: thứ hai,....
STR(số): Trả về biểu diễn kiểu số.
VAL(chuỗi): Trả về kiểu Double tương ứng với biểu diễn của chuỗi.
LTRIM(chuỗi), RTRIM(chuỗi), TRIM(chuỗi): Các hàm cắt bỏ khoảng
trống ở đầu và cuối chuỗi.
UCASE(chuỗi): Hàm trả về chuỗi chữ hoa tương ứng của chuỗi. LCASE(chuỗi): Hàm trả về chuỗi chữ thường tương ứng của chuỗi. LFFT(chuỗi,n): Trích từ chuỗi n ký tự từ bên trái.
RIGHT(chuỗi,n): Trích từ chuỗi n ký tự từ bên phải MID(chuỗi,m,n): Trích từ chuỗi n ký tự từ ký tự thứ m.
IIF(<điều kiện>,<giá trị 1>, <giá trị 2>): Trả về giá trị 1 điều kiện đúng
và giá trị 2 điều kiện sai.
INPUTBOX(<thông báo>,[tiêu đề],[giá trị ngầm định],[vị trí cột], [vị trị dòng]): Hàm này cho phép nhập dữ liệu từ bàn phím qua 1 cửa sổ. Giá trị
trả về của hàm có kiểu String là giá trị nhập vào.
INSTR(<chuỗi 1>, <chuỗi 2>): Trả về kết quả vị trí xuất hiện chuỗi 1
trong chuỗi 2.
10.3 Cách tạo và sửa một thủ tục biến cố
Cách 1:
Trong cửa sổ thiết kế mẫu biểu hoặc báo biểu, chọn ô điều khiển cần gắn với các thủ tục xử lý.
Trong bảng các thuộc tính của ô điều khiển, chọn các thuộc tính của sự kiện cần gắn với các thủ tục xử lý rồi chọn nút xuất hiện hộp thoại Choose Builder thì chọn mục Code Builder sẽ xuất hiện cửa sổ soạn thảo thủ tục gồm 2 dòng có sẵn có dạng:
Chương 10: Đơn thể (Module)
End Sub
Nội dung của thủ tục được soạn giữa Sub và End sub.
Ví dụ với ô điểu khiển nút lệnh có tên “Them”, thủ tục sử lý khi nhắp chuột (On click) sẽ có tên: Them_Click.
Cách 2:
Trong cửa sổ thiết kế mẫu biểu hoặc báo biểu chọn trên menu View/Code, cửa sổ đơn thể của biểu mẫu hoặc biểu xuất hiện có dạng:
Hình X-1
Trong cửa sổ trên, chọn tên ô điều khiển, cần gắn với thủ tục xử lý trong mục Object và loại sự kiện cần gắn với mục Procedure, khi đó Access sẽ tự động tạo ra thủ tục tương ứng
10.4 Hàm người dùng
10.4.1 Sự cần thiết của việc tạo hàm người dùng
Trong Access có rất nhiều nhưng không thể đáp ứng mọi yêu cầu của người sử dụng. Chúng ta cần tự tạo ra những đoạn mã lệnh bằng Access Basic và tổ chức nó thành một đơn vị gọi là hàm người dùng.
Khi viết các hàm chung có đặc điểm thuận lợi sau:
- Mỗi lần tính toán giá trị của các biểu mẫ giống nhau hoàn toàn không sai lệch.
Chương 10: Đơn thể (Module)
- Nếu cần thay đổi nào đó có thể quay lại sửa tại một điểm mà thôi.
- Khi thực hiện các phép tính phức tạp chúng ta có thể sử dụng các cấu trúc điều khiển một cách thuận tiện.
- Có thể ghi chú cho công việc bằng ký tự nháy đơn
10.4.2 Tạo mới một hàm
- Cú pháp của hàm:
Function Tênhàm(Danh sách các đối số) Các câu lệnh để tính trị cho hàm End Function
- Trong cửa sổ cơ sở dữ liệu chọn đối tượng Module, chọn New
- Trong cửa sổ soạn thảo mã lệnh chọn thực đơn Edit->New Procedure- >trong hộp type chọn Function và gõ tên trong hộp Name, OK
- Thực hiện soạn thảo nội dung của hàm:
+ Cửa sổ Module hiện ra với tiêu đề Module:Module1. Trong khu vực soạn thảo chỉ có một dòng lênh duy nhất: “Option Compare Database use database order for string comparisions”
+ Nhập vào đoạn mã lệnh bằng câu lệnh Visual Basic. + Lưu trữ Module
10.4.3 Biên dịch thủ tục hoặc hàm
- Sau khi viết xong các câu lệnh tính toán trong hàm, ta cần biên dịch để phát hiện sai sót ngoài ý muốn trong khi viết lệnh bằng cách: Run->Compile Loaded Modules. Nếu phát hiện ra lỗi thì hệ thống thông báo và quay trở lại sửa chữa.
- Sau khi dịch xong ra có nhắp vào biểu tượng thử trực tiếp để mở cửa sổ Immediate Windows (View->Immediate Windows). Trong cửa sổ này thử gõ ? <tênhàm> (các tham số thực sự)
10.4.4 Sử dụng hàm
Có thể gọi sử dụng hàm tại các vị trí sau: - Trong các thủ tục hạơc các hàm khác.
- Một biểu thức định nghĩa tính toán trong một truy vấn, một điều khiển trên biểu mẫu hoặc báo cáo.
Chương 10: Đơn thể (Module)
- Một điều kiện cho truy vấn hoặc tập lệnh
10.4.5 Ví dụ minh họa
Thủ tục mở một bảng với tên bảng nhập từ bàn phím
Sub Mo_bang() On Error GoTo loi Dim ten_bang As String
Ten_bang=InputBox(“cho biết tên bảng cần mở”)
DoCmd.OpenTable ten_bang, acViewNormal, acReadOnly Exit Sub
Loi:
MsgBox(“Không có bảng”&ten_bang) Resume Next
End Sub
Hàm chuyển năm âm lịch sang năm dương lịch
Option Compare Database
Public Function canchi(duonglich) Dim can, chi
Dim j, i As Integer
can = Array("Giap", "At", "Binh", "Dinh", "Mau", "Ky", "Canh", "Tan", "Nham", "Quy")
chi = Array("Ti", "suu", "Dan", "Meo", "Thin", "Ty", "Ngo", "Mui", "Than", "Dau", "Tuat", "Hoi")
i = (duonglich - 4) Mod 10 j = (duonglich - 4) Mod 12
canchi = can(i) & Space(1) & chi(j) End Function
10.5 Các nguyên tắc cơ bản trong ngôn ngữ Access Basic
10.5.1 Các thành phần trong bộ mã lệnh
Chương 10: Đơn thể (Module)
- Các khai báo: là các câu lệnh dùng định nghĩa các biến, hằng, loại dữ liệu do người dùng định nghĩa
- Thủ tục biến cố: là thủ tục tại các biến cố của biểu mẫu hoặc báo cáo hoặc các biến cố của các điều khiển. Chúng sẽ được thực hiện khi các biến cố đó xảy ra. Các thủ tục biến cố này sẽ được cất giữ trong các biểu mẫu hoặc báo cáo tương ứng. Trong Access có hai dạng thủ tục biến cố: Form_tênbiếncố và Tênđiềukhiển_tênbiếncố
- Thủ tục chung: là các thủ tục không trực tiếp liên quan đến một đối tượng hoặc một biến có nào cả. Ta có thể tạo các thủ tục chung này bên trong một bộ mã lệnh chuẩn hoặc bộ mã lệnh lớp. Các thủ tục chung này có thể là một thủ tục hoặc một hàm. Một thủ tục chung chỉ được thi hành khi nào chúng ra gọi đến nó.
10.5.2 Tên mặc định và ảnh hưởng của các loại thủ tục
Vị trí tại Tên thủ tục hoặc hàm Ảnh hưởng đến Biến cố của biểu mẫu Private Sub
Form_Tênbiếncố() Các lệnh End Sub
Tại biến cố của biểu mẫu
Biến cố của điều khiển Private Sub Tênđiềukhiển_Tênbiếncố()
Các lệnh End Sub
Tại biến cố của điều khiển
Bộ mã lệnh của ứng dụng hoặc biểu mẫu
Sub Tênthủtục(các tham số) Các lệnh End Sub Function Tênhàm(các tham số) As Kiểudữliệu Các lệnh End Function
Phụ thuộc vào kiểu dữ của thủ tục hay hàm là Public hay Private mà nó ảnh hưởng đến toàn cục hay cục bộ
Chương 10: Đơn thể (Module)
- Mỗi thủ tục trong Access có thể là một thủ tục con (Sub Procedure) hoặc một thủ tục hàm (Function Procedure). Cả hai đều theo quy tắc:
[Public][Private] Sub Tênthủtục([tham số]) <Lệnh thực hiện>
End Sub
[Public][Private][Static] Function Tênhàm([tham số]) As <Giá trị trả về>
<Lệnh thực hiện> Tênhàm=Giá trị trả về End Function
- Cú pháp gọi thủ tục: Tênthủtục tham số1, tham số2,… hoặc Call Tênthủtục(tham số1, tham số2,..)
10.5.4 Cách đặt tên cho các thành phần trong ngôn ngữ Access Basic
Tên của các thành phần thủ tục con, thủ tục hàm, biến, hằng,…phải tuân theo những nguyên tắc sau:
- Bắt đầu là mọt kú tự từ A->Z, phần còn lại có thể là mẫu tự, số, dấu gạch thấp và có thể dài từ 1 đến tối đa 40 ký tự. Không được chứa các khoảng trắng hoặc các ký tự đặc biệt: ‘, “, !, @, &, $, #. Không chứa các từ khóa của ngôn ngữ Visul Basic
- Tên Sub hay Function phải duy nhất trong cả Database
- Nếu là Sub thì phía sau là cặp dấu ngoặc cho dù bên trong không có tham số.
- Nếu là Function phía sau rên cũng có cặp dấu ngoặc, bên trong dùng ghi các các đối số cung cấp cho hàm. Tuy nhiên cũng có khi một hàm không cần đến thông số, trường hợp này thì cặp dấu ngoặc ghi sau hàm là rỗng nhưng vẫn phải hiện diện, các đối số ngăn cách nhau bởi dấu phẩy.
- Các dòng lệnh End Sub hay End Function thường được Access tự động thêm nếu bạn không gõ vào.
- Một lệnh dù dài bao nhiêu cũng phải kết thúc trên một dòng, không thể ghi nối tiếp một lệnh từ trên xuống dưới. Trên một dòng có thể ghi nhiều lệnh với điều kiện lệnh trước cách lệnh sau bởi dấu hai chấm (:)
Chương 10: Đơn thể (Module)
- Phía sau câu lệnh có thể có thể thêm chú thích, với điều kiện khởi đầu chú thích bằng dấu nháy đơn.
- Bên cạnh lệnh cong có thế có các dòng nhãn, có tên do người sử dụng đặt theo quy cách tên Sub hay Function. Nhãn được ghi ở đầu dòng, tiếp theo phải có dấu hai chấm, phần còn lại của nhãn có thể viết thêm một hay nhiều lệnh của Basic hoặc chỉ riên nhãn đứng trên một dòng. Nhãn lệnh trong thủ tục nào chỉ tham chiếu trong thủ tục đó, tuy nhiên nhiều thủ tục khác nhau trong cùng Mudule thì không được sử dụng các nhãn trùng nhau.
10.5.5 Sử dụng đối tượng Docmd
- Trong khi sử dụng ngôn ngữ Visual Basic có thể thực hiện các hành động tương ứng trong công cụ tập lênh bằng cách sử dụng phương thức của đối tượng Docmd.
- Cú pháp chung: Docmd.Tênphươngthức[Các tham số]
+ Tên phương thức: Danh sách các phương thức tương ứng với các hành động trong tập lệnh.
+ Các tham số: Các tham số tương ứng trong một phương thức.
+ Ví dụ: Để đóng biểu mẫu CAPNHAT, ta dùng phương thức CLOSE của đối tượng Docmd như sau: Docmd.Close acForm, “CAPNHAT”.
Khi có acForm là hằng số chỉ định loại đối tượng biểu mẫu đóng và chuỗi CAPNHAT là tên của biểu mẫu. Dấu phẩy để ngăn cách các tham số trong trường hợp phương thức có nhiều tham số.
10.6 Một số cấu trúc thường dùng ngôn ngữ Access Basic10.6.1 Cấu trúc lặp 10.6.1 Cấu trúc lặp
* Số lần lặp không xác định trước:
Cấu trúc lặp DO UNTIL
DO UNTIL <điều kiện> <công việc> LOOP
Cấu trúc này thực hiện công việc cho đến khi điều kiện đúng. Hoặc DO
Chương 10: Đơn thể (Module)
LOOP UNTIL <điều kiện>
Cấu trúc này thực hiện công việc cho đến khi điều kiện đúng. Để thoát khỏi cấu trúc DO mà không kiểm tra điều kiện dùng lệnh EXIT DO
* Số lần xác định trước:
Cấu trúc lặp FOR
FOR biến = <giá trị đầu> TO <giá trị cuối> [STEP n] <Công việc>
NEXT biến
Để thoát khỏi vòng lặp FOR ta dùng lệnh Exit FOR
10.6.2 Cấu trúc If ... Then ... Else
IF <điều kiện> THEN <Công việc 1> ELSE
<Công việc 2> ENDIF
10.6.3 Cấu trúc chọn lựa
SELECT CASE <biểu thức chọn>
CASE <danh sách trị 1>: <Công việc 1> ....
CASE ELSE: END SELECT
10.7 Làm việc với biến, hằng số, mảng
* Biến:
- Khai báo biến bằng lệnh DIM, Dùng ở cấp Module và Procedure để khai báo các biến và phân phố không gian bộ nhớ cho các biến đó.
DIM Tênbiến [As kiểu dữ liệu]
Kiểu dữ liệu có thế la String, Integer, Currecy. Nếu bỏ qua khai báo thì biến có kiểu là Variant. Tên biến không phân biệt chữ hoa, chữ thường.
Chương 10: Đơn thể (Module)
Các biến sử dụng trong một thủ tục: chỉ được nhận ra ở tại thủ tục mà chúng được khai báo và được xem như dạng biến cục bộ và được khai báo bằng lệnh DIM hoặc STATIC. Ví dụ:
Dim intTemp As Integer Static intTemp As Integer
Các biến sử dụng trong một bộ mã lệnh: Một biến cấp bộ mã lệnh cho phép tất cả các thủ tục trong bộ mã lệnh đó sử dụng nhưng không thể cho các bộ mã lệnh khác.
Ví dụ:
Option Compare Database Option Explicit
Dim intTemp As Integer hoặc Private intTemp As Integer
(Tại cấp bộ mã lệnh không có sự khác biệt giữa Dim và Private)
Các biến dùng chung cho tất cả các bộ mã lệnh: Để tạo ra các biến dùng chung cho tất cả các bộ mã lệnh ta phải dùng từ khóa Public để khai báo. Nó cho phép tất cả các thủ tục của toàn bộ các bộ mã lệnh trong ứng dụng đều sử dụng được.
Ví dụ: Public intTemp As Interger
* Hằng số: Là một tên đầy đủ dùng thay thế cho một chuỗi, một số mà giá trị không đổi. Hằng số có thể do hệ thống định nghĩa (thường bắt đầu bằng chữ ac của Access, vb của Visual Basic, db của Data Access hoặc do người dùng định nghĩa.
- Định nghĩa hằng số theo cú pháp:
[Public/Private] Const Tênhằng [As Integer] = Biểu thức Ví dụ: Const pi = 3.1416
Public Const chuoi = “Hang so”
- Có thể khai báo nhiều hằng số trên cùng một dòng và các hằng cách nhau bởi dấu phẩy.
Chương 10: Đơn thể (Module)
- Để chỉ một dãy các biến cùng tên và sử dụng một số chỉ mục để chỉ ra các phần tử của mảng. Tất cả các phần tử trong một mảng phải có cùng một kiểu dữ liệu. Nếu mảng có kiểu Variant thì các phần tử của mảng có thể có các loại dữ liệu khác nhau.
- Khai báo mảng có kích thước cố định:
+ Mảng toàn cục sử dụng câu lệnh Public trong phần khai báo của bộ mã lệnh.
+ Mảng cấp bộ mã lệnh: sử dụng câu lệnh Dim hoặc Private
+ Mảng cục bộ: Sử dụng câu lệnh Dim hoặc Static trong thủ tục sử dụng mảng
Ví dụ: Dim intCount(14) As Integer -> mảng số nguyên gồm 15 phần tử từ 0 đến 14
hoặc Dim intCount(1 To 15) As Integer mảng số nguyên gồm 15 phần tử từ 1 đến 15
+ Mảng nhiều chiều:
Ví dụ: khai báo mảng hai chiều mỗi chiều gồm 10 phần tử Static dbMatrax (9,9) As Double hoặc