Bài giảng Lập trình quản lý - Tổng quan về VBA

doc 76 trang hapham 3600
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình quản lý - Tổng quan về VBA", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • docbai_giang_lap_trinh_quan_ly_tong_quan_ve_vba.doc

Nội dung text: Bài giảng Lập trình quản lý - Tổng quan về VBA

  1. Bài giảng LẬP TRÌNH QUẢN LÝ - TỔNG QUAN VỀ VBA
  2. MỤC LỤC Chương I 1 TỔNG QUAN VỀ VBA 1 I. Giới thiệu ngôn ngữ VBA 1 II. Module 1 III. Môi trường lập trình VBA 2 Chương II 5 CÁC KIẾN THỨC CƠ BẢN 5 I. Các kiểu dữ liệu cơ bản 5 1. Boolean 5 2. Byte 5 3. Integer 5 4. Long 5 5. Single 5 6. Double 5 7. Currency 5 8. String 5 9. Date 6 10. Variant 6 11. Object 6 12. Mảng 7 II. Biến và cách sử dụng biến 7 1. Biến, khai báo biến đơn giản 7 2. Phạm vi biến 8 3. Khởi tạo biến 8 III. Hằng và cách sử dụng hằng 9 1. Khai báo hằng 9 2. Phạm vi hằng 9 Chương III 10 CÁC CẤU TRÚC LỆNH VBA 10 I. Cấu trúc IF ENDIF 10 II. Cấu trúc SELECT CASE END SELECT 11 III. Cấu trúc FOR NEXT 14 IV. Cấu trúc WHILE WEND 16 V. Lệnh DoCmd 17 1. Lệnh đóng một đối tượng 17 2. Lệnh mở form 18 3. Lệnh mở report 18 4. Lệnh thi hành câu lệnh SQL 19 Chương IV 20 CHƯƠNG TRÌNH CON 20 I. Chương trình con dạng hàm 20 II. Chương trình con dạng thủ tục 23 III. Một số hàm có sẵn 24 1. Hàm MsgBox 24 2. Hàm InputBox 25 3. Hàm IsEmpty 25 4. Hàm Switch() 26 IV. Kỹ thuật xử lý lỗi 26 1. Xử lý lỗi 26
  3. 2. Bẫy lỗi 29 3. Ví dụ 31 Chương V 36 LẬP TRÌNH CƠ SỞ DỮ LIỆU 36 I. Giới thiệu kỹ thuật DAO 36 II. Các lớp đối tượng DAO 37 III. Đối tượng Database 39 IV. Đối tượng RecordSet 40 1. Khai báo 40 2. Một số thuộc tính của Recordset 40 3. Một số phương thức của Recordset 41 V. Đối tượng QueryDef 44 VI. Đối tượng TableDef 45 VII. Đối tượng Relation 48 VIII. Đặt lọc dữ liệu 49 Chương VI 52 MACRO VÀ GIAO DIỆN 52 I. Macro 52 1. Tạo và sử dụng Macro 52 2. Các hành động và các tham số của Macro 53 3. Gắn Macro với các sự kiện trên Form/Report 56 II. Menu và Toolbar 56 1. Tạo Menu 56 2. Gắn kết Menu, Toolbar 62 BÀI TẬP 65 Chương I
  4. TỔNG QUAN VỀ VBA I. Giới thiệu ngôn ngữ VBA Access không những là hệ quản trị CSDL rất mạnh - cụ thể các bạn đã được tìm hiểu rất kỹ học phần Lập trình 2 ở học kỳ trước. Hơn nữa, với những công cụ có sẵn đi kèm như Forms, Report, Macros và đặc biệt là ngôn ngữ lập trình VBA – Access sẽ còn là một công cụ phát triển phần mềm rất mạnh, dễ sử dụng cho các ứng dụng quản lý vừa và nhỏ. Nội dung học phần này sẽ trình bày căn bản về ngôn ngữ lập trình VBA (Visual Basic for Application)- một ngôn ngữ khá quen thuộc đối với những người sử dụng chuyên sâu sản phẩm Microsoft Office. Đây chính là cơ sở quan trọng để các bạn tiếp cận cụ thể chuyên ngành lập trình CSDL sẽ được giới thiệu trong chương tiếp theo. Qua học phần này, học viên sẽ hiểu được môi trường làm việc ngôn ngữ VBA; biết cách sử dụng các cấu trúc lệnh; viết và sử dụng tốt chương trình con; đặc biệt dần làm quen việc lập trình trên các đối tượng ActiveX- sẵn sàng tiếp cận các công cụ lập trình hướng đối tượng trực quan hiện đại như Visual Basic và Visual Basic .NET. II. Module VBA là ngôn ngữ lập trình chung cho các ứng dụng của Microsoft Office bao gồm Access, Word, Excel và PowerPoint. Nó giúp ta tạo các module chương trình gồm các hàm và thủ tục nhằm xử lý dữ liệu và điều khiển các đối tượng trong CSDL một cách linh hoạt. Trong Access Module gồm hai loại: 1) Đối tượng Module Để xem các đối tượng Module trong CSDL, ta chọn đối tượng Module trong cửa sổ Database. Để tạo một module mới, chọn đối tượng module và nhấn nút New trên thanh công cụ của cửa sổ Database, xuất hiện của sổ làm việc của Visual Basic, ta soạn thảo các mã lệnh của module trong cửa sổ này. Cấu trúc của module có 3 phần: - Khai báo biến dùng chung cho chương trình; - Các hàm; - Các thủ tục. Các hàm và các thủ tục của module có thể chạy trực tiếp hoặc chạy gián tiếp qua các nút lệnh trên Form. Để gọi một thủ tục thuộc đối tượng module từ bên ngoài module này ta dùng cú pháp: TênModule.Tênthủtục. Tên module nên đặt ngắn gọn và gợi nhớ. 2) Module biểu mẫu hay báo cáo:
  5. Được dùng để chứa các thủ tục đáp ứng các sự kiện trên Form hay Report, nó đi kèm với Form/Report, khi ghi Form/Report vào đĩa module này cũng được ghi theo. Để hiệu chỉnh module đi kèm với Form/Report, ta mở Form/Report ở chế độ Design và dùng lệnh View / Code, xuất hiện cửa sổ Visual Basic chứa mã lệnh của toàn bộ module gồm các thủ tục đáp ứng các sự kiện trên Form/Report. Các sự kiện trên Form có thể là: mở Form, đóng Form, nháy một nút lệnh để thực hiện một thao tác nào đó, nhập dữ liệu vào hộp văn bản, gõ tổ hợp phím, III. Môi trường lập trình VBA Bộ phần mềm tin học văn phòng Microsoft Office phải nói là nổi tiếng nhất thế giới trong lĩnh vực tin học văn phòng. Word cung cấp khả năng chế bản điện tử đẹp đẽ và hiện đại; Excel với khả năng bảng tính điện tử mạnh mẽ; FrontPage với khả năng tạo ra các trang web sống động; Access với khả năng quản trị CSDL; tất cả các phần mềm đó đã tạo nên sự phổ biến của bộ phần mềm này với hầu hết người dùng máy tính trên toàn thế giới. Không dừng ở mức ứng dụng có sẵn, bộ phần mềm này còn có một ngôn ngữ lập trình đi kèm VBA – Visual Basic for Application để giúp người dùng có thể tạo ra các tuỳ biến mạnh hơn, thân thiện hơn với trong công việc của mình. Với Word, Excel bạn hoàn toàn có thể tự tạo ra các macro để tăng tốc độ sử dụng ứng dụng; hơn thế nữa VBA trên Access đã thể hiện tính chuyên nghiệp trong lập trình, phần nào biến được một CSDL đơn giản trở thành những sản phẩm đóng gói thương mại. Cửa sổ làm việc của VBA được kích hoạt trong 3 trường hợp: - Mở một đối tượng Module trong kiểu xem Design - Mở Form/Report trong chế độ Design và dùng lệnh View / Code - Nháy vào nút Build của một thuộc tính có khả năng kèm theo một thủ tục trong hộp thoại Properties của một nút lệnh đang thiết kế trên Form. Màn hình làm việc ngôn ngữ VBA thường có dạng:
  6. Trong đó: (1) Hệ thống thực đơn và thanh công cụ Cũng như bất kỳ môi trường làm việc nào đều có hệ thống thực đơn và thanh công cụ đi kèm. Trên đó có chứa các lệnh để gọi, thi hành hoặc thiết lập các điều khiển cần thiết. (2) Cửa sổ Project Explorer Có rất nhiều các thành phần có thể lập trình được bởi VBA như: Forms, Reports, Modules. Cửa sổ Project Explorer là cây phân cấp lớp các đối tượng có chứa mã lệnh VBA, đồng thời giúp lập trình viên dễ dàng trong việc viết (coding) cũng như quản lý các mã lệnh VBA đã viết. (3) Cửa sổ viết lệnh Cửa sổ viết lệnh là nơi soạn thảo các dòng lệnh VBA. Mỗi cửa sổ sẽ chứa toàn bộ mã lệnh cho một đối tượng như: Forms, Reports, Modules. Trong mỗi cửa sổ có thể có nhiều phần được viết lệnh, mỗi phần có thể là nội dung một khai báo, một chương trình con, nội dung một thủ tục đáp ứng sự kiện. Ví dụ:
  7. (4) Cửa sổ Intermediate Cửa sổ Intermediate là nơi giúp thi hành trực tiếp một câu lệnh nào đó, rất hữu dụng trong việc gỡ lỗi phần mềm (sẽ quay trở lại vấn đề gỡ rối phần mềm ở cuối chương)
  8. Chương II CÁC KIẾN THỨC CƠ BẢN I. Các kiểu dữ liệu cơ bản Cũng như các ngôn ngữ lập trình khác, VBA đều hỗ trợ các kiểu dữ liệu cơ bản. Dưới đây giới thiệu chi tiết về từng kiểu. 1. Boolean Kiểu logic, tương tự kiểu Boolean trên Pascal. Kiểu này chiếm 2 byte bộ nhớ; chỉ nhận một trong 2 giá trị là: Yes – No hoặc True – False hoặc đôi khi thể hiện dưới dạng số 0 tương đương với False, True tương ứng với bất kỳ số nào khác 0. Khi lập trình CSDL, kiểu Boolean tương ứng với kiểu Yes/No trong bảng dữ liệu. 2. Byte Kiểu số nguyên dương trong phạm vi từ 0 255. Kiểu này chiếm 1 byte bộ nhớ. 3. Integer Kiểu nguyên, có giá trị trong khoảng -32768 32767. Kiểu này chiếm 2 bytes bộ nhớ. 4. Long Kiểu số nguyên dài, có giá trị trong khoảng 2,147,483,648 2,147,483,647. Kiểu này chiếm 4 bytes bộ nhớ. 5. Single Kiểu số thực, có giá trị trong khoảng 1.401298E-45 to 3.402823E38. Chiếm 4 bytes bộ nhớ. 6. Double Kiểu số thực có đợ lớn hơn kiểu Single, có giá trị trong khoảng 4.94065645841247E- 324 to 1.79769313486232E308. Chiếm 8 bytes bộ nhớ. 7. Currency Kiểu tiền tệ. Bản chất là kiểu số, độ lớn 8 bytes, có giá trị trong khoảng 922,337,203,685,477.5808 to 922,337,203,685,477.5807. Đặc biệt, kiểu này luôn có ký hiệu tiền tệ đi kèm. 8. String Kiểu xâu ký tự. Kiểu này tương ứng với kiểu String trong Pascal, tương ứng với kiểu Text trong các trường CSDL Access. Độ lớn tối đa 255 bytes tương đương với khả năng xử lý xâu dài 255 ký tự.
  9. Xâu rỗng là xâu không chứa ký tự nào, ký hiệu xâu rỗng S là S = “” Có hai kiểu xâu: - Xâu có độ dài cố định, được khai báo như sau: Dim Hoten as String*25 - Xâu có độ dài thay đổi, được khai báo như sau: Dim Diachi as String 9. Date Dữ liệu kiểu ngày chiếm 8 bytes. Kiểu dữ liệu ngày được khai báo như sau: Dim dt as Date Dt = #01/02/89# 10. Variant Variant là kiểu dữ liệu không tường minh. Biến kiểu này có thể nhận bất kỳ một giá trị nào có thể. Ví dụ : Dim a as Variant a = 123 a = “Nguyễn Văn An” Hoàn toàn không có lỗi. Người ta thường khai báo biến kiểu Variant trong những trường hợp phải xử lý biến đó mềm dẻo. Khi thì biến nhận giá trị kiểu này, khi thì nhận giá trị và xử lý theo kiểu dữ liệu khác. 11. Object Object là một loại biến kiểu Variant, chiếm dung lượng nhớ 4 bytes, dùng để tham chiếu tới một loại đối tượng (Object) nào đó trong khi lập trình. Tất nhiên muốn khai báo biến Object kiểu nào, phải chắc chắn đối tượng đó đã được đăng ký vào thư viện tham chiếu VBA bởi tính năng Tool | Reference. Access VBA/DAO có một số kiểu dữ liệu bổ sung dưới dạng kiểu đối tượng. Chẳng hạn một số kiểu đối tượng của Access: Form, Module, Report, Một số kiểu đối tượng của DAO: Workspace, Database, Recordset, Field, Ta có thể khai báo biến đối tượng như sau: Dim db as Database Dim rs as Recordset Dim f as Form Đối với các biến đối tượng, khi gán giá trị cần phải dùng câu lệnh set db = currentDb. 12. Mảng
  10. Biến mảng là tập hợp các biến mang một tên chung. Ví dụ: Để lưu 10 đối tượng trường vào một biến ta dùng khai báo Dim A(1 to 10) as Field, các phần tử của A là A(1), ,A(10) Nếu khai báo là Dim A(10) As Field thì A có 11 phần tử A(0), ,A(10) Đoạn mã sau nhằm đặt kiểu dữ liệu cho 10 trường là Integer: For I = 1 to 10 A(i).Type = dbInteger Next i * Khai báo mảng nhiều chiều: Dim A(1 to 10, 1 to 100) as Integer II. Biến và cách sử dụng biến 1. Biến, khai báo biến đơn giản Biến (Variable) là thành phần của một ngôn ngữ lập trình, giúp xử lý dữ liệu một cách linh hoạt và mềm dẻo. Thông thường trong các ngôn ngữ lập trình, mỗi biến khi tồn tại phải được định kiểu, tức là phải nhận một kiểu dữ liệu xác định. Tuy nhiên trong VBA thì không, mỗi biến có thể định kiểu (được khai báo trước khi sử dụng) hoặc không định kiểu (không khai báo vẫn sử dụng được). Trong trường hợp này biến đó sẽ tự nhận kiểu giá trị Variant. Biến có thể được khai báo bất kỳ ở đâu trong phần viết lệnh của VBA. Tất nhiên, biến có hiệu lực như khai báo chỉ bắt đầu từ sau lời khai báo và đảm bảo phạm vi hoạt động như đã qui định. Vì biến trong VBA hoạt động rất mềm dẻo, nên có nhiều cách khai báo biến như: Ví dụ 1: Khai báo biến i kiểu Integer Dim i As Integer Ví dụ 2: Khai báo 2 biến i, j kiểu Integer Dim i, j As Integer Ví dụ 3: Khai báo biến i kiểu Integer, st kiểu String độ dài 15 ký tự Dim i As Integer, st As String*15 Ví dụ 4: Khai báo biến i kiểu Variant Dim i As Variant hoặc Dim i Ví dụ 5: Khai báo biến txt kiểu Textbox Dim txt As TextBox Ví dụ 6: Khai báo mảng kiểu String*30 gồm 46 phần tử Dim Hoten(45) As String * 45 Ví dụ 7: Khai báo biến mảng 2 chiều A(i , j) trong đó: i = 0 3 và j = 0 4
  11. Dim A(3, 4) As Integer Ví dụ 8: Khai báo mảng 3 chiều A(i, j, k) trong đó: i = 1 5; j = 4 9 và k = 3 5 Dim A(1 To 5, 4 To 9, 3 To 5) As Double Ví dụ 9: Khai báo một mảng động kiểu Variant. Mảng động là mảng không cố định chiều dài. Dim MyArray() 2. Phạm vi biến Như chúng ta đã biết, mỗi biến sau khi được khai báo nó sẽ nhận một kiểu dữ liệu và có một phạm vi hoạt động, tức là lời khai báo biến chỉ có tác dụng trong những vùng đã được chỉ định; ngoài vùng chỉ định đó biến sẽ không có tác dụng, nếu có tác dụng sẽ theo nghĩa khác (biến cục bộ kiểu Variant chẳng hạn). - Biến cục bộ: Biến cục bộ được khai báo sau từ khoá Dim, nó chỉ có tác dụng trong một chương trình con, cục bộ trong một form hoặc một module nào đó. Dưới đây sẽ chỉ ra 3 trường hợp biến cục bộ này: - Trong một chương trình con, nếu nó được khai báo trong chương trình con đó; - Trong cả một Form, nếu nó được khai báo trong phần Decralations của Form đó; - Trong cả một Reports, nếu nó được khai báo trong phần Decralations của Report đó; - Trong cả một Modules, nếu nó được khai báo trong phần Decralations của Modules đó; Biến chỉ có tác dụng sau lệnh khai báo Dim - Biến toàn cục: Biến toàn cục được khai báo sau cụm từ khoá Public, nó có tác dụng trong toàn bộ chương trình (ở bất kỳ chỗ nào có thể viết lệnh). Loại biến này luôn phải được khái báo tại vùng Decralations của một Module nào đó. Ví dụ: Public Hoten(45) As String * 45 Trên một tệp Access, không được phép khai báo trùng tên biến toàn cục. Tuy nhiên tên biến cục bộ vẫn có thể trùng tên biến toàn cục, trong trường hợp đó VBA sẽ ưu tiên sử dụng biến cục bộ trong phạm vi của nó. 3. Khởi tạo biến Sau khi khai báo biến ta phải khởi tạo biến. Khi thủ tục chạy, mọi biến cục bộ được tự động khởi tạo: các biến số khởi tạo bằng 0, xâu có độ dài biến đổi bằng xâu có độ dài bằng 0, xâu có độ dài cố định bằng ký tự Chr(0), biến kiểu Variant bằng Empty, biến đối tượng bằng Nothing. Cách dùng từ khóa Nothing:
  12. - Dùng để xóa một biến đối tượng: Ví dụ: Set rs = Nothing - Dùng xác định xem một biến đối tượng có tham chiếu đến một đối tượng hợp lệ nào không: Ví dụ: If rs is Nothing then III. Hằng và cách sử dụng hằng 1. Khai báo hằng Hằng (Constan) là đại lượng có giá trị xác định và không bị thay đổi trong bất kỳ hoàn cảnh nào. Tương ứng với từng kiểu dữ liệu, sẽ có những hằng tương ứng. Khai báo hằng số bởi từ khoá Const. Sau đây là các ví dụ về khai báo các loại hằng: Ví dụ 1: Hằng a = 5 (hằng số) Const a = 5 Ví dụ 2: Hằng ngày = 24/12/2004 kiểu Date (bao bởi cặp dấu thăng # #) Const ngay = #24/12/2004# Ví dụ 3: Hằng xâu ký tự (bao bởi cặp dấu nháy kép “ ”) Const phongban = "Tài vụ" Ví dụ 4: Hằng kiểu Lôgíc xác định bởi True hoặc False Const ok = True 2. Phạm vi hằng Tương tự như biến, hằng cũng có những phạm vi hoạt động của nó. Hằng được khai báo trong thủ tục nào, hoặc cục bộ trong form, report hoặc module nào sẽ chỉ có tác dụng trong phạm vi đó. Muốn hằng có phạm vi toàn cục, phải được khai báo sau từ khoá Public Const, tại vùng Decralations của một module nào đó như sau: Public Const a = 12
  13. Chương III CÁC CẤU TRÚC LỆNH VBA Các cấu trúc lệnh là thành phần cơ bản của mỗi ngôn ngữ lập trình. Thông thường các ngôn ngữ lập trình đều có các cấu trúc lệnh như nhau: lệnh xử lý điều kiện, lệnh lặp biết trước số vòng lặp, lệnh lặp không biết trước số vòng lặp, Tuy nhiên cách thể hiện (cú pháp) mỗi cấu trúc lệnh có thể khác nhau tuỳ thuộc vào mỗi ngôn ngữ lập trình. Hơn nữa, mỗi ngôn ngữ cũng có thể có một số điểm khác biệt, đặc trưng trong mỗi cấu trúc lệnh. Cũng giống như nhiều ngôn ngữ lập trình hiện đại khác, các cấu trúc lệnh trong VBA đều tuân thủ các nguyên tắc: - Có cấu trúc: mỗi cấu trúc lệnh đều có từ khoá bắt đầu và một từ khóa báo hiệu kết thúc; - Thực hiện tuần tự (loại trừ trường hợp đặc biệt thủ tục Goto ); - Có khả năng lồng nhau; I. Cấu trúc IF ENDIF Cấu trúc này thường gọi là lệnh lựa chọn. Tức là nếu một điều kiện nào đó xảy ra sẽ là gì, hoặc trái lại có thể làm gì. Trong VBA cú pháp lệnh này như sau: If Then [ Else ] End If Ý nghĩa lệnh trên là: nếu = True thì thực hiện các lệnh trong . Trái lại thực hiện các lệnh trong . Phần trong cặp dấu ngoặc vuông [ ] có thể có hoặc không có trong câu lệnh, tuỳ thuộc vào mục đích xử lý. Ví dụ 1: Kiểm tra và trả lời một số là chẵn hay lẻ? If so Mod 2 = 0 Then Msgbox “Là số chẵn !” Else Msgbox “Là số lẻ !” End If Cho biết thang (số nguyên) roi vào đầu năm (1 4), giữa năm (5 8) hay cuối năm (9//12)?
  14. If thang >=9 Then Msgbox “Cuối năm “ Else If thang >=5 Then Msgbox “Giữa năm “ Else Msgbox “Đầu năm “ End If End If II. Cấu trúc SELECT CASE END SELECT Đây là một loại của cấu trúc lựa chọn. Thông thường hoàn toàn có thể sử dụng If End If để thực hiện các xử lý liên quan đến kiểu cấu trúc này, nhưng trong những trường hợp đặc biệt, cấu trúc Select Case End Select thể hiện được sự tiện dụng vượt trội. Trong VBA cú pháp lệnh này như sau: Select Case Case Case Case [Case Else ] End Select Trong đó: luôn trả về giá trị kiểu vô hướng đếm được như: số nguyên, xâu ký tự, kiểu logic, Với cấu trúc này, VBA hoạt động như sau: (1) Tính giá trị của biểu thức (2) Kiểm tra = ? - Nếu đúng thực hiện và kết thúc lệnh, thực hiện lệnh tiếp theo sau từ khoá End Select. - Nếu sai, thực hiện tiếp việc so sánh = tiếp theo và xử lý tương tự quy trình nêu trên. (3) Trong trường hợp , i=1 n khi đó có 2 khả năng: - Nếu có tuỳ chọn Case Else thì VBA sẽ thực hiện ;
  15. - Nếu không có tuỳ chọn Case Else, VBA sẽ không thực hiện bất kỳ thủ tục nào đã liệt kê trong vùng Select End Select cả mà chuyển tới thực hiện lệnh tiếp theo sau từ khoá End Select. Xét ví dụ sau: Kiểm tra một số nguyên (so) và trả về tên tiếng Anh tháng tương ứng với số nguyên đó (biến thang): 1 - Janualy 2 - Februaly 12 - December >12 - Không xác định Nếu dùng lệnh If hoàn toàn có thể đáp ứng được bài toán này, thay vào đó sẽ là một tập hợp 12 lệnh If Else End If như sau: If so = 1 Then thang = "Janualy" Else If so = 2 Then thang = "Feb" Else If so = 3 Then thang = "Feb" Else If so = 4 Then thang = "Feb" Else If so = 5 Then thang = "Feb" Else If so = 6 Then thang = "Feb" Else If so = 7 Then thang = "Feb" Else If so = 8 Then thang = "Feb" Else
  16. If so = 9 Then thang = "Feb" Else If so = 10 Then thang = "Feb" Else If so = 11 Then thang = "Feb" Else If so = 12 Then thang = "Feb" Else thang = "Feb" End If End If End If End If End If End If End If End If End If End If End If End If Tuy nhiên khi sử dụng Select Case End Select, cấu trúc sẽ gọn gàng và sáng sủa hơn nhiều. Cụ thể như sau: Select Case so Case 1 thang = "Janualy" Case 2 thang = "Janualy" Case 3 thang = "Janualy" Case 4 thang = "Janualy"
  17. Case 5 thang = "Janualy" Case 6 thang = "Janualy" Case 7 thang = "Janualy" Case 8 thang = "Janualy" Case 9 thang = "Janualy" Case 10 thang = "Janualy" Case 11 thang = "Janualy" Case 12 thang = "Janualy" Case Else thang = "Không xác định" End Select III. Cấu trúc FOR NEXT For Next là một cấu trúc lặp biết trước số lần lặp trong VBA, tuy nhiên trong những tình huống đặc biệt, vẫn có thể sử dụng cấu trúc này như cấu trúc không biết trước được số lần lặp. Cú pháp cấu trúc For Next như sau: For = To [Step ] [Exit For] Next Trong đó: - là biến kiểu vô hướng đếm được, hay dùng nhất là biến kiểu nguyên; - , là các giá trị mà biến chạy sẽ nhận và thực hiện dịch chuyển sau mỗi lần lặp. Có thể dịch chuyển đi 1 đơn vị, có thể dịch chuyển đi nhiều đơn vị một lần, có thể dịch chuyển tiến, cũng có thể dịch chuyển lùi- tất cả điều này tuỳ thuộc vào việc có hay không có tuỳ chọn [Step ];
  18. - Nếu có tuỳ chọn [Step ] biến chạy sẽ dịch n đơn vị sau mỗi lần lặp. Khi đó, nếu n>0 dẽ dịch tiến, ngược lại sẽ dịch lùi; - Mỗi lần lặp, VBA sẽ thực hiện một lần; - Trong trường hợp đặc biệt nếu gặp phải lệnh Exit For trong vòng lặp, ngay lập tức thoát khỏi lệnh lặp và thực hiện lệnh tiếp ngay sau từ khoá Next. Chính Exit For đã làm mất đi tính lặp biết trước được số lần lặp của loại lệnh này. Tiếp theo là các ví dụ Ví dụ 1: Tính tổng các số từ 1 đến 50, giá trị được lưu vào biến tong. Dim i As Byte Dim tong As Integer tong = 0 For i = 1 To 50 tong = tong +i Next Msgbox tong Ví dụ 2: Tính tổng các số chia hết cho 3 từ 1 đến 50, giá trị được lưu vào biến tong. Dim i As Byte Dim tong As Integer tong = 0 For i = 3 To 50 Step 3 tong = tong +i Next Msgbox tong Lệnh For trong ví dụ này chỉ khác lệnh For ở ví dụ 1 ở chỗ Step 3. Vì = 3 là số chia hết cho 3, nên tất cả các giá trị i còn lại sẽ chia hết cho 3 (vì i = i +3). Ví dụ 3: Kiểm tra một số nguyên (>2) có phải là nguyên tố hay không? Dim so As Integer Dim uoc As Integer Dim nguyento As Boolean nguyento = True For uoc = 2 To Int(so / 2) If so Mod uoc = 0 Then nguyento = False Exit For End If Next
  19. If nguyento Then Msgbox "là nguyên tố" Else Msgbox "không là nguyên tố !" End If Giải thuật đơn giản để xác định một số có phải nguyên tố hay không là: xác định xem tất cả các số (uoc) có thể trở thành ước của số (so) cần kiểm tra. Nếu tìm thấy một ước thực sự đầu tiên, kết luận ngay không phải số nguyên tố bởi lệnh nguyento = False và thoát khỏi vòng lặp bằng lệnh Exit For; trong trường hợp xét toàn bộ các ước có thể mà không tìm được một số nào là ước thực sự, kết luận đây là số nguyên tố (biến nguyento = True như giá trị ban đầu) IV. Cấu trúc WHILE WEND While Wend là một cấu trúc lặp không biết trước số lần lặp trong VBA. Cú pháp cấu trúc While Wend như sau (Wend - viết tắt của cụm từ While End): While Wend Trong đó: - While, Wend là các từ khoá của lệnh lặp; - Nếu = True, các lệnh trong sẽ được thực hiện. Thực hiện xong lại quay lên dòng lệnh While để kiểm tra tiếp ; - Nếu = False, sẽ thoát khỏi vòng lặp và thực hiện lệnh tiếp theo từ khoá Wend. Chú ý: Luôn phải chứng minh được rằng, sau một số hữu hạn lần thực hiện , giá trị của phải là False để thoát khỏi vòng lặp. Trong trường hợp không thể thoát khỏi vòng lặp, có nghĩa người lập trình đã mắc phải lỗi lặp vô hạn. Có thể dẫn đến chương trình bị treo. Các ví dụ: Ví dụ 1: Tính tổng các số chia hết cho 3 trong khoảng từ 1 đến 50 Dim i As Byte Dim tong As Integer tong = 0 i = 3 While i <= 50 tong = tong +i i = i + 3
  20. Wend Msgbox tong Ví dụ 2: Ví dụ này thể hiện vòng lặp vô hạn. Lý do có thể là chủ quan, rất đơn giản vì gõ nhầm! Hãy chỉ ra dòng lệnh gõ nhầm và thực hiện sửa cho đúng. Dim i As Byte Dim tong As Integer tong = 0 i = 1 While i <= 50 If i Mod 3 = 0 Then tong = tong + i End If j = i + 1 Wend Msgbox tong V. Lệnh DoCmd Bạn có thể dùng lệnh DoCmd để thi hành các công việc thông thường trên Access thông qua môi trường VBA. Ví dụ như: dùng DoCmd để có thể mở form, mở report, query, lọc dữ liệu, thi hành macro xử lý bản ghi, ứng dụng, Hầu hết các thao tác xử lý trên các đối tuợng của Access đều có thể dùng lệnh doCmd để gọi ra thực hiện trong môi trường VBA. Dưới đây liệt kê một số các phép xử lý của lệnh DoCmd thông dụng: 1. Lệnh đóng một đối tượng Lệnh này để đóng (Close) hoặc giải phóng đối tượng nào đó ra khỏi bộ nhớ. Hay dùng lệnh này để đóng form đang hoạt động hoặc đóng một report đang preview. Cú pháp như sau: DoCmd.Close [ObjectType], [ObjectName], [SaveOption] Trong đó: ObjectType chỉ kiểu đổi tượng cần đóng. Cụ thể như sau: acForrm Đóng form acReport Đóng report acQuery Đóng query acTable Đóng bảng ObjectName - chỉ tên đối tượng cần đóng; SaveOption - chỉ định tuỳ chọn ghi lại cấu trúc (nếu có sự thay đổi). Cụ thể: SaveNo Không khi lại
  21. SaveYes Luôn ghi lại SavePromt Hiển thị hộp thoại nhắc để ghi nếu có sự thay đổi Ví dụ sau để đóng form frmHoadon, không cần ghi lại cấu trúc nếu có sự thay đổi. DoCmd.Close acForm, "frmHoadon", acSaveNo Đặc biệt, để ra lệnh đóng đối tượng chủ đang mở chỉ cần ra lệnh sau: DoCmd.Close 2. Lệnh mở form Là một lệnh hoàn chỉnh để mở và thiết lập môi trường làm việc cho một form. Cú pháp như sau: DoCmd.OpenForm [objectName], [ViewMode], [FilterName], [WhereCondition], [DataMode], [WindowsMode] Trong đó: ObjectName – tên form muốn mở; ViewMode - chế độ mở. Cụ thể: acDesign Mở form ra chế độ thiết kế acNormal Mở form ra để thi hành FilterName - Đặt lọc WhereCondition - Giới hạn các bản ghi trong nguồn dữ liệu DataMode - thiết lập chế độ dữ liệu trên form, cụ thể: WindowsMode - thiết lập kiểu cửa sổ form là: acDialog Kiểu hộp thoại acWindowsNormal Kiểu cửa sổ bình thường Ví dụ: Dưới đây là lệnh mở form lập hoá đơn bán hàng (frmLapHoaDon), trong đó chỉ hiển thị nội dung của hoá đơn có mã "HĐ0035" DoCmd.OpenForm "frmLapHoaDon", , ,"hoadonID = 'HĐ0035'" 3. Lệnh mở report Là một lệnh hoàn chỉnh để mở và thiết lập môi trường làm việc cho một report. Cú pháp như sau: DoCmd.OpenReport [objectName], [ViewMode], [FilterName], [WhereCondition], [DataMode], [WindowsMode] Trong đó: ObjectName – tên Report muốn mở; ViewMode - chế độ mở. Cụ thể: acDesign Mở Report ra chế độ thiết kế acNormal Mở Report ra để thi hành FilterName - Đặt lọc
  22. WhereCondition - Giới hạn các bản ghi trong nguồn dữ liệu DataMode - thiết lập chế độ dữ liệu trên Report , cụ thể: WindowsMode - thiết lập kiểu cửa sổ Report là: acDialog Kiểu hộp thoại acWindowsNormal Kiểu cửa sổ bình thường Ví dụ: Dưới đây là lệnh Preview report để in ra hoá đơn bán hàng (rptHoaDon), trong đó chỉ hiển thị nội dung của hoá đơn hiện tại trên một form (ô chứa mã hoá đơn là txtHoadonID) DoCmd.OpenReport "rptHoadon",,,"hoadonID = '" + txtHoadonID + "'" 4. Lệnh thi hành câu lệnh SQL Dùng để thi hành một lệnh SQL. Cú pháp như sau: DoCmd.RunSQL Giả sử trên bảng canbo có thêm trường luongchinh. Lệnh sau đây sẽ cập nhật giá trị cho trường này thông qua lệnh SQL cập nhật dữ liệu: DoCmd.RunSQL "UPDATE canbo SET luongchinh = hessoluong*290000" Hoặc dưới đây là lệnh xoá bỏ những cán bộ đến tuổi nghỉ hưu ra khỏi CSDL: DoCmd.RunSQL "DELETE * FROM canbo " _ + " WHERE (Year(Date())-Year([ngaysinh])>=60 AND gioitinh=Yes)" + " OR (Year(Date())-Year([ngaysinh])>=55 AND gioitinh=No)"
  23. Chương IV CHƯƠNG TRÌNH CON I. Chương trình con dạng hàm Cú pháp Function ([ ]) As End Function Trong đó: - Function, End Function là các từ khoá bắt buộc khai báo cấu trúc một chương trình con dạng hàm; - là tên gọi hàm định khai báo. Tên không được chứa dấu cách (space) và các ký tự đặc biệt; - - danh sách các tham số cần thiết cho hàm. Có hay không có danh sách này tuỳ thuộc vào hàm cần định nghĩa; - - kiểu dữ liệu mà hàm sẽ trả lại. Phần này bắt buộc phải được khai báo với mỗi hàm; - - thân chương trình con. Trong đó câu lệnh = phải xuất hiện ít nhất một lần trong thủ tục. Câu lệnh này có tác dụng gán giá trị cho hàm. Nếu không có từ khoá Public trước Function, hàm đó chỉ có tác dụng cục bộ: trong một module, trong một report hoặc trong một form. Khi có từ khoá Public trước Function, hàm sẽ có tác dụng toàn cục. Tức là có thể sử dụng bất kỳ nơi nào trên tệp Access đó. Tất nhiên, tất cả những gì khai báo là Public phải được khai báo trong phần Decralations của một Module nào đó. Ví dụ 1: hàm tính tổng 2 số Function Tong2So(a, b As Double) As Double Tong2So = a + b End Function Ví dụ 2: hàm kiểm tra một số có phải là nguyên tố hay không? Function laNguyenTo(so As Integer) As Boolean Dim uoc As Integer laNguyenTo = True If so > 2 Then For uoc = 2 To Int(Sqr(so)) If so Mod uoc = 0 Then
  24. laNguyenTo = False Exit For End If Next End If End Function Ví dụ trên có sử dụng đến: - hàm Int(number) – hàm lấy phần nguyên của một số; - hàm Sqr(number) – hàm lấy căn bậc hai một số Ví dụ 3: hàm tách tên trong xâu họ và tên. Đây là một bài toán gặp phải rất nhiều trong thực tế. Cụ thể bài toán giải quyết vấn đề sau: Nếu biết họ tên là Nguyễn Sơn Hải, hàm sẽ tách ra được tên là Hải. Toàn bộ mã lệnh hàm như sau: Function GetTen(hoten As String) As String Dim pos As Integer pos = 1 If InStr(pos, Trim(hoten), " ") = 0 Then GetTen = hoten Exit Function End If While InStr(pos + 1, Trim(hoten), " ") > 0 pos = InStr(pos + 1, Trim(ten), " ") Wend GetTen = Mid(hoten, pos) End Function Ví dụ 4: Hàm dùng so sánh 2 xâu kiểu chữ TCVN3 chúng tôi đưa ra dưới đây là một tham khảo rất tốt. Trong Word, Access cũng như các bảng dữ liệu tiếng Việt có dấu trên máy tính, việc sắp xếp xâu ký tự là một bài toán mà người Việt phải giải quyết. Ví dụ, dưới đây là một danh sách trên Word: TT Tên 1. Quang 2. Đức 3. Đoàn
  25. 4. Băng 5. Bang 6. An 7. Ân Sau khi sử dụng tính năng sắp xếp (Sort) của Word theo cột Tên theo thứ tự tăng dần, được danh sách kết quả như sau: TT Tên 1. An 2. Ân 3. Bang 4. Băng 5. Đoàn 6. Đức 7. Quang Hàm Mahoa dưới đây sẽ giúp qui đổi một xâu tiếng Việt chuẩn TCVN3 (bộ phông ABC) về dạng không dấu. Muốn sắp xếp hay so sánh vị thứ các xâu, hãy so sánh các xâu không dấu được chuyển đổi bởi hàm Mahoa này. Private Function MahoaTCVN3(Ckt As String) Dim kq, kti As String Dim vt1, vt2, i As Integer Dim Cgoc1, Cma1 As String, Cgoc2, xd, Cma2 As String Cgoc1 ="aµ¶·¸¹¨»¼½¾Æ©ÇÈÉÊËeÌÎÏÐѪÒÓÔÕÖi×ØÜÝÞoßáâãä«åæçèé¬êëìíîuïñòóô−õö÷ø ùyúûüýþ" Cma1 = "abadafaparazblbnbpcbcdcl1b1c1d1e1f1a" Cgoc2 = "Aa¡¨¢©BbCcDd§®Ee£ªFfGgHhIiJjKkLlMmNnOo¤«¥¬PpQqRrSsTtUu¦−VvWwXxY yZ z" Cma2 = "aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazbabbbcbdbebfbgbhbibjbkbl bmbnbobpbqbrbsbtbubvbwbxbybzcccbcccdcecfcgchcicjckclcmcn" kq = "" xd = "" For i = 1 To Len(Ckt)
  26. kti = Mid(Ckt, i, 1) vt1 = InStr(Cgoc1, kti) If vt1 0 Then kq = kq & Mid(Cma2, (vt2) * 2 - 1, 2) Else kq = kq + kti End If End If Next i MahoaTCVN3 = kq & xd End Function Function Mahoa(Ckt As String) As String Dim vt1 As Integer Dim kq, Ctam As String Ckt = Ckt & " " kq = "" vt1 = InStr(Ckt, " ") Do While vt1 ([ ]) End Sub Trong đó:
  27. - Sub, End Sub là các từ khoá bắt buộc khai báo cấu trúc một chương trình con dạng thủ tục; - là tên gọi thủ tục định khai báo. Tên không được chứa dấu cách (space) và các ký tự đặc biệt; - - danh sách các tham số cần thiết cho thủ tục. Có hay không có danh sách này tuỳ thuộc vào thủ tục cần tạo - - thân chương trình con. Nếu không có từ khoá Public trước Sub, thủ tục đó chỉ có tác dụng cục bộ: trong một module, trong một report hoặc trong một form. Khi có từ khoá Public trước Sub, thủ tục sẽ có tác dụng toàn cục. Tức là có thể sử dụng bất kỳ nơi nào trên tệp Access đó. Tất nhiên, tất cả những gì khai báo là Public phải được khai báo trong phần Decralations của một Module nào đó. Các ví dụ: Ví dụ 1: Thủ tục tính tổng hai số Sub tong2so(a, b As Double) tong = a + b ‘chú ý: tong- là biến được khai báo toàn cục End Sub Ví dụ 2: Cũng là tính tổng, nhưng thủ tục sau đây không có ý nghĩa gì! Sub tong2so(a, b As Double) Dim tong As Double tong = a + b ‘chú ý: tong- là biến được khai báo toàn cục End Sub Vì sao? Vì biến tong được khai báo cục bộ trong CTC tong2so, nên khi CTC này kết thúc, biến tong cũng bị giải thoát khỏi bộ nhớ luôn. Không gây ảnh hưởng gì đến dữ liệu cũng như thể hiện của chương trình. III. Một số hàm có sẵn 1. Hàm MsgBox Nhằm tạo một hộp thoại và in giá trị của các biến hay biểu thức, đồng thời nhận giá trị vào một biến, tùy thuộc vào người dùng chọn nút nào trên hộp thoại. Cú pháp: Tên biến = MsgBox(Prompt [,Buttons] [,Title]) Trong đó: - Prompt là tham số kiểu String chứa thông báo sẽ hiển thị trên hộp thoại.
  28. - Buttons là tham số kiểu Long xác định nhiều thuộc tính của hộp thoại như số lượng và biến nút, biểu tượng trên hộp thoại, nút ngầm định. - Title là văn bản hiển thị trên thanh tiêu đề. Các giá trị của Buttons trong vbMsgBoxStyle enum là: - Dùng để chọn kiểu nút: vbOKOnly = 0 vbOKCancel = 1 vbAbortRetryIgnore = 2 vbYesNoCancel = 3 vbYesNo = 4 vbRetryCancel = 5 - Dùng để chọn kiểu biểu tượng: vbCritical = 16 vbQuestion = 32 vbExclamation = 48 vbInformation = 64 - Dùng để chọn nút ngầm định: vbDefaultButton1 = 0 vbDefaultButton2 = 256 vbDefaultButton3 = 512 vbDefaultButton4 = 768 Hàm MsgBox trả về số xác định nút nào đã được ấn, giá trị nào lưu vào tên biến. Các giá trị này định nghĩa trong vbMsgBoxResult enum gồm: vbOK = 1 vbCancel = 2 vbAbort = 3 vbRetry = 4 vbIgnore = 5 vbYes = 6 vbNo = 7 2. Hàm InputBox Dùng để hiển thị hộp thoại nhập các giá trị từ bàn phím và gán cho một biến. Cú pháp: Tên biến = InputBox(Prompt [,Title] [,Default] [,X ,Y]) Trong đó: - Prompt dùng để hiển thị thông báo cần nhập gì. - Title là chuỗi hiển thị trên thanh tiêu đề. - Default là giá trị ngầm định cho biến, nếu không thig hộp nhập liệu rỗng. - X, Y là tọa độ hiển thị hộp hội thoại, nếu không có giá trị này thị hộp hội thoại xuất hiện chính giữa màn hình. Lệnh này trả về dữ liệu kiểu String. Ví dụ: Dim phong as String Phong = InputBox(“Nhap ten phong lam viec: ”, “TT CNTT”, “van phong”, 100, 100) 3. Hàm IsEmpty Cú pháp: IsEmpty() Dùng để xác định xem biến đã được khởi tạo chưa. Ví dụ: Dim x as Variant If IsEmpty(x) then
  29. 4. Hàm Switch() Cú pháp: Switch(biểu thức 1, giá trị 1, biểu thức 2, giá trị 2, , biểu thức N, giá trị N) Máy lần lượt xác định đúng sai của các biểu thức logic từ 1 đến N, lần đầu tiên gặp biểu thức logic đúng thì máy nhận giá trị tương ứng. Nếu không có biểu thức nào đúng thì hàm trả về giá trị Null. IV. Kỹ thuật xử lý lỗi Xử lý lỗi là kỹ thuật rất quan trọng trong lập trình. Đã lập trình thì khó tránh khỏi lỗi (Errors). Có rất nhiều nguyên nhân gây ra lỗi; các nguyên nhân này có thể được lường trước hoặc không được lường trước. Kỹ thuật xử lý lỗi bao gồm các kỹ năng phát hiện và xử lý các tình huống khi chương trình gây lỗi. 1. Xử lý lỗi Là việc xử lý khi đang lập trình gặp phải lỗi. Thông thường khi chạy thử chương trình trong lúc đang xây dựng phần mềm nếu gặp phải lỗi, sẽ xuất hiện hộp thoại thông báo lỗi có dạng: Thông thường một hộp thoại thông báo lỗi gồm 2 thành phần: - Thành phần báo lỗi bao gồm: + Mã số lỗi - Mỗi lỗi mà VBA có thể kiểm tra được đều có một mã số, được hiển thị ở dòng thông báo: Run-time error 'mã số lỗi': Ví dụ trên là : Run-time error '11': + Tên lỗi. Ở ví dụ trên tên lỗi là: Division by zero - lỗi sai kiểu dữ liệu. - Thành phần xử lý lỗi gồm 2 nút lệnh: + Nút - để dừng ngay chương trình, chuyển về chế độ Design - thiết kế bình thường; + Nút - để dừng chương trình chuyển về chế độ Break - sửa lỗi trực tiếp. Khi đó câu lệnh lỗi sẽ được tô bởi màu nền vàng cho phép người lập trình có thể sử được mã chương trình:
  30. Khi dịch chuột lên một biến nào đó, giá trị biến sẽ được hiển thị dưới dạng Tool tip. Hình trên khi di chuột lên biến b, giá trị biến b xuất hiện dưới dạng Tool tip (giá trị b = 0). Sau khi chọn nút Debug, bạn hoàn toàn có thể thực hiện sửa mã lệnh trong chương trình. Tuy nhiên, trong một số trường hợp khi sửa mã lệnh VBA sẽ hỏi: Điều này có nghĩa: việc sửa đổi mã lệnh vừa rồi, VBA yêu cầu phải trở về chế độ thiết kế bình thường nếu nhấn Ok; trái lại nhấn Cancel- việc thay đổi mã lệnh sẽ không được chấp nhận. Sau khi thực hiện sửa mã lệnh, bạn có thể yêu cầu VBA thực thi tiếp chương trình.
  31. Việc thực thi sẽ được tiến hành tiếp tục tại vị trí vệt sáng đang trỏ. Bạn có thể dùng chuột để dịch chuyển vệt sáng về lệnh cần thực thi (chỉ trong cùng một chương trình con). Để thực thi tiếp nhấn phím F5 hoặc nút Continue trên thanh công cụ; hoặc nhấn nút Stop nếu muốn dừng việc sửa mã lệnh trong chế độ Break, chuyển về chế độ Design. Cửa sổ Immediate Là công cụ hữu hiệu hỗ trợ việc dò lỗi bởi: hộp thoại này cho phép thực thi từng câu lệnh trên chế độ hội thoại.
  32. Giả sử ví dụ trên sau khi gõ lệnh: ? b Xem giá trị của biến b. Sau khi nhấn Enter sẽ nhận được kết quả 0 Hoặc nếu gõ: ? a / b Sẽ nhận được thông báo lỗi vì b = 0 2. Bẫy lỗi Phần trên đã trình bày những kỹ năng để xử lý lỗi khi đang soạn thảo chương trình. Các thao tác đó chỉ được thực hiện trong lúc đang xây dựng phần mềm (VBA IDE), do người lập trình xử lý. Khi phần mềm đã được đóng gói để chuyển đến người dùng nếu gặp lỗi, nó sẽ hiển thị một hộp tthoại thông báo lỗi (Error Dialog) cho biết lý do vắn tắt về lỗi. Sau khi bạn nhấn OK, chương trình sẽ ngừng hoạt động, bị thoát. Để xử lý lỗi trong tình huống này, có 2 phương pháp bẫy lỗi mà chúng tôi đưa ra dưới đây để tham khảo; hy vọng bạn sẽ chọn lựa được tình huống phù hợp để sử dụng một trong các phương pháp này đảm bảo chương trình viết ra chạy được đúng theo mục đích. Sử dụng lệnh On Error Resume Next Khi đó từ chỗ đó trở đi, nếu chương trình gặp lỗi, nó sẽ bỏ qua (ignore) hoàn toàn. Điểm này tiện ở chỗ giúp chương trình EXE của ta tránh gặp lỗi thoát khỏi đột ngột như phân tích ở trên. Nhưng nó cũng bất lợi là khi khách hàng cho hay họ gặp những trường hợp lạ, không giải thích được (vì lỗi đã bị bỏ qua mà không ai để ý), thì ta cũng bí luôn, có thể không biết bắt đầu từ đâu để gỡ lỗi. Do đó, trong lúc gỡ lỗi ta không nên dùng nó, nhưng trước khi giao cho khách hàng bạn nên cân nhắc kỹ có nên sử dụng trong các đoạn mã lệnh hay không. Ví dụ sử dụng On Error Resume Next để bỏ qua lỗi: Function A_chia_B(a, b As Double) As Double On Error Resume Next
  33. A_chia_B = Null A_chia_B = a / b End Function Trong chương trình con trên, nếu b = 0, lệnh A_chia_B = a / b sẽ gặp phải lỗi. Do có lời khai báo On Error Resume Next nên lệnh lỗi này được bỏ qua (không thực hiện). Tức là giá trị hàm là Null. Sử dụng câu lệnh On Error Goto Khi một thủ tục được đặt câu lệnh này, nếu gặp phải một lỗi nào đó, VBA sẽ chuyển thẳng việc thực hiện đến đã chỉ định. Thông thường các lệnh tiếp theo của là xử lý các tính huống lỗi. Sau đây là ví dụ sử dụng phương pháp On Error Goto để bẫy lỗi: Function A_chia_B(a, b As Double) As Double On Error GoTo Loi A_chia_B = a / b Msgbox “ Ok! “ Loi: If Err.Number = 11 Then MsgBox "Lỗi chia cho 0 !" End If End Function Trong chương trình con trên, trong trường hợp b = 0 câu lệnh A_chia_B = a / b sẽ gây ra lỗi. Theo như khai báo On Error Goto Loi ban đầu, VBA sẽ bỏ qua tất cả các lệnh sau lệnh lỗi và chuyển thẳng tới các lệnh sau nhãn Loi: Ở đây là lệnh kiểm tra lỗi. Nếu Mã lỗi = 11 kết luận ngay một thông báo lỗi tiếng Việt. Lỗi chia cho 0 ! Phương pháp này cũng được dùng phổ biến cả trong quá trình xây dựng để phát hiện lỗi, cũng như trong phần mềm đã đóng gói gửi đến khách hàng. Mỗi khi gặp lỗi sẽ được thông báo nguyên nhân gây ra lỗi bằng tiếng Việt (chẳng hạn) mà vẫn không ảnh hưởng đến hoạt động khác của phần mềm. Trong phương pháp này, người lập trình nên khai thác tối đa đối tượng Err - đối tượng mang những thông tin về lỗi đang xảy ra, cụ thể: Hành động Kết quả Err.Description Mô tả tên lỗi Err.Number Đưa ra mã lỗi Err.Number Xoá bỏ các giá trị của đối tượng Err 3. Ví dụ
  34. Phần này trình bày một số ví dụ sử dụng Form, một số đối tượng điều khiển (Control), các khai báo, các cấu trúc lệnh và những kỹ thuật liên quan để giải quyết một số bài toán thực tế đơn giản. Bài toán 1: Nhập vào một số nguyên và kiểm tra số đó là chẵn hay số lẻ? Thiết kế form như sau: Thiết lập thuộc tính cho các đối tượng như sau: Form Caption: Kiểm tra số chẵn - lẻ Default view: Single Form Scroll bar: Neither Record selector: No Navigation Buttons: No Diving line: No Ô nhập số cần kiểm tra Name: Text0 Nút Kiểm tra chẵn lẻ Name: cmdChanLe Caption: Kiểm tra chẵn lẻ Nút Đóng Name: cmdClose Caption: Đóng Và mã lệnh cho form như sau: ' 'Lệnh cho nút Kiểm tra chẵn lẻ Private Sub cmdChanLe_Click()
  35. If Text0 Mod 2 = 0 Then MsgBox Text0 + " Là số chẵn !" Else MsgBox Text0 + " Là số lẻ !" End If End Sub ' 'Lệnh cho nút Đóng Private Sub cmdClose_Click() DoCmd.Close End Sub Bài toán 2: Nhập vào 2 số nguyên và tính USC và BCS của 2 số đó Thiết kế form như sau: Thiết lập thuộc tính cho các đối tượng như sau: Form Caption: Tìm USC và BSC Default view: Single Form Scroll bar: Neither Record selector: No Navigation Buttons: No Diving line: No Ô nhập số cần kiểm tra
  36. A: txtA B: txtB USC: txtUSC BSC: txtBSC Nút Tính toán Name: cmdTinhToan Caption: Tính toán Nút Đóng Name: cmdClose Caption: Đóng Và mã lệnh cho form như sau: ' 'Hàm xác định USCNN của 2 số nguyên (thuật toán Ơ-cơ-lít) Function usc(a, b As Integer) As Integer Dim a1, b1 As Integer a1 = a b1 = b While a1 b1 Then a1 = a1 - b1 Else b1 = b1 - a1 End If Wend usc = a1 End Function ' 'Mã lệnh cho nút Tính toán Private Sub cmdTinhToan_Click() txtUSC = usc(txtA, txtB) txtBSC = txtA * txtB / usc(txtA, txtB) End Sub ' 'Mã lệnh cho nút ĐÓng Private Sub cmdClose_Click() DoCmd.Close
  37. End Sub Bài toán 3: Nhập vào 3 hệ số A, B, C của phương trình bậc hai Ax2 + Bx+C =0 và cho biết nghiệm phương trình đó: Thiết kế form như sau: Thiết lập thuộc tính cho các đối tượng như sau: Form Caption: Giải phương trình bậc 2 Default view: Single Form Scroll bar: Neither Record selector: No Navigation Buttons: No Diving line: No Ô nhập số cần kiểm tra A: txtA B: txtB C: txtC Nút Tính toán Name: cmdGPTB2 Caption: Giải phương trình Nút Đóng Name: cmdClose Caption: Đóng
  38. Và mã lệnh cho form như sau: ' 'Mã lệnh cho nút Giải phương trình Private Sub cmdChanLe_Click() Dim delta, x, x1, x2 As Double Dim kqua As String delta = txtB * txtB - 4 * txtA * txtC If delta = 0 Then x = -txtB / (2 * txtA) kq = "Nghiệm kép: x1 = x2 = " + Trim(Str(x)) Else If dleta > 0 Then x1 = (-txtB + Sqr(delta)) / (2 * txtA) x1 = (-txtB - Sqr(delta)) / (2 * txtA) kqua = "Có 2 nghiệm phân biệt:" + Chr(13) _ + " X1 = " + Trim(Str(x1)) + Chr(13) _ + " X2 = " + Trim(Str(x2)) Else kqua = "Phương trình vô nghiệm" End If End If MsgBox kqua End Sub ' 'Lệnh cho nút Đóng Private Sub cmdClose_Click() DoCmd.Close End Sub
  39. Chương V LẬP TRÌNH CƠ SỞ DỮ LIỆU Access không những là một hệ quản trị CSDL mạnh mà còn cung cấp những công cụ mạnh cho phép phát triển một CSDL đơn thuần thành một sản phẩm đóng gói thương mại. Chúng ta đã được học Queries, Forms, Report – đó là những công cụ khá mạnh và dễ học dùng để xây dựng các truy vấn, biểu mẫu và báo cáo in ấn trong Access. Chương 7 đã được làm quen với ngôn ngữ VBA- một ngôn ngữ lập trình trực quan, hướng đối tượng trong các ứng dụng Microsoft Office nói chung cũng như trên Access. Đó là cơ sở quan trọng để trong chương này chúng ta tìm hiểu những kỹ thuật lập trình CSDL bằng VBA- có thể nói là một mức chuyên sâu tiếp theo những gì đã học VBA căn bản. I. Giới thiệu kỹ thuật DAO DAO (Data Access Objects – Các đối tượng truy xuất dữ liệu) là tập hợp bao gồm lớp các đối tượng có thể dùng để lập trình truy cập và xử lý dữ liệu trong các hệ CSDL. Ở đây CSDL Access, ngôn ngữ lập trình VBA. DAO được phát triển khá sớm, gần đây nhất là phiên bản DAO 3.5 và 3.51- nó có thể thực hiện tốt được trên các phiên bản Access từ 97 trở về trước. Với Access 2000, XP phải dùng phiên bản DAO 3.6. Với phiên bản mới này, DAO 3.6 sử dụng nền Microsoft Jet 4.0. Vì vậy, có thể làm việc được trên nền Unicode dễ dàng. Để nạp thư viện DAO3.6 vào làm việc, hãy thực hiện như sau: Bước 1: Mở cửa sổ lập trình VBA; Bước 2: Chọn thực đơn Tools | References Hộp thoại sau xuất hiện:
  40. Hãy chọn (tích) mục Microsoft DAO 3.6 Object Libraly trên danh sách Available References; chọn xong, nhấn OK để đóng lại. Trước khi bước vào học lập trình CSDL, các bạn hãy xem cách thức làm việc như thế nào? Trong đó: - Tầng ứng dụng: bao gồm những giao diện người sử dụng cũng như những công cụ đơn giản mà người lập trình có thể dùng để xử lý dữ liệu theo các bài toán; - Tầng Kết nối dữ liệu: bao gồm tập hợp các công cụ, phương thức để kết nối tới những dữ liệu cần làm việc trong CSDL. Ở đây, tầng kết nối bao gồm các chuẩn Microsoft Jet 4.0 và các lớp đối tượng DAO; - Tầng Cơ sở dữ liệu: bao gồm các bảng, các query trong cơ sở dữ liệu thực tại. Như vậy để lập trình trên một CSDL phải sử dụng các đối tượng, các phương thức ở tầng kết nối như là những công cụ để có thể truy cập được vào CSDL tác nghiệp xử lý. Tầng kết nối đó chính là Jet 4.0 và DAO 3.6 mà chúng ta sẽ được tìm hiểu dưới đây. II. Các lớp đối tượng DAO Cấu trúc một CSDL bao gồm nhiều thành phần, đòi hỏi lập trình cũng cần có những thành phần tương ứng để làm việc. Lớp các thành phần tương ứng để có thể lập trình được trên toàn bộ cấu trúc CSDL là lớp các đối tượng DAO. Chúng có tên gọi, có những tập thuộc tính, các phương thức làm việc và có quan hệ mật thiết với nhau. Cây phân cấp lớp các đối tượng DAO sau đây thể hiện điều đó:
  41. Trong đó: • Workspaces – định nghĩa tập hợp các vùng làm việc. Đây có thể coi là lớp làm việc cao nhất. Về lý thuyết có thể khai báo một vài vùng làm việc (Workspace), những trên thực tế chỉ cần khai báo một vùng làm việc và vùng này luôn được khai báo ngầm định cho CSDL hiện tại. Nên sẽ không cần bàn nhiều đến lớp các WorkSpace này; • Databases - định nghĩa tập hợp các CSDL Access cần làm việc trên một dự án; • RecordSets- định nghĩa các tập hợp bản ghi (Records) cần làm việc; • QueryDefs - định nghĩa tập hợp các Query để làm việc. Querydefs và Recordsets là khả năng truy xuất, xử lý dữ liệu (Data Manipulation) của DAO; • TableDefs - định nghĩa tập hợp các bảng (Table) cần làm việc. Đây là khả năng định nghĩ dữ liệu (Data-Definition Language); • Relations - định nghĩa tập hợp các quan hệ (Relationship) cần làm việc; Mỗi lớp các đối tượng trên sẽ bao gồm tất cả các đối tượng đối tượng cùng loại trong một đối tượng mẹ đang mở. Ví dụ: - Databases sẽ bao gồm tất cả các CSDL đang đựoc mở trong vùng làm việc hiện tại; - RecordSets sẽ bao gồm tập hợp tất cả các Recordset đang được mở trên CSDL hiện tại. Khi đó, để tham chiếu đến một đối tượng cụ thể cần làm việc, có thể dùng chỉ số (số thứ tự của đối tượng đó trên tập hợp tất cả các đối tượng đó) hoặc dùng tên gọi đối tượng đó để tham chiếu. Ví dụ sau liệt kê tên của tất cả các Recordset đang sử dụng trong CSDL db. Dim db As DAO.Database
  42. ' 'các câu lệnh tiếp theo ở đây ' For i = 0 To db.Recordsets.Count MsgBox db.Recordsets(i).Name Next Để làm việc tới một đối tượng cụ thể, cần phải tham chiếu từ lớp các đối tượng mẹ của nó. Ví dụ: Để hiển thị giá trị của trường (Field) hoten trên tập hợp các bản ghi (Recordset) rs1 làm như sau: MsgBox rs1.Fields("hoten").Value ' hoặc MsgBox rs1.Fields![hoten].Value III. Đối tượng Database Database là đối tượng dùng làm việc với một CSDL (trong trường hợp này có thể hiểu một CSDL như một tệp Access .MDB). Lớp các đối tượng con của Database được thể hiện qua sơ đồ sau: Khai báo Dim db As DAO.Database ' Gán db cho một CSDL cụ thể Set db = OpenDatabase(“C:\Baitap\qlbh.mdb”) 'Đặc biệt, lệnh gán db cho CSDL hiện tại như sau: Set db = CurrentDb Khi không làm việc với CSDL nào đó, có thể ra lệnh đóng để giải phóngd bộ nhớ bằng cách: db.Close
  43. Sau khi lệnh này thực thi, tất cả các đối tượng con của db nếu đang mở sẽ được đóng lại để giải phóng bộ nhớ. Bản thân db cũng được giải phóng bộ nhớ (bằng Nothing), tất nhiên tệp CSDL và dữ liệu vẫn còn nguyên trên đĩa. IV. Đối tượng RecordSet Recordset là đối tượng dùng để miêu tả tập hợp các bản ghi của một bảng, của một query hoặc tập các bản ghi kết quả của việc thi hành một câu lệnh SQL nào đó. Lớp các đối tượng con của Recordset được thể hiện qua sơ đồ sau: 1. Khai báo Set rs=db.OpenRecordset( ) Trong đó: - Set rs = db.OpenRecordset là lệnh để tạo ra tập hợp các bản ghi từ CSDL db gán vào biến kiểu recordset rs; - là một xâu ký tự chỉ ra nguồn dữ liệu sẽ trả về cho Recordset. Xâu này có thể là tên một bảng, một Query hoặc một câu lệnh SQL; Mỗi biến Recordset khi làm việc, phải được chỉ ra Database xuất xứ của nó (phải được tham chiếu từ một biến kiểu Database đã được khai báo). Sau đây là các ví dụ: Ví dụ 1: Gán tập hợp các bản ghi từ một bảng vào biến Recordset (ở đây là bảng canbo). Dim rs As DAO.Recordset Set rs = db.OpenRecordset("canbo") Ví dụ 2: Gán tập hợp các bản ghi từ một câu lệnh chọn dữ liệu SQL vào biến Recordset (ở đây là các thông tin hoten, ngaysinh của tất cả các cán bộ nữ từ bảng canbo). Dim rs As DAO.Recordset Set rs = db.OpenRecordset("SELECT hoten, ngaysinh FROM canbo WHERE gioitinh = False") 2. Một số thuộc tính của Recordset + Thuộc tính Name Trả về xâu ký tự trong tham số của lệnh gọi Recordset. Ví dụ: lệnh sau sẽ cho biết xâu ký tự tạo nguồn dữ liệu cho Recordset là gì? MsgBox rs.Name + Thuộc tính AbsolutePosition
  44. Cho biết vị trí bản ghi hiện tại (được tính từ 0). Trong trường hợp không có bản ghi nào trên recordset hoặc con trỏ bản ghi đang nằm ở EOF- sẽ không thể lấy được giá trị thuộc tính này. Do vậy để sử dụng thuộc tính này thường phải đi kèm thuộc tính kiểm tra có tồn tại bản ghi nào hay không (RecordCount > 0) và con trỏ bản ghi có ở cuối tệp chưa (EOF = False). + Thuộc tính RecordCount Cho biết tổng số bản ghi trả về trên Recordset + Thuộc tính EOF Cho biết con trỏ bản ghi hiện tại có nằm ở EOF hay không? Nếu có giá trị thuộc tính này là True, trái lại là False. + Thuộc tính Fields Dùng tham chiếu tới các trường (Fields) trên tập hợp các bản ghi mà Recordset trả về. Thực tế Field cũng là một đối tượng và cũng có bộ thuộc tính và các phương thức của nó. Với Field của Recordset thông thường người ta hay sử dụng thuộc tính Value. Nếu không chỉ định thuộc tính cụ thể nào cho Field, VBA vẫn hiểu ngầm định đó là Value. Ví dụ: Hiển thị giá trị trường hoten trong Recordset rs Msgbox rs.Fields("hoten").Value 'hoặc Msgbox rs.Fields("hoten") 3. Một số phương thức của Recordset + Phương thức Close Để đóng Recordset, giải phóng bộ nhớ. Chỉ thực hiện hành động này khi không làm việc với Recordset nào đó. + Phương thức MoveFirts Để chuyển con trỏ về bản ghi đầu tiên + Phương thức MoveLast Để di chuyển con trỏ về bản ghi cuối cùng + Phương thức MoveNext Dịch đến bản ghi kề sau + Phương thức MovePrevious Dịch đến bản ghi kề trước Ví dụ 3: Ví dụ sau duyệt và hiển thị toàn bộ Hoten của bảng canbo Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb
  45. Set rs = db.OpenRecordset("canbo") If rs.RecordCount > 0 Then rs.MoveFirst While rs.EOF = False MsgBox rs.Fields("hoten").Value rs.MoveNext Wend End If + Phương thức AddNew, Update Để thêm mới một bản ghi vào Recordset. Qui trình thêm một bản ghi mới như sau: 1. Ra lệnh Addnew 2. Gán giá trị cho các trường của bản ghi mới 3. Ra lệnh Update Dưới đây là ví dụ thêm mới một hồ sơ cán bộ mới vào bảng canbo. Ví dụ 4: Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("canbo") ' 'Ra lệnh thêm mới bản ghi rs.AddNew ' 'Gán giá trị cho các trường của bản ghi mới rs.Fields("canboID") = "CB00565" rs.Fields("hoten") = "Nguyễn Sơn Hải" rs.Fields("ngaysinh") = #2/11/1975# rs.Fields("gioitinh") = True rs.Fields("chucvuID") = "CV002" ' 'Ra lệnh ghi lại dữ liệu rs.Update + Phương thức Edit, Update Phương thức Edit để sửa dữ liệu một bản ghi nào đó trên recordset. Qui trình để sửa một bản ghi như sau: 1. Định vị tới bản ghi cần sử trên recordset
  46. 2. Ra lệnh Edit 3. Gán giá trị mới cho các trường cần sửa 4. Ra lệnh Update Dưới đây là ví dụ về sửa hồ sơ cán bộ có mã CB000565 Ví dụ 5: Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb ' 'Định vị tới bản ghi cần sửa Set rs = db.OpenRecordset("SELECT * FROM canbo WHERE canboID='CB000565'") If rs.RecordCount > 0 Then rs.MoveFirst ' 'Ra lệnh sửa bản ghi rs.Edit ' 'Thực hiện sửa các trường dữ liệu cần thiết rs.Fields("hoten") = "Nguyễn Văn Hải" rs.Fields("ngaysinh") = #22/11/1975# ' 'Ra lệnh ghi lại dữ liệu vừa sửa rs.Update End If + Phương thức Delete Để xoá bản ghi hiện tại ra khỏi Recordset. Khi đó bản ghi hiện tại sẽ bị xoá bỏ khỏi CSDL. Cần thận trọng mỗi khi ra lệnh này. Thông thường các lệnh một nút Xoá bản ghi của một mẫu nhập liệu (nhập vào biến Recordset rs) như sau: Ví dụ 6: Private Sub cmDelete_Click() Dim tbao tbao = MsgBox("Đã chắc chắn xoá chưa?", vbYesNo + vbCritical) If tbao = vbYes Then rs.Delete rs.MoveNext
  47. End If End Sub V. Đối tượng QueryDef Đối tượng Querydef dùng để tham chiếu tới các Query có sẵn (Buil-in) trên CSDL Access, hoặc cũng có thể lập trình tạo các Query từ các câu lệnh SQL. Để tạo và kích hoạt một query trên VBA bằng cách thực thi câu lệnh SQL bạn làm theo hướng dẫn sau: ' 'Khai báo một biến kiểu Database và một biến kiểu QueryDef Dim db As DAO.Database Dim qr As DAO.QueryDef ' 'Ra lệnh tạo một Query mới, có tên rỗng (chỉ ở trong bộ nhớ) Set qr = db.CreateQueryDef( ) ' 'Gán chuỗi lệnh SQL vào thuộc tính SQL của query qr.SQL = "Gõ lệnh SQL cần thi hành vào đây" ' 'Ra lệnh thi hành query qr.Execute ' 'giải phóng bộ nhớ qr.Close Trong đó: - Bắt buộc phải khai báo một biến kiểu QueryDef để làm việc (biến qr); - Phải có một biến Database đã được khai báo sẵn (biến db); - Lệnh Set qr = db.CreatQueryDef( ) để tạo một query mới lên CSDL. sẽ được hiển thị trên danh sách trong thẻ Queries trên cửa sổ Database. Nếu ="", query này sẽ chỉ tồn tại trong bộ nhớ. Tuỳ thuộc vào mục đích công việc mà có đặt tên query hay không, nếu chỉ đơn thuần tạo một query để xử lý công việ nào đó rồi giải phóng, nên đặt ="";
  48. - Lệnh qr.SQL= để gán lệnh SQL cần thực thi vào Query. Tuỳ thuộc vào câu lệnh SQL này mà query sẽ thực hiện những gì. Ví dụ: qr.SQL = "DELETE * FROM canbo" lệnh này sẽ xoá tất cả các bản ghi trên bảng cán bộ; - Lệnh qr.Excute để thi hành câu lệnh SQL đã được thiết lập. Lệnh này tương đương nhấn nút Run đối với một query trên chế độ thiết kế; - Lệnh qr.Close để đóng query hiện tại và giải phóng bộ nhỡ khi không cần làm việc đến nữa. Sau đây là một số ví dụng về sử dụng biến QueryDef để tạo ra một số loại query xử lý dữ liệu trong môi trường VBA. Ví dụ 1: Tạo DELETE query để xoá danh sách những cán bộ có tuổi lớn hơn 60 ra khỏi bảng canbo (cán bộ đã nghỉ hưu) Dim db As DAO.Database Dim qr As DAO.QueryDef Set db = CurrentDb Set qr = db.CreateQueryDef("") qr.SQL="DELETE * FROM canbo WHERE Year(Date())- " _ & " Year(Ngaysinh)>=60" qr.Execute qr.Close Ví dụ 2: Giả sử đã thêm một trường mới trên bảng cán bộ có tên luongchinh. Tạo UPDATE query để tính giá trị cho trường này = hesoluong * 290000. Dim db As DAO.Database Dim qr As DAO.QueryDef Set db = CurrentDb Set qr = db.CreateQueryDef("") qr.SQL = "UPDATE canbo SET canbo.luongchinh = hesoluong * 290000" qr.Execute qr.Close VI. Đối tượng TableDef Đối tượng TableDef được dùng để tham chiếu tới các bảng dữ liệu (Table) trên CSDL. Thông qua đối tượng này có thể thiết kế, chỉnh sửa được cấu trúc các bảng dữ liệu trong chế độ Run-time của VBA như trên chế độ thiết kế bảng Design View.
  49. 1. Một số thuộc tính quan trọng của TableDef + Thuộc tính Name Cho biết tên bảng được gán vào biến kiểu TableDef + Thuộc tính RecordCount Cho biết tổng số bản ghi hiện có trên bảng được gán bởi biến TableDef + Thuộc tính DateCreated Cho biết thời gian tạo ra bảng được gán vào biển kiểu TableDef + Thuộc tính Fields Để tham chiếu tới các trường của bảng. Đây là thuộc tính hay được sử dụng nhất đối với TableDef. Thực chất, Field ở đây là một đối tượng, do đó cũng có tập các thuộc tính và phương thức riêng cho thuộc tính này. Dưới đây là thủ tục hiển thị tên của tất các các trường trong một bảng nào đó (ngầm định trên một CSDL đã được khai báo và gán biến db - kiểu Database). Ví dụ 1: Sub LietKeTenTruong(tenbang As String) Dim tbl As DAO.TableDef Set tbl = db.TableDefs(tenbang) For i = 0 To tbl.Fields.Count - 1 MsgBox tbl.Fields(i).Name Next End Sub 2. Một số phương thức của TableDef + Phương thức CreateTableDef Để tạo ra một bảng mới bằng VBA. Cú pháp tạo bảng mới như sau: Set tbl = db.CreateTableDef( ) ‘ ‘ Các thủ tục tạo trường mới cho bảng ‘ db.TableDefs.Append tbl Trong đó: - db – là biến kiểu Database đã được gán bởi CSDL cần làm việc (bảng mới sẽ được tạo ra trên CSDL này);
  50. - là tên bảng cần tạo. - Lệnh db.TableDefs.Append tbl là lệnh ghi cấu trúc bảng đang khai báo lên CSDL đã chỉ định. + Phương thức CreateField Để tạo ra các trường cho một bảng kiểu TableDef nào đó. Để thêm một trường mới lên bảng, sử dụng cú pháp sau: tbl.Fields.Append tbl.CreateField( , , ) Trong đó: - - tên trường mới cần tạo; - - là một tuỳ chọn để khai báo kiểu dữ liệu của trường cần tạo. Kiểu dữ liệu được khai báo theo các hằng số như sau: Giá trị Tương ứng với kiểu dbBoolean Boolean dbByte Byte dbChar Char dbCurrency Currency dbDate Date/Time dbDecimal Decimal dbDouble Double dbFloat Float dbGUID GUID dbInteger Integer dbLong Long dbMemo Memo dbNumeric Numeric dbSingle Single dbText Text dbTime Time - là một tuỳ chọn để khai báo độ lớn dữ liệu nếu cần. Tiếp theo là ví dụ minh hoạ cách tạo cấu trúc một bảng dữ liệu tổng hợp những hướng dẫn đã trình bày trên. Ví dụ 2: Sub TaoBangMoi() On Error GoTo Loi Dim tbl As DAO.TableDef Set tbl = db.CreateTableDef("NewTable")
  51. tbl.Fields.Append tbl.CreateField("ID", dbInteger) tbl.Fields.Append tbl.CreateField("Name", dbText) tbl.Fields.Append tbl.CreateField("Age", dbByte) tbl.Fields.Append tbl.CreateField("DateBirth", dbDate) tbl.Fields.Append tbl.CreateField("Comment", dbMemo) db.TableDefs.Append tbl Exit Sub Loi: If Err.Number = 3010 Then MsgBox "Đã tồn tại bảng có tên " + tbl.Name End If End Sub VII. Đối tượng Relation Đối tượng Relation dùng để tạo kết nối (RelationShip) giữa 2 bảng trong CSDL Access. Dưới đây là một ví dụ tạo kết nối giữa 2 bảng hoadon và khach trong CSDL Quản lý bán hàng. Sub CreatRelationShip() On Error GoTo Loi Dim db As DAO.Database Dim rls As DAO.Relation Set db = CurrentDb Set rls = db.CreateRelation("TaoQuanHe", "khach", "hoadon", dbRelationUpdateCascade) rls.Fields.Append rls.CreateField("khachID") rls.Fields("khachID").ForeignName = "khachID" db.Relations.Append rls Loi: If Err.Number = 3012 Then MsgBox "Đã tồn tại quan hệ này !" End If End Sub Trong truờng hợp đã tồn tại kết nối này, một thông báo lỗi tiếng Việt "Đã tồn tại quan hệ này !" xuất hiện. VIII. Đặt lọc dữ liệu
  52. Đặt lọc là lớp bài toán phổ dụng trong thực tế. Với bài toán này phải có những yêu cầu cụ thể về lọc dữ liệu (điều kiện lọc). Kết quả trả về sẽ là một tập hợp các bản ghi, có thể được kết xuất trên form hoặc được in ra máy in dưới dạng report. Dưới đây là minh hoạ một bài toán đặt lọc: Qui trình xây dựng một bài toán đặt lọc có thể thực hiện như sau: Bước 1: Xây dựng Form con Sử dụng các kỹ năng thông thường để tạo một form con đáp ứng được các kết quả theo như bài toán. Cụ thể từng bước như sau: - Tạo mới form ở chế độ Design view; - Thiết lập thuộc tính Record Source cho form là một Total Query như sau: - Thiết lập thuộc tính Defaul View cho form con là Datasheets; - Mở cửa sổ FieldList và thiết kế form như sau:
  53. - Đóng thiết kế form con lại và ghi ten là frm_formcon. Bước 2: Xây dựng form mẹ - Tạo mới form ở chế độ Design view; - Đưa hộp Combobox từ thành công cụ Toolbox lên form mẹ (giả sử tên (Name) của Combo này là Combo0). Sử dụng tính năng Combobox Wizard của Access để làm việc này. Mục đích là đưa danh sách các khách hàng từ bảng khach vào hộp Combo để chọn, phục vụ nhu cầu lọc dữ liệu; - Sử dụng đối tượng Sub-form/Sub-report trên thanh công cụ Toolbox để đưa form con vừa tạo lên form mẹ. Ngầm định tên của sub-form này làfrm_formcon. Chú ý đến tên gọi này vì phần tiếp sau sẽ sử dụng nó để lập trình. Cuối cùng, giao diện thiết kế form mẹ như sau: Bước 3: Thiết lập lệnh lọc dữ liệu trên form mẹ Công việc của bước này là làm sao để sau khi chọn tên một khách hàng ở hộp Combobox, danh sách các hoá đơn mua hàng của khách đó sẽ được hiển thị lên form con.
  54. Muốn thế, việc lập trình lọc dữ liệu ở đây phải được thực hiện trong thủ tục đáp ứng sự kiện Combo0_Click. Giải thuật sẽ là: - Tạo một biến Recordset để thi hành câu lệnh SQL đưa ra danh sách kết quả thoả mãn điều kiện đặt lọc. Câu lệnh SQL trong trường hợp này là: "SELECT hoadonID, khachID, ngayban, Sum([soluong]*[dongia]) “ + ” AS tongtien FROM " + " hoadon INNER JOIN (hang INNER JOIN hangban ON " + " hang.hangID = hangban.hangID) ON hoadon.hoadonID =" + " hangban.hoadonID WHERE Trim(khachID)='"+Trim(Combo0)" + " GROUP BY hoadonID, khachID, ngayban " - Gán thuộc tính Recorset của form con là biến kiểu recordset vừa tạo ra (chứa kết quả đã lọc); - Ra lệnh làm tươi dữ liệu cho form con. Tất nhiên, trước đó phải khai báo một biến kiểu Database toàn cục trong form và định nghĩa nó ở thủ tục Form_Load() Toàn bộ mã lệnh cho bài toán trên như sau: Dim db As DAO.Database Private Sub Form_Load() Set db = CurrentDb End Sub Private Sub Combo0_Click() Dim rs As DAO.Recordset Set rs = db.OpenRecordset("SELECT hoadonID, khachID, " + " ngayban, Sum([soluong]*[dongia]) AS tongtien FROM" + " hoadon INNER JOIN (hang INNER JOIN hangban ON " + " hang.hangID = hangban.hangID) ON hoadon.hoadonID =" + " hangban.hoadonID WHERE Trim(khachID)='"+Trim(Combo0)" + " GROUP BY hoadonID, khachID, ngayban ") Set frm_formcon.Form.Recordset = rs frm_formcon.Requery End Sub Tóm lại, với mỗi bài toán đặt lọc áp dụng theo phương pháp kể trên đều giống nhau về cách làm việc, điểm khác nhau duy nhất là câu lệnh SQL. Có thể kết luận mấu chốt của bài toán này là tạo ra được lệnh SQL đúng để đáp ứng mọi điều kiện đặt lọc từ form mẹ.
  55. Chương VI MACRO VÀ GIAO DIỆN I. Macro Macro là tập hợp các hành động để thực hiện nhiều thao tác cùng một lúc giúp ta thực hiện tự động hóa công việc xử lý dữ liệu. Ta có thể tạo một Macro để mở một bảng, một truy vấn, một Forrm hay một báo cáo. Có thể tạo Macro để hiển thị một thông báo kèm theo một tiếng bíp để gây chú ý, có thể tạo Macro để di chuyển hay đặt lại kích thước cửa sổ, hoặc làm cực đại, cực tiểu hoặc khôi phục một cửa sổ. Macro cũng thường dùng kết hợp với sự kiện của Form và các điều khiển trên Form, như sự kiện Current của một Form, sự kiện Click của một nút lệnh hoặc sự kiện DblClick của một hộp văn bản. 1. Tạo và sử dụng Macro Trong cửa sổ Database chọn đối tượng Macros, nhấn nút New, xuất hiện cửa sổ thiết kế Macro. Cửa sổ này gồm 3 thành phần: - Cột Action dùng để nhập một hành động trong Macro. - Cột Comment ghi chú thích cho hành động vừa chọn. - Khung Action Arguments dùng để nhập các đối số hay thông tin của hành động. Nháy chuột vào các dòng của cột Action để chọn các hành động trong danh sách sổ xuống. Sau khi chọn được các hành động, ghi chú thích và chọn đối số cho hành động, ta chọn lệnh File/Save để lưu Macro vừa tạo và đóng cửa sổ Macro. Tên của Macro có thể có tối đa 64 ký tự, nó xuất hiện trên thanh tiêu đề của cửa sổ Macro.
  56. Chạy Macro: Chọn tên Macro trong cửa sổ Database, nháy nút Run trên thanh công cụ, hoặc đơn giản ta chỉ cần nháy đúp lên tên của Macro đó trong cửa sổ Database. 2. Các hành động và các tham số của Macro Ms Acces cung cấp một số hành động để tạo macro, mỗi hành động thực hiện một tác vụ nào đó trên CSDL và tuỳ thuộc vào tham số của mỗi hành động. OpenTable: Mở một bảng dữ liệu Table name: Tên bảng cần mở View: Chọn dạng thể hiện của bảng (Datasheet/ Design/ Print Preview) Data mode: Add: Dùng để nhập dữ liệu Edit: Dùng để thêm, xoá, sửa dữ liệu trong bảng Read Only: Mở bảng để chỉ xem dữ liệu OpenQuery: Mở một truy vấn Query name: Tên truy vấn cần mở View: Chọn dạng thể hiện của bảng (Datasheet/ Design/ Print Preview) Data mode: Add: Dùng để nhập dữ liệu Edit: Dùng để thêm, xoá, sửa dữ liệu trong bảng Read Only: Mở bảng để chỉ xem dữ liệu OpenForm: Mở một biểu mẫu Form name: Tên biểu mẫu View: Chọn dạng thể hiện ( Form/ Design/ Print preview/ Datasheet) Filter name: Tên Query lọc các dữ liệu để hiển thị trong form. Where condition: Điều kiện lọc dữ liệu hiển thị trong form. Data mode: Add : Dùng để nhập dữ liệu Edit : Dùng để thêm, xoá, sửa dữ liệu trong bảng Read Only : Mở bảng để chỉ xem dữ liệu Window mode: Normal : Dạng cửa sổ form bình thường. Hidden : Dạng cửa sổ form được ẩn đi. Icon : Cửa sổ form thu nhỏ thành 1 biểu tượng. Dialog : Dạng hộp thoại
  57. OpenReport: Mở một báo cáo Report name: Tên báo cáo View: Chọn kiểu in Print preview:In ra màn hình. Design: Dạng thiết kế báo cáo Print: In ra máy in Filter name: Tên Query lọc các dữ liệu để hiển thị trong Report. Where condition: Điều kiện lọc dữ liệu hiển thị trong Report. RunMacro: Chạy một Macro, đối số là Repeat Count (số lần lặp lại) Macro name: Tên macro cần thực hiện Repeat count: Số lần thực hiện macro sẽ lặp lại. Repeat Expression: Biểu thức điều kiện để lặp lại khi thực hiện macro. Macro chỉ dừng khi khi biểu thức điều kiện nhận giá trị False. Run App: Chạy một ứng dụng trong Window Command line: đường dẫn đến tập tin của một ứng dụng. Open module: Mở cửa sổ soạn thảo thủ tục trong 1 module. Module name: Tên module chứa thủ tục cần mở. Procedure name: Tên thủ tục sẽ mở. Run code: Gọi thực hiện một hàm của Access Basic Function name: Tên hàm cần thực hiện và các đối số của hàm. Run App: Cho thực hiện một ứng dụng nào đó trong môi trường Windows Command line: đường dẫn đến tập tin của một ứng dụng. Run SQL: Cho thực hiện câu lệnh SQL SQL Statement: Nội dung câu lệnh SQL Maximize: Cực đại cửa sổ hiện thời Minimize:Cực tiểu cửa sổ hiện thời thành một biểu tượng. Restore: Phục hồi cửa sổ trở về kích thước cũ. Move size: Di chuyển hoặc thay đổi kích thước cửa sổ hiện thời. Right: Khoảng cách từ góc trên trái của cửa sổ này đến cạnh trái của cửa sổ chứa nó. Down: Khoảng cách từ góc trên trái của cửa sổ này đến đến cạnh trên của cửa sổ chứa nó. Width: Chiều rộng của cửa sổ này. Height: Chiều cao của cửa sổ này. Stop Macro: Dừng macro đang thực hiện Beep: Phát tiếng kêu bíp
  58. Hourglass: Đổi dạng con trỏ thành đồng hồ cát trong khi macro đang chạy Hourglass On: Yes/No (Đổi/ Không đổi) Close: Đóng một cửa sổ đang hoạt động Object Type: Loại cửa sổ của đối tượng cần đóng như Table, Query, form, Report, Macro hoặc Module. Object name: Tên của đối tượng cần đóng. Quit: Thoát khỏi MS Access và trở về Windows Option Prompt: Hiển thị hộp thoại có lưu trữ không? Nếu đối tượng có thay đổi. Save all: Lưu trữ tất cả mọi đối tượng. Exit: Thoát mà không cần lưu trữ. Print: In đối tượng hiện thời Print Range: Phạm vi cần in ấn. All: In tất cả các đối tượng Selection: In phần trang được chọn Pages: In các trang được chọn Page from: Trang bắt đầu in Page to: Trang kết thúc in Print Quality: Chất lượng in Copies: Số bản cần in Collate Copies: Có sắp xếp thứ tự các bản in teo trang. Msg Box: Hiển thị hộp thông báo Message: Câu thông báo cần hiển thị Beep: Yes/ No: Có/ Không phát ra tiếng Bíp khi hiển thị hộp thông báo. Type: Loại hộp thông báo. Title: Tiêu đề của hộp thông báo. CancelEvent: Huỷ bỏ một sự kiện đang thực hiện Requery: Cập nhật dữ liệu cho một đối tượng đang hoạt động bằng cách cập nhật lại dữ liệu nguồn của đối tượng đó. Control name: Tên của đối tượng cần cập nhật dữ liệu (Nếu không chỉ ra thì sẽ cập nhật lại dữ liệu nguồn của chính đối tượng đang hoạt động). Select Object: Chọn đối tượng trong CSDL Object Type: loại đối tượng cần chọn. Object name: Tên đối tượng cần chọn In Database Window: (Yes/No) Xác định MS access có chọn đối tượng trong cửa sổ CSDL không, mặc định là No.
  59. Set value: Gán một giá trị cho 1 trường, 1 điều khiển, hoặc một thuôc tính trên một Form hoặc 1 Report. Item:Tên trường, đối tượng hay thuộc tính muốn gán giá trị. Expression: Biểu thức cần gán giá trị cho Item. 3. Gắn Macro với các sự kiện trên Form/Report 3.1. Quy tắc chung khi gọi một đối tượng Đối với form : Forms![Tên form]![Tên đối tượng] Đối với Report: Reports![Tên Report]![Tên đối tượng] 3.2. Các thuộc tính của một đối tượng Muốn gắn một nút lệnh trên một biểu mẫu hoặc báo cáo với một Macro nào đó vào nút lệnh này ta thực hiện: Click chuột phải vào nút lệnh, chọn Properties và gắn Macro vào các hành động tương ứng. On Enter: Macro thi hành khi nhấn Enter vào bên trong đối tượng On Exit: Macro thi hành khi thoát khỏis đối tượng On Got Focus: Thiết lập nhận biết khi có di chuyển con trỏ đến một form hoặc 1 trường trên form đang mở. On Click: Macro thi hành khi click vào đối tượng On Dbl Click: Macro thi hành khi Double click vào đối tượng. On Mouse Down: Macro thi hành khi ấn và giữ chuột tại đối tượng On Mouse Move: Macro thi hành khi di chuyển chuột ra khỏi đối tượng On Mouse Up: Macro thi hành khi nhã chuột ra khỏi đối tượng. On Key Down: Macro thi hành khi ấn và giữ một phím đối tượng. On Key Press: Macro thi hành khi ấn một phím đối tượng. On Key Up: Macro thi hành khi nhã một phím đối tượng. 3.3. Macro tự động thực hiện sau khi mở tập tin CSDL Chúng ta có thể tạo ra một Macro mà mỗi khi mở một tập tin CSDL thì Macro này tự động thực hiện. Để tạo Macro tự động thực hiện ta tiến hành các thao tác sau: Tạo macro Lưu trữ Macro với tên AutoExec. II. Menu và Toolbar 1. Tạo Menu Menu là đối tượng được thiết kế có cấu trúc nhằm gắn kết các chức năng phần mềm lại để người dùng thuận tiện trong việc khai thác các tính năng cũng như CSDL. Có nhiều cách tạo menu trong Access, dưới đây chúng tôi trình bày cách đơn giản, dễ tạo và hiệu quả, đó là: sử dụng khả năng Customize của thanh công cụ.
  60. Trước khi tạo menu, bạn phải đảm bảo đã xây dựng xong đầy đủ các tính năng cần thiết của phần mềm; bước này sẽ là cuối cùng, mang tính chất gắn kết các chức năng lại thành phần mềm hoàn chỉnh. Giả sử trong CSDL Quản lý lương cán bộ đã làm được những việc sau: 1. Đã tạo xong CSDL 2. Đã tạo form nhập dữ liệu cho bảng chucvu, form nhập dữ liệu cho bảng phongban, form nhập dữ liệu cho bảng canbo; 3. Đã tạo xong report để in ra Danh sách chức vụ, Danh sách phòng ban; 4. Đã tạo xong form tìm kiếm cán bộ theo tên, in danh sách cán bộ một phòng ban 5. Đã tạo xong form để giới thiệu phần mềm (frmAbout) Dưới đây là hướng dẫn để tạo ra hệ thống menu có cấu trúc như sau: (các mục chọn của menu Hệ thống) (Các mục chọn của menu Dữ liệu)
  61. (Các mục chọn của menu In ấn) Các bước để tọ hệ thống menu trên như sau: Bước 1: Tạo một Toolbar mới Nhấn chuột phải lên thanh công cụ của Access, chọn Customize Hộp thoại Customize xuất hiện: Để tạo mới một thanh công cụ, nhấn nút New. Hộp thoại sau xuất hiện, yêu cầu gõ vào tên cho thanh công cụ:
  62. Hãy gõ tên cho thanh công cụ, giả sử Quản lý lương. Gõ xong nhấn OK. Khi đó mà hình làm việc xuất hiện một thanh công cụ trắng. Công việc tiếp theo là xây dựng hệ thống Menu trên thanh công cụ này. Bước 2: Xây dựng các mục cấp 1 Các mục cấp 1 là: Hệ thống, Dữ liệu và In ấn. Để xây dựng các mục này, trên hộp thoại Customize mở thẻ Commands. Ở danh sách Categories chọn New Menu và lần lượt kéo mục New Menu trên danh sách Commands thả lên Toolbar đang thiết kế:
  63. Hãy lần lượt kéo thả đủ số menu cấp 1 (3 menu cấp 1). Tiếp theo lần lượt thay đổi tiêu đề cho 3 menu này bằng cách: - Nhấn chuột phải lên menu cần thay đổi; - Gõ tiêu đề mới vào hộp Name (hình dưới): Bước 3: Xây dựng các mục cấp con 3 mục tạo trên là cấp 1, các mục còn lại nằm trong 3 mục đó đều là mục con, cháu. Bước này sẽ xây dựng toàn bộ các mục con như vậy. Mỗi mục con có thể là lời gọi một Form, một Report, một bảng, (gọi tắt là đối tượng) ra để làm việc. Muốn mở đối tượng nào, hãy xác định chủng loại đối tượng đó bên danh sách Categories; tiếp theo dùng chuột kéo-thả đối tượng cần đưa lên menu từ danh sách Commands lên vị trí xác định trên menu đang thiết kế.
  64. Hình trên minh hoạ cách đưa lời gọi đến form frmAbout lên menu Hệ thống. Tương tự hãy đưa các form và report còn lại lên vị trí thích hợp trên menu Quản lý lương. Cách đặt tên cho các menu này thực hiện tương tự như cách đặt tên cho 3 menu mẹ đã trình bày. Đặc biệt mục Exit lấy ở File | Exit. Bước 4: Quyết định là Menu hay ToolBar Với các bước làm việc như trên, Access ngầm hiểu là đang tạo một ToolBar. Bước này hướng dẫn cách tuỳ chọn lại là menu hay toolbar? Cách làm như sau: Trở về thẻ ToolBars của hộp thoại Customize, chọn tên toolbar cần làm việc (Quản lý lương) và nhấn nút Properties:
  65. Hộp thoại Toolbar Properties xuất hiện cho phép thiết lập các thuộc tính cho Toolbar đang chọn: - Toolbar Name - để thiết lập tên cho ToolBar; - Type - để xác định kiểu là ToolBar hay Menu? - Docking - để tuỳ chọn các kiểu khoá Menu: không cho phép thay đổi lại (Can't Change); cho phép thay đổi lại Any Allow); - Show on Toolbars Menu – cho phép hiển thị trên hệ thống thanh công cụ và menu; - Allow Customizing – cho phép định nghĩa lại các mục; - Allow Resizing – cho phép thay đổi kích cỡ hiển thị; - Allow Moving – cho phép di chuyển được; Thiết lập xong nhấn Close. 2. Gắn kết Menu, Toolbar Một Menu hay Toolbar sau khi đã tạo ra, muốn đi kèm với đối tượng nào phải thực hiện gắn kết vào đối tượng đó bằng cách thiết lập thuộc tính Toolbar - nếu muốn gắn Toolbar hoặc Menu Bar – nêu muốn gắn menu bar. Cách làm như sau: Bước 1: Mở đối tượng cần gắn kết Menu hoặc ToolBar (ví dụ một form) ra chế độ Design View:
  66. Bước 2: Chọn Menu Bar hoặc ToolBar cần gắn kết bằng cách thiết lập thuộc tính ToolBar hoặc Menu Bar (hình trên chọn Menu Bar Quản lý lương). 3. Tạo Form chính Form chính là form chứa hệ thống menu (hoặc toolbar) của phần mềm, nó xuất hiện ngay sau khi khởi động (Start-Up Object). Với mỗi phần mềm đóng gói hầu hết phải tạo form chính. Để từ đây có thể mở đến các chức năng phần mềm cần làm việc. Trong một tệp Access, form chính là một form được thiết kế ở chế độ Design view; có gắn Menu (hoặc ToolBar) và được thiết lập khởi động đầu tiên mỗi khi tệp này được mở. Dưới đây là hướng dẫn cách tạo form chính cho CSDL Quản lý lương như thể hiện ở mục Tạo menu Bước 1: Tạo frmMain - Tạo một form mới ở chế độ Design View; - Đặt tên form này là frmMain; - Thiết lập một số thuộc tính cho form như sau: Menu Bar Quản lý lương Caption Quản lý lương Record Seletor No Navigation Button No Diving Line No Để mỗi khi form này khởi động sẽ tự động phóng cực đại cửa sổ, hãy mở cửa sổ VBA và viết lệnh cho sự kiện Form_Open như sau: Private Sub Form_Open(Cancel As Integer) DoCmd.Maximize End Sub Ý nghĩa lệnh DoCmd.Maximize là phóng to (Maximize) form đang làm việc.
  67. Bước 2: Thiết lập các thông tin về ứng dụng Mở thực đơn Tools | Startup , hộp thoại Startup xuất hiện: - Gõ tiêu đề phần mềm vào ô Application Title; - Chọn form chính ở hộp Display Form/Page (chọn frmMain); - Chọn Menu cho ứng dụng ở hộp Menu Bar (chọn menu Quản lý lương); - Hộp Application Icon để chọn một biểu tượng cho ứng dụng (loại tệp *.ico); - Cho phép hiển thị cửa sổ Database hay không?; - Cho phép hiển thị thanh trạng thái? - Cho phép thay đổi menu bar và toolbar? Thiết lập xong nhấn OK để đóng lại. Lần sau khi mở tệp CSDL này, màn hình đầu tiên bạn gặp là form frmMain:
  68. BÀI TẬP Bài số 1: Xây dựng trên CSDL Quản lý bán hàng 1. Xây dựng CSDL theo cấu trúc như sau: Yêu cầu : - Thiết kế cấu trúc các bảng một cách phù hợp : kiểu dữ liệu các trường; trường khoá; Thuộc tính Lookup và các thuộc tính khác; - Thiết lập quan hệ cùng các thuộc tính đảm bảo toàn vẹn dữ liệu cho các quan hệ; 2. Tạo các form làm giao diện nhập dữ liệu cho các bảng. 3. Tạo form để lập hóa đơn bán hàng như sau: Yêu cầu chi tiết: - Các nút Tiến, Lùi để định vị hoá đơn cần làm việc; - Nút Thêm mới để bắt đầu tạo mới một hoá đơn; - Nút Xoá HĐ để xoá hoá đơn hiện tại. Yêu cầu phải có xác nhận trước khi xoá; - Nút In HĐ để in chi tiết hoá đơn bán hàng ra report. 4. Thiết kế form tổng hợp thông tin bán hàng theo ngày như sau:
  69. Sau khi nhập xong giá trị từ ngày và đến ngày, thông tin chi tiết về các mặt hàng bán ra trong phạm vi ngày đó được tổng hợp theo như giao diện trên. 5. Thiết kế form tổng hợp thông tin bán hàng cho khách hàng theo ngày như sau: Yêu cầu: Sau khi chọn một khách hàng, nhập vào khoảng ngày cần tổng hợp. Thông tin tổng hợp về từng mặt hàng của khách đó mua sẽ được liệt kê. 6. Tạo form để theo dõi thông tin chi tiết bán hàng theo ngày như sau:
  70. 7. Tạo form để theo dõi hoá đơn mua hàng các khách hàng như sau: Sau khi chọn tên một khách, thông tin về các hoá đơn mua hàng được hiển thị. 8. Tạo form frmAbout đưa những thông tin giới thiệu về phần mềm này. 9. Thiết kế form chính và menu bar để liên kết toàn bộ các chức năng đã làm được ở trên CSDL Quản lý bán hàng như sau:
  71. Bài số 2: Xây dựng trên CSDL Quản lý lương cán bộ 1. Xây dựng CSDL như sau:
  72. Yêu cầu : - Thiết kế cấu trúc các bảng một cách phù hợp : kiểu dữ liệu các trường; trường khoá; thuộc tính Lookup và các thuộc tính khác; - Thiết lập quan hệ cùng các thuộc tính đảm bảo toàn vẹn dữ liệu cho các quan hệ; 2. Thiết kế form làm giao diện nhập dữ liệu cho các bảng: frmPhongban - cập nhật dữ liệu danh sách phòng ban; frmChucvu - cập nhật danh mục chức vụ. 3. Thiết kế form để cập nhật hồ sơ cán bộ như sau: 4. Tạo form cho phép xem và in danh sách cán bộ từng phòng ban như sau:
  73. 5. Tạo form cho phép tìm kiếm cán bộ theo tên như sau: Sau khi gõ một tên (có thể là đệm + Tên hoặc đầy đủ họ và tên), danh sách các kết quả tìm thấy sẽ được liệt kê lên Subform. 6. Tạo report in ra báo cáo tổng hợp tổng số cán bộ theo chức vụ của từng phòng ban. 7. Tạo form frmAbout để giới thiệu các thông tin về phần mềm. 8. Tạo form chính cùng hệ thống menu gọi tới tất cả các chức năng đã làm được như sau:
  74. MỤC LỤC Chương I TỔNG QUAN VỀ VBA 1 I. Giới thiệu ngôn ngữ VBA 1 II. Module 1 III. Môi trường lập trình VBA 2 Chương II CÁC KIẾN THỨC CƠ BẢN 5 I. Các kiểu dữ liệu cơ bản 5 1. Boolean 5 2. Byte 5 3. Integer 5 4. Long 5 5. Single 5 6. Double 5 7. Currency 5 8. String 5 9. Date 6 10. Variant 6 11. Object 6 12. Mảng 7 II. Biến và cách sử dụng biến 7 1. Biến, khai báo biến đơn giản 7 2. Phạm vi biến 8 3. Khởi tạo biến 8 III. Hằng và cách sử dụng hằng 9 1. Khai báo hằng 9 2. Phạm vi hằng 9 Chương III CÁC CẤU TRÚC LỆNH VBA 10 I. Cấu trúc IF ENDIF 10 II. Cấu trúc SELECT CASE END SELECT 11 III. Cấu trúc FOR NEXT 14 IV. Cấu trúc WHILE WEND 16 V. Lệnh DoCmd 17 1. Lệnh đóng một đối tượng 17 2. Lệnh mở form 18 3. Lệnh mở report 18 4. Lệnh thi hành câu lệnh SQL 19 Chương IV CHƯƠNG TRÌNH CON 20 I. Chương trình con dạng hàm 20 II. Chương trình con dạng thủ tục 24 III. Một số hàm có sẵn 25 1. Hàm MsgBox 25 2. Hàm InputBox 25 3. Hàm IsEmpty 26
  75. 4. Hàm Switch() 26 IV. Kỹ thuật xử lý lỗi 27 1. Xử lý lỗi 27 2. Bẫy lỗi 30 3. Ví dụ 31 Chương V LẬP TRÌNH CƠ SỞ DỮ LIỆU 37 I. Giới thiệu kỹ thuật DAO 37 II. Các lớp đối tượng DAO 38 III. Đối tượng Database 40 IV. Đối tượng RecordSet 41 1. Khai báo 41 2. Một số thuộc tính của Recordset 41 3. Một số phương thức của Recordset 42 V. Đối tượng QueryDef 45 VI. Đối tượng TableDef 46 VII. Đối tượng Relation 49 VIII. Đặt lọc dữ liệu 50 Chương VI MACRO VÀ GIAO DIỆN 53 I. Macro 53 1. Tạo và sử dụng Macro 53 2. Các hành động Macro thường dùng 53 3. Gắn Macro với các sự kiện trên Form/Report 54 4. Macro AutoExect 54 II. Menu và Toolbar 54 1. Tạo Menu 54 2. Gắn kết Menu, Toolbar 60 BÀI TẬP 63