Lập trình quản lý 2

pdf 63 trang Gia Huy 17/05/2022 2460
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình quản lý 2", để 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:

  • pdflap_trinh_quan_ly_2.pdf

Nội dung text: Lập trình quản lý 2

  1. LỜI NÓI ĐẦU Lập trình quản lý 2 là môn học nâng cao của môn Lập trình quản lý 1 đã được giảng dạy trước trong hệ thống chương trình của ngành Lập trình máy tính. Để có thể học môn này người học cần có kiến thức về môn Cơ sở dữ liệu và môn Lập trình quản lý 1. Lập trình quản lý 2 sẽ cung cấp cho người học các nội dung sau: Thời gian Số Tên các bài trong mô đun Lý Thực Kiểm TT Tổng số thuyết hành tra* 1 Tạo lập Macro, Menu 15 5 10 1 2 Module & ngôn ngữ lập trình 30 10 20 2 VBA 3 Lập trình cơ sở dữ liệu 45 10 35 5 Cộng 90 25 65 8 Từ các kiến thức này học sinh có thể tự viết một chương trình quản lý sử dụng hệ quản trị CSDL Microsoft Access phục vụ cho nhu cầu thực tế. Đây là tài liệu được tổng hợp lại từ các giáo trình khác và quá trình giảng dạy rút kinh nghiệm của người biên soạn, do đó không tránh các thiếu sót, mong bạn đọc thông cảm và góp ý kiến để hoàn thiện hơn. Chân thành cảm ơn 1
  2. MỤC LỤC LỜI NÓI ĐẦU 1 Bài 1: Tạo lập Macro, menu 5 1.1 Tạo Macro 5 1.1.1 Khái niệm 5 1.1.2 Cách tạo Macro 5 1.2 Các lệnh cơ bản 6 1.2.1 Open table 6 1.2.2 Open Query 6 1.2.3 Open Form 7 1.2.4 Open Report 7 1.2.5 Run macro 8 1.2.6 Open module 8 1.2.7 Run SQL 8 1.2.8 Move size 8 1.2.9 Stop Macro 9 1.2.10 Beep 9 1.2.11 Hourglass 9 1.2.12 Close 9 1.2.13 Quit 9 1.2.14 Print 9 1.2.15 Msg Box 9 1.2.16 CancelEvent: 10 1.2.17 Requery: 10 1.2.18 Set value 10 1.2.19 Add menu 10 1.3 Macro có điều kiện 11 1.3.1 Khái niệm 11 1.3.2 Ví dụ 11 1.4 Macro nhóm 14 1.4.1 Khái niệm 14 1.4.2 Ví dụ 14 1.5 Tạo menu 15 1.6 Tạo Toolbar 17 2
  3. 1.7 Thiết lập ban đầu cho chương trình 18 1.8 Bài tập 18 Bài 2: Tạo lập Modul 20 2.1 Các kiểu dữ liệu cơ bản 20 2.2 Biến và cách sử dụng biến 21 2.2.1 Cú pháp 21 2.2.2 Ví dụ 21 2.2.3 Phạm vi sử dụng biến 21 2.3 Hằng và cách sử dụng hằng 21 2.3.1 Cú pháp: 22 2.3.2 Ví dụ: 22 2.4 Cấu trúc lệnh trong VBA 22 2.4.1 If end if 22 2.4.3 Cấu trúc Select Case 26 2.4.4 While wend 27 2.4.5 Cấu trúc Do Loop 29 2.5 Chương trình con dạng hàm, chương trình con dạng thủ tục 30 2.5.1 Hàm 30 2.5.2 Thủ tục 33 2.6 Module 36 2.7 Bài tập 37 Bài 3: Lập trình cơ sở dữ liệu 41 3.1 Ngôn ngữ sql 41 3.1.1 Ngôn ngữ thao tác dữ liệu 41 3.1.2 Ngôn ngữ thao tác cập nhật dữ liệu 45 3.2 Đối tượng database 48 3.3 Đối tượng recordset 48 3.3.1 Thuộc tính xác định vị trí (dòng ) của Recordset 49 3.3.2 Truy xuất tới các thuộc tính trong 1 dòng 49 3.3.3 Sửa thông tin trên một bảng 50 3.3.4 Thêm 1 dòng vào bảng 51 3.3.5 Xoá 1 dòng trong bảng 51 3.4 Đối tượng querydef 52 3.5 Đối tượng tabledef 52 3
  4. 3.6 Đối tượng Relations 53 3.7 Lập trình trên các đối tượng Cơ sở dữ liệu 54 3.7.1 Kỹ thuật dao 54 3.7.2 Để nạp thư viện DAO3.6 54 3.7.3 Ví dụ 55 3.8 Bài tập 57 4
  5. Bài 1: Tạo lập Macro, menu Mục tiêu của bài: Biết tạo lập và ứng dụng được Macro Tạo lập menu, toolbar 1.1 Tạo Macro 1.1.1 Khái niệm Macro trong Microsoft Access là tập hợp các lệnh được định sẵn nhằm tự động thực hiện chuỗi các công việc nào đó mà không cần sự can thiệp từng bước của người sử dụng. 1.1.2 Cách tạo Macro Ví dụ: Sử dụng CSDL Diem.mdb, thiết kế Form chức năng chứa nút lệnh thực hiện việc mở Form DANHSACH. Nút lệnh được gán macro mở Form. Các bước thực hiện Bước 1: Chọn menu lệnh Create \ Macro Bước 2: Trong cửa sổ Macro chọn hành động mở Form Sau đó lưu macro với tên :MoFormDS Bước 3: Tạo một Form như mẫu Lưu ý: Khi tự viết macro cho nút lệnh ta nên bỏ qua chế độ tự động của Wizard. Bước 4: Gán Macro cho sự kiện của điều khiển 5
  6. Chọn nút vừa tạo Mở cửa sổ Property, chọn Event Gán macro vào sự kiện On click Kết quả Khi chạy Form, nhấn nút lệnh Form Danh sách sẽ xuất hiện 1.2 Các lệnh cơ bản 1.2.1 Open table 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 1.2.2 Open Query Query name: Tên truy vấn cần mở. 6
  7. 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 1.2.3 Open Form 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. 1.2.4 Open Report 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. 7
  8. 1.2.5 Run macro 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. 1.2.6 Open 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. 1.2.7 Run 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ũ. 1.2.8 Move size 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 8
  9. 1.2.9 Stop Macro 1.2.10 Beep 1.2.11 Hourglass Hourglass On: Yes/No (Đổi/ Không đổi) 1.2.12 Close 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. 1.2.13 Quit 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ữ 1.2.14 Print 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. 1.2.15 Msg Box 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. 9
  10. 1.2.16 CancelEvent: Huỷ bỏ một sự kiện đang thực hiện 1.2.17 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. 1.2.18 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. Lưu ý: Nếu tên trường, tên đối tượng, tên thuộc tính ở 1 Form hoặc 1 Report khác thì phải mô tả đầy đủ. Trong Form khác: [Forms]![Tên Form]![Tên trường/Tên đối tượng] Trong Report khác: [Reports]![Tên Report]![Tên trường/Tên đối tượng] Đối với các thuộc tính [Forms/Reports]![Tên Form/Tên Report]![Tên trường].[Tên thuộc tính] 1.2.19 Add menu Tạo thêm một Drop Down Menu vào một menu bar cho một form hoặc Report. Menu name: Tên của Drop Down Menu muốn thêm vào menu bar. Menu macro name: Tên macro chứa các lệnh về việc tạo menu. 10
  11. Status bar: Thông báo ở thanh trạng thái khi chọn menu này. Apply Filter: Lọc (Truy vấn) các dữ liệu khi xử lý Table, Form, Report. Filter name: Tên của truy vấn lọc dữ liệu. Where condition: Điều kiện lọc dữ liệu. FindRecord: Tìm bản ghi đầu tiên nằm trong phạm vi và thoả mãn điêu kiện. 1.3 Macro có điều kiện 1.3.1 Khái niệm Macro có điều kiện là macro chưa câu lệnh kiểm tra điều kiện trước khi thực hiện công việc và chỉ thực hiện công việc nếu điều kiện đúng. 1.3.2 Ví dụ Sử dụng CSDL Diem.mdb. Tạo macro cho nút thoát trên Form chức năng, yêu cầu khi nhấn nút thoát có Msg hiển thị “Bạn có muốn thoát không?”, nếu người dùng đồng ý thì cho thoát khỏi Form hiện hành, nếu không thì bỏ qua. Các bước thực hiện Bước 1: Tạo Macro mới Bước 2: Trong cửa sổ Macro chọn hành động đóng Form Chọn câu lệnh IF Gõ câu lệnh: MsgBox("Bạn có muốn thoát không?",16+4,"Thông Báo")=6 Chọn hành động close windown Sau đó lưu macro với tên : thoat Bước 3: Tạo một Form như mẫu 11
  12. Bước 4: Gán Macro thoát cho hành động của điều khiển nút thoát Kết quả Khi nhấn nút Thoát trên Form chức năng, cửa sổ thông báo hiện ra. Nếu bạn chọn Yes có nghĩa là giá trị trả về của bảng thông báo = 6 thì thực hiện đóng Form. Lưu ý: Nếu hành động tiếp theo cũng dùng chung một điều kiện thì chỉ cần ghi 3 chấm. 1.3.2.1 Câu lệnh MsgBox 1.3.2.1.1 Cú pháp câu lệnh MsgBox (“Câu thông báo”, kiểu nút trên hộp thoại + dạng biểu tượng, “Tiêu đề của hộp thoại”) 12
  13. 1.3.2.1.2 Kiểu nút trên hộp thoại Giá trị Dạng nút 0 1 2 3 4 5 1.3.2.1.3 Biểu tượng trên hộp thoại Giá trị Biểu tượng 16 32 48 64 1.3.2.1.4 Kết quả trả về khi người dùng chọn lựa Các nút trên hộp thoại Nút được chọn Giá trị trả về 1 1 2 3 4 5 6 7 13
  14. 2 6 7 4 2 1.4 Macro nhóm 1.4.1 Khái niệm Macro nhóm là Macro chứa các macro con, thay vì tạo ra nhiều macro với nhiều tên khác nhau thì các macro này được gom lại thành một tên chung nhằm giảm bớt số lượng, thuận lợi trong quá trình sử dụng và các Macro thường có liên quan với nhau. 1.4.2 Ví dụ Sử dụng CSDL Diem.mdb. Trên Form chức năng viết 1 Macro dùng chung cho các nút lệnh “Thoát Form” và “Thoát Access”. Các bước thực hiện Bước 1: Tạo Macro mới Bước 2: Trong cửa sổ Macro Chọn Submacro Đặt tên cho Submacro: thoat_form Chọn hành động close windown Sau đó tiếp tục thêm một Sub Đặt tên Thoat_Access Bước 3: Lưu lại macro nhóm 14
  15. Bước 4: Trong Form chức năng tạo hai nút: Thoát Form và Thoát Access Gán macro nhóm cho các nút vừa tạo theo chức năng tương ứng trong sự kiện On Click của từng nút. Kết quả Các nút thực thi đúng theo hành động của Macro 1.5 Tạo menu Trong Microsoft Access 2010 menu do người dùng tạo được tổ chức thành nhóm tương tự như các nhóm lệnh trên thanh Ribbon đặt trong mỗi Tab của chương trình. Menu do người dùng tạo đặt trong Tab Add_In. Menu được chia làm hai cấp - Cấp 1: được hiển thị trực tiếp trên Tab Add_In. - Cấp 2 sẽ được ẩn bên trong nút mũi tên của cấp 1. Ví dụ Sử dụng CSDL Diem.mdb. Tạo Menu theo mẫu để mở các Form có sẵn trong CSDL. Cấp 1: Form, Thoát Cấp 2: Lớp học, Điểm, ĐTB, Thoát Access 15
  16. Các bước thực hiện Bước 1: Tạo Menu cấp 1 - Tạo macro tên: Menu_1 - Chức năng : AddMenu (mỗi lần AddMenu tạo được 1 Menu cấp 1) Bước 2: Tạo Menu cấp 2. Tạo các macro có tên trùng với tên khai báo trong Menu_1 (Menu Macro Name: FR, TH) - Tạo Macro tên FR. Mỗi Submacro thực hiện một chức năng (Một Menu cấp 2) - Tạo Macro tên TH Bước 3: Chọn một Form để gọi Menu, thường là Form chính (Form chào) của chương trình Chọn form/ mở cửa sổ thuộc tính / Other/ Menu Bar : Menu_1 Lưu ý: 16
  17. Khi tạo macro cho menu cấp 2 phải đặt tên chính xác như trong khai báo của Macro tạo menu cấp 1. 1.6 Tạo Toolbar Trong Microsoft 2010, thanh Toolbar là thanh Ribbon. Các nút lệnh trong thanh Ribbon được chia theo Tab và theo nhóm. Ví dụ Sử dụng CSDL Diem.mdb. Tạo Tab QuanLy_HocSinh trên thanh Ribbon cho chương trình gồm các nút mở Form có sẵn trong CSDL Các bước thực hiện Bước 1: File/ Options/ Customize Ribbon Bước 2: Nhấn nút New Tab tạo một tab riêng có tên QuanLy_HocSinh Bước 3: Trong Tab QuanLy_HocSinh tạo nhóm chức năng (Add new group). Đổi tên và chọn biểu tượng cho từng nhóm. - Form - Report Bước 4: Tạo Macro nhóm mở các Form Bước 5: Đưa Macro vào nhóm Form (Chọn Macro/ Add) Đổi tên và chọn biểu tượng cho từng mục (Rename) 17
  18. Bước 6: Tạo nút thoát cho chương trình Chọn File Tab (Choose commands)/ Exit/ nhấn nút Add 1.7 Thiết lập ban đầu cho chương trình Làm ẩn các Tab cân chỉnh mặc định của Microsoft Access để giao diện của chương trình riêng được đơn gian và xác định Form xuất hiện đầu tiên. Bước 1: File/ Option/ Current Database Bước 2: Display form: chọn Form hiển thị đầu tiên khi chạy chương trình Bước 3: Navigation Pane: không hiển thị cửa sổ Navigation Pane Bước 4: Ribbon and toolbar option: không hiển thị các tab trên Ribbon - Alow full menus - Alow default shortcut menus - Alow build_in toolbar 1.8 Bài tập CSDL nhanvien 18
  19. 1. Tạo Form nhập liệu cho bảng nhân viên. Viết Macro cho các nút THÊM, XÓA, LƯU a. Khi THÊM yêu cầu kiểm tra MaNV trước khi nhập, nếu đã tồn tại yêu cầu nhập lại. b. Khi xóa, lưu phải xác định (Msg) lại với người dùng trước khi xóa 2. Tạo menu cho Form chính gồm các nhóm : Query, Report a. Menu cấp 1: Query, Report b. Menu cấp 2 cho Query: các query đã có sẵn, tương tự cho Report 3. Tạo các nút trên Ribbon: a. Nhóm về Form: gọi các Form có sẵn trong CSDL b. Nhóm thoát: thoát khỏi chương trính 4. Hoàn thiện chương trình a. Xác định Form chính để hiển thị ban đầu b. Không cho hiển thị các nhóm cân chỉnh mặc định của Access trên thanh Ribbon 19
  20. Bài 2: Tạo lập Modul Mục tiêu của bài: - Biết tạo lập và ứng dụng được Modul. - Sử dụng ngôn ngữ VBA viết các chức năng căn bản trong lập trình. 2.1 Các kiểu dữ liệu cơ bản TT KIỂU DỮ LIỆU GHI CHÚ Kiểu logic, 1 Boolean Giá trị trả về 0/-1; yes/ no; true/ false Số nguyên dương 2 Byte 0 255 Số nguyên 3 Integer -32768 32767 Số nguyên dài 4 Long -2.147.483.648 2.147.483.647 Số thực 5 Single -1.401298E-45 3.402823E38 Số thực 6 Double -4.94065645841247E-324 1.79769313486232E308 Tiền tệ 7 Currency -922,337,203,685,477.5808 to 922,337,203,685,477.5807 Kiểu chuỗi 8 String Tối đa 255 ký tự Kiểu chung 9 Variant Khi dữ liệu cụ thể thuộc kiểu nào thì trả về kiểu đó Thuộc kiểu Variant 10 Object Lưu trữ các đối tượng 20
  21. 2.2 Biến và cách sử dụng biến Trong ngôn ngữ VBA ta có thể lưu trữ các giá trị để phục vụ cho quá trình xử lý dữ liệu dưới bốn hình thức là : biến, hằng, mảng và bản ghi. Biến và hằng tại mỗi thời điểm chỉ lưu trữ được một giá trị còn mảng và bản ghi thì lưu trữ được nhiều giá trị cùng lúc. Tên biến do người sử dụng tự qui định nhưng phải thỏa mãn : - Không dài quá 40 ký tự. - Ký tự đàu kiên là chữ cái, các ký tự đi sau có thể là số, dấu _ (gạch dưới). - Ký tự cuối cùng có thể là một trong các hậu tố cho biết kiểu dữ liệu như : %, &, !, #, @ và #. - Tên biến không được trùng với các từ dành riêng (Reserved word). 2.2.1 Cú pháp Dim Tên biến As kiểu dữ liệu Lưu ý: Dim/ as: từ khóa Tên biến không được có khoảng trắng và tứ tự đặt biệt. Không được trùng tên nhau. (Trừ trường hợp biến toàn cục và biến cục bộ) 2.2.2 Ví dụ Dim a as Integer Khai báo một số nguyên Dim Hoten(45) As String * 45 Khai báo một chuỗi ký tự Dim A(3, 4) As Integer Khai báo mảng số nguyên 2 chiều 2.2.3 Phạm vi sử dụng biến - Biến cục bộ : Khai báo bất kỳ vị trí nào trước khi dùng, chỉ sử dụng trong hàm được khai báo. - Biến toàn cục: Khai báo trong khu vực Decralations và được sử dụng ở mọi nơi trong chương trình. Cú pháp: Public Tên biến As KDL 2.3 Hằng và cách sử dụng 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. Phạm vi sử dụng của hằng cũng giống như biến. 21
  22. 2.3.1 Cú pháp: Const tên hằng số = Giá trị mặc định 2.3.2 Ví dụ: Const a = 5 Const n = #1/1/2012# Const t = True 2.4 Cấu trúc lệnh trong VBA 2.4.1 If end if 2.4.1.1 Cú pháp: If Then [ Else ] End If Chú thích: Ý 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ý. 2.4.1.2 Sơ đồ: Ví dụ: Tạo Form cho người dùng nhập vào điểm 3 môn: Toán, Lý, Hóa. Tính điểm trung bình và xét kết quả. Biết nếu DTB >= 5 là đậu, ngược lại là rớt.Form có cấu trúc như mẫu 22
  23. Câu lệnh cho nút THOÁT, TIẾP TỤC tương tự như trên Câu lệnh cho nút TÍNH Khai báo biến Lưu dữ liệu từ các Text box xuống biến Tính giá trị trung bình Kiển tra điều kiện để xét kết quả Nếu ĐTB >= 5 thì Đậu Ngược lại thì Rớt Xuất kết quả lên Text box điểm trung bình và kết quả Ví dụ: Giải phương trình bậc hai dạng f(x) = ax2 + bx + c Form có cấu trúc như mẫu Câu lệnh cho nút THOÁT, TIẾP TỤC tương tự như trên Câu lệnh cho nút TÍNH 23
  24. Kiểm tra biến a Nếu a = 0 phương trình ở dạng bậc 1 Nghiệm = - c/b Ngược lại Tính delta = b2 - 4ac Nếu delta = To [Step ] [Exit For] Next Chú thích: 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ó 24
  25. hay không có tuỳ chọn [Step ]; 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. 2.4.2.2 Sơ đồ: Biểu thức 1: = Biểu thức 2: Biểu thức 3: + step Ví dụ: In các số từ 1 dến n, với n người dùng nhập Với n = x = 5 i = 1 i <= 5 Đúng txt_kq = txt_kq & 1 & “,” = 1, (txt_kq ban đầu rỗng) i = 2 i <= 5 Đúng txt_kq = 1, & 2 & “,” = 1, 2, i = 3 i <= 5 Đúng txt_kq = 1,2 & 3 & “,” = 1, 2, 3, 25
  26. i = 4 i Case : [ ] Case : [ ] Case Else : [ ] End Select Chú thích: Biểu thức trả về một giá trị duy nhất 26
  27. Kết quả trả về của biểu thức được mang đi so sánh với các giá trị Case. Nếu bằng giá trị Case nào thì sẽ thực thi thủ tục tại lệnh Case đó. Nếu không bằng giá trị nào thì sẽ thực hiện thủ tục tại Case Else Ví dụ: Người dùng nhập vào một số bất kỳ, kiểm tra xem số đó coa phải là một tháng trong năm Bước 1: Tạo Form như mẫu Text box1: Name : txt_thang Text box2: Name : txt_kq Bước 2: Viết lệnh cho nút THOÁT, TIẾP TỤC như các vị dụ trên Bước 3: Viết lệnh cho nút KIỂM TRA 2.4.4 While wend 2.4.4.1 Cú pháp While Wend Chú thích: 27
  28. While, Wend là các từ khoá của lệnh lặp; Nếu = True, thủ tục đượ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. Lưu ý: 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. 2.4.4.2 Sơ đồ Ví dụ: Phân tích một số thành các ký số. Số lần Với n = x = 3125 lặp 28
  29. x / 10 = 3125/ 10 = 312 0 Lần 2 2 Đúng x = int(x / 10) = 31 txt_kq = txt_kq & x Mod 10 & “,” = 5, x / 10 = 31/ 10 = 3 0 Lần 4 2, 1, 3 Đúng x = int(x / 10) = 0 Lần 5 x / 10 = 0/ 10 = 0 = 0 Sai Dừng vòng lặp 2.4.5 Cấu trúc Do Loop Cú pháp Do [{While | Until} ] [ ] [Exit Do] [ ] Loop Hoặc Do [ ] [Exit Do] [ ] Loop [{While | Until} ] Chú thích: Câu lệnh thực hiện tương tự như While wend. Nhưng thủ tục được thực hiện rồi mới kiêm tra điều kiện Ví dụ: Sử dụng lại ví dụ kiểm tra tháng trong năm. Khi nhập số tháng phải kiểm tra giá trị nhập có phải là số âm không, nêu âm yêu cầu nhập lại. Nhập liên tục cho đến khi giá trị nhập là số dương 29
  30. Trong sự kiện AfterUpdate của Text box tháng Kết quả: Nếu điền giá trị nhỏ hơn 0 thì thông báo sẽ xuất hiện và yêu cầu nhập lại. Và sẽ thông báo liên tục đến khi nào giá trị nhập >= 0. 2.5 Chương trình con dạng hàm, chương trình con dạng thủ tục Chương trình con là một đơn vị mã lệnh VBA, nó có thể chứa tập hợp các câu lệnh nhằm thao tác, tính toán hoặc điều khiển mục đích hoặc dữ liệu nào đó. Trong VBA có 2 loại chương trình con: thủ tục (Sub) và hàm (Function). Về bản chất, 2 loại chương trình con trên đều như nhau: khai báo, tham số và truyền tham số. Tuy nhiên, điểm khác nhau cơ bản là: Function luôn trả về một giá trị cụ thể. Còn Sub chỉ thực hiện một số các công việc. Tuỳ từng tính huống cụ thể sẽ lựa chọn sử dụng Function hoặc Sub 2.5.1 Hàm 2.5.1.1 Cú pháp Function ([ ]) As End Function Gọi hàm: Khai báo một biến có kiểu DL trùng với kiểu DL của hàm 30
  31. Tên biến = tên hàm Chú thích: 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. Phạm vi sử dụng: 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 đó. 2.5.1.2 Ví dụ Kiểm tra số nhập vào là chẵn hay lẻ? 31
  32. Các bước thực hiện Bước 1: Thiết kế Form như mẫu Text box Name: txt_n Lable Name: lb_kq Caption: “Kết quả: ” Visible: No (không hiển thị từ đầu khi khởi động Form) Bước 2: Viết lệnh cho nút Thoát: như các ví dụ trên Viết lệnh cho nút Tiếp tục Xóa Text box chứa n Đặt lại giá trị ban đầu cho Lable Cho Lable hiển thị kết quả ẩn đi Bước 3: Viết hàm kiểm tra tính chẵn lẻ của một số Tham số là một số n Kết quả : True/False Viết lệnh cho nút Tính Khai báo biến kq để giữ giá trị của hàm KT_ChanLe Gọi hàm và truyền tham số cho hàm Xét kết quả của hàm và đưa ra kết luận 32
  33. Cho hiển thị kết luận lên Lable Kết quả 2.5.2 Thủ tục 2.5.2.1 Cú pháp [Public] [Private] Sub ([ ]) End Sub Gọi thủ tục: Call tên thủ tục Chú thích: 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. Phạm vi sử dụng cũng như Hàm 2.5.2.2 Ví dụ Nhập dữ liệu cho một mảng số nguyên, với số phần tử do gười dùng nhập. 33
  34. Các bước thực hiện Bước 1: Tạo Form Text box lưu số phần tử khi người dùng nhập Lable: Số pt Name: txt_n Text box hiển thị các phần tử của mảng Lable: Mảng Name: txt_mang Bước 2: Viết lệnh cho nút Tiếp tục: tương tự như ví dụ trên Viết lệnh cho nút Nhập: Khai báo mảng ở dạng biến toàn cục Viết hàm nhập mảng với tham số n là số phần tử của mảng: sử dụng lệnh Input Box để nhập các phần tử. Viết hàm xuất mảng với tham số n là số phần tử của mảng Bước 3: Gọi thủ tục trong sự kiện Click của nút Nhập Kết quả Lưu ý: Sử dụng biến toàn cục cho mảng a để có thể truy xuất mảng ở các hàm khác nhau. 34
  35. Ví dụ: Nhập dữ liệu cho một mảng số nguyên, với số phần tử do gười dùng nhập. tính tổng các số nguyên tố có trong mảng. Các bước thực hiện Bước 1: Tạo Form Text box lưu số phần tử khi người dùng nhập Lable: Số pt Name: txt_n Text box hiển thị các phần tử của mảng Lable: Mảng Name: txt_mang Text box hiển thị tổng và các số nguyên tốtrong mảng Lable: Tổng các số NT Name: txt_tong Bước 2: Viết lệnh cho nút Tiếp tục, Nhập: tương tự như ví dụ trên Viết lệnh kiểm tra số nguyên tố và tính tổng: Bước 3: Gọi thủ tục trong sự kiện Click của nút Tổng Kết quả 35
  36. Lưu ý: Biến tong (lưu giá trị tổng các số nguyên tố) Biến vt (lưu các số nguyên tố tìm được) tong và vt được truyền tham chiếu để có thể giữ lại giá trị sau khi đã kết thúc hàm. 2.6 Module Khi chúng ta viết chương trình con trong các sự kiện của đối tượng điều khiển (nút lệnh) có nghĩa là ta đang viết module gắn liền với Form riêng lẻ. Bây giờ chúng ta sẽ thực hiện Module dùng chung cho tất cả các Form có trong chương trình. Module dùng chung có thể được gọi từ bất kỳ Form nào và được khai báo trong phần Module riêng. Ví dụ: Tạo module nhập mảng và xuất mảng. Các bước thực hiện Bước 1: Tạo Form Text box lưu số phần tử khi người dùng nhập Lable: Số phần tử Name: txt_n Text box hiển thị các phần tử của mảng Lable: Mảng Name: txt_kq Thiết kế 3 nút : NHẬP, THOÁT, TIẾP TỤC Bước 2: Viết lệnh cho nút Tiếp tục, Thoát: tương tự như ví dụ trên Bước 3: Chọn Tab Create/ Module Trong cửa sổ lệnh viết thủ tục nhập và xuất mảng: 36
  37. Bước 4: Sử dụng các hàm/ thủ tục của Module 1 trong sự kiện Click của nút NHẬP Kết quả Lưu ý: Vì Module là dùng chung cho các Form nên câu lệnh trong Module phải tổng quát. Khi xuất dữ liệu lên Form cần dùng biến đối tượng đại diện. 2.7 Bài tập Tạo mỗi câu 1 FORM, sau đó tạo một menu gọi từng FORM 1. Nhập vào 2 số a, b. Hãy tính tổng, hiệu, thương, tích của a và b. 2. Cho người dùng nhập vào 3 môn TOÁN, LÝ HÓA. Hãy tính điểm trung bình của 3 môn. 3. Nhập vào bán kinh đường tròn. Tính chu vi (CV), diện tính (DT), thể tích (TT) đường tròn.Với R bán kính. CV = 2R * Pi DT = 4R2 * Pi TT = DT * R / 3 37
  38. 4. Nhập vào chiều dài (d), chiều rộng (r) hình chữ nhất. Tính chu vi, diện tính hình chữ nhật. CV = 2* (d + r) DT = d * r 5. Nhập vào 2 số a,b. Hãy hoán đổi giá trị của a cho b và ngược lại 6. Nhập a, b, c là độ dài 3 cạnh của tam giác (chú ý đảm bảo tổng 2 cạnh phải lớn hơn cạnh còn lại). Tính chu vi, diện tích, độ dài 3 đường cao, 3 đường trung tuyến, 3 đường phân giác, bán kính đường tròn nội tiếp, ngoại tiếp lần lượt theo các công thức sau: C = 2p = a + b + c ; Chu vi p( p a )( p b )( p c ) S = ; Diện tích 2S ha a ; Đường cao cạnh a 1 2b2 2c 2 a 2 ma = 2 ; Đường trung tuyến cạnh a 2 bcp( p a ) ga = b c ; Đường phân giác góc a S r p ; Bán kính đường tròn nội tiếp abc R 4S ; Bán kính đường tròn ngoại tiếp 7. Nhập vào hai số a, b. In ra số lớn hơn 8. Nhập vào 3 số a,b,c. In ra số lớn nhất 9. Viết chương trình kiểm tra số chẵn, lẻ 10. Viết chương trình kiểm tra số nguyên tố 11. Tính tổng các số từ 1 n 12. Tính tổng các số chẵn, lẻ từ 1 n 13. Nhập vào 4 chữ số. In ra tổng của 4 chữ số này và chữ số hàng chục, hàng đơn vị của tổng (ví dụ 4 chữ số 3, 1, 8, 5 có tổng là 17 và chữ số hàng chục là 1 và hàng đơn vị là 7, cần in ra tong: 17 thành phần: 7, 1). 14. Viết thủ tục giải phương trình bậc hai f(x) = ax2 + bx + c 15. Viết hàm tìm USCLN, BSCNN của hai số a,b. Biết rằng 38
  39. USCLN(a,b) Nếu a chia hết cho b, USCLN là b Ngược lại, phân tích nếu a > b, a = k*b + r BSCNN(a,b) = a *b / USCLN(a,b) 16. Viết thủ tục nhập xuất một mảng, sau đó tính tổng các phần tử trong mảng. 17. Sử dụng thủ tục nhập xuất mảng ở câu 16, sau đó tính tổng các số chẵn, lẻ trong mảng. 18. Sử dụng thủ tục nhập xuất mảng ở câu 16, sau đó kiểm tra trong mảng có bao nhiêu số nguyên tố, tổng các số nguyên tố. 19. Sử dụng thủ tục nhập xuất mảng ở câu 16, sau đó in ra vị trí phần tử là số nguyên tố 20. Sử dụng thủ tục nhập xuất mảng ở câu 16, sau đó sắp xếp các phần tử trong mảng sao cho giá trị của các phần tử tăng dần 21. Sử dụng thủ tục nhập xuất mảng ở câu 16 và cho người dùng nhập một biến x, sau đó kiểm tra x có tồn tại trong mảng không? Nếu có thì xoá đi. 22. Sử dụng thủ tục nhập xuất mảng ở câu 16, sắp xếp mảng theo chiều giảm dần và nhập vào một biến x, sau đó chèn x vào mãng sao cho trật từ của mảng không thay đổi. 23. Sử dụng thủ tục nhập xuất mảng ở câu 16, cho người dùng nhập vào hai mảng, sau đó nối hai mảng thành 1 mảng. 24. Sử dụng thủ tục nhập xuất mảng ở câu 16, cho người dùng nhập vào hai mảng, sắp xếp 2 mảng theo chiều giảm dần, sau đó nối hai mảng thành 1 mảng sao cho phần tử của 2 mảng xen kẻ nhau. 25. Tạo Form theo mẫu. (Hình 1) Khi nhấn nút TÍNH. a. In ra các ước của N b. Tính tổng các ước số. (Biết ước của n là các số mà n chia hết) c. Kiểm tra N có phải là số hoàn hảo không. (Biết số hoàn hảo là số có tổng các ước bằng chính nó) Khi nhấn nút TIẾP TỤC các ô Text box sẽ được xóa để nhập lại Khi nhấn nút THOÁT sẽ có thông báo. Yêu cầu viết các chức năng bằng hàm hay thủ tục. 39
  40. 26. Tạo Form theo mẫu. (Hình 2) Khi nhấn nút TIẾP TỤC các ô Text box sẽ được xóa để nhập lại Khi nhấn nút THOÁT sẽ có thông báo Khi nhấn nút XÉT KẾT QUẢ THI, tính và điền vào các ô ĐTB và KQ. Biết - ĐTB = Điểm trung bình các môn (Với môn chính thì hệ số 2), - Kết quả o « Đậu » nếu điểm trung bình từ 5 trở lên và điểm môn chính từ 6 trở lên o « Rớt » là các trường hợp còn lại KHỐI THI MÔN CHÍNH A TOÁN B SINH C VĂN D ANH Yêu cầu viết các chức năng bằng hàm hay thủ tục Hình 1 Hình 2 40
  41. Bài 3: Lập trình cơ sở dữ liệu Mục tiêu của bài: - Lập trình và điều khiển trên các mẫu tin của cơ sở dữ liệu - Hoàn thiện 1 ứng dụng quản lý cơ sở dữ liệu 3.1 Ngôn ngữ sql 3.1.1 Ngôn ngữ thao tác dữ liệu 3.1.1.1 Ngôn ngữ truy vấn dữ liệu 3.1.1.1.1 Cú pháp Select [Distinct|Top n[%]] field1 [As alias1][,field2 [As alias2][, ]] From table1 [Inner Join table2 On table1.field1  table2.field2] [Where DieuKienLocMauTinNguon] [Group By fieldGroupBy[,fieldGroupBy[, ]] [Having DieuKienLocMauTinTongHop] [Order By field1[Asc|Desc][,field2[Asc|Desc]][, ]]]; Chú thích: - * : lấy hết tất cả các cột trong quan hệ nguồn. - Distinct: loại bỏ các bộ trùng trong quan hệ đích. - Top n[%]: Chọn n hay n% mẫu tin đầu tiên. - field: Tên field (cột thuộc tính) hay một biểu thức hay hàm kết hợp - table: Tên table hay query chứa dữ liệu mà tham gia trong câu truy vấn. - Alias: Trường hợp field là một biểu thức thì là một tên mới của biểu thức. là phép đổi tên trong mệnh đề Select. - Inner Join (kết): mỗi mẫu tin của table1 (bên nhiều) nối với bất kỳ mẫu tin nào của table2 (bên 1) mà có (On) dữ liệu của field1 thỏa mãn điều kiện so sánh với dữ liệu của field2 tạo thành mẫu tin của query. - Điều kiện: Biểu thức mà dữ liệu mẫu tin phải thỏa mãn. Hoặc biểu thức điều kiện kết. - Order By: sắp kết quả hiển thị theo thứ tự cột giá trị tăng dần (Asc-mặc định) hoặc giảm dần (Desc) Lưu ý: 41
  42. Khi nêu rõ một thuộc tính thuộc về quan hệ nào ta viết theo cú pháp tênQuanHệ.tênThuộcTính. 3.1.1.1.2 Ví dụ Sử dụng CSDL canbo.mdb thực hiện các câu lệnh sau: 1. Liệt kê thông tin của các phòng ban SELECT Phongban.* FROM Phongban; 2. Liệt kê Cán bộ ở phòng kinh doanh: HỌ VÀ TÊN,NGÀY SINH, GIỚI TÍNH, TÊN PHÒNG BAN SELECT Canbo.Hoten AS [HỌ VÀ TÊN], Canbo.Ngaysinh AS [NGÀY SINH], Canbo.Gioitinh AS [GIỚI TÍNH], Phongban.TenPB AS [TÊN PHÒNG BAN] FROM Phongban INNER JOIN Canbo ON Phongban.MaPB = Canbo.MaPB WHERE (((Phongban.TenPB)="KINH DOANH")); 3. Liệt kê Cán bộ nữ là đảng viên SELECT Canbo.MaCB, Canbo.MaPB, Canbo.MaCV, Canbo.Hoten, Canbo.Ngaysinh, Canbo.Gioitinh, Canbo.Ladangvien FROM Canbo WHERE (((Canbo.Gioitinh)=False) AND ((Canbo.Ladangvien)=Yes)); 4. Thống kê danh sách cán bộ gồm các thuộc tính: Mã cán bộ, Họ và tên, Hệ số lương, Lương hệ số = hệ số lương * 730000 + phụ cấp chức vụ. SELECT Canbo.MaCB AS [Mã cán bộ], Canbo.Hoten AS [Họ và tên], Canbo.Hesoluong AS [Hệ số lương], [Hesoluong]*730000+[PCCV] AS [Lương HS] FROM Chucvu INNER JOIN Canbo ON Chucvu.MaCV = Canbo.MaCV; 42
  43. 5. Tìm hệ số lương cao nhất SELECT Max(Canbo.Hesoluong) AS Max_Hesoluong FROM Canbo; 6. Đếm số cán bộ là đảng viên SELECT Count(Canbo.MaCB) AS TongsoDV FROM Canbo WHERE (((Canbo.Ladangvien)=True)); 3.1.1.2 Truy vấn gom nhóm dữ liệu Khi câu truy vấn cần tính toán dùng các hàm kết hợp thì phải dùng với mệnh đề gom nhóm Group by và Having. 3.1.1.2.1 Cú pháp [Group By fieldGroupBy[,fieldGroupBy[, ]] [Having DieuKienLocMauTinTongHop] ĐiềuKiệnLọcMẫuTinNguồn: điều kiện mà các mẫu tin nguồn phải thỏa mãn (phép chọn) fieldGroupBy: tên field mà các mẫu tin có dữ liệu giống nhau trên ấy được xếp vào cùng nhóm. điềuKiệnLọcMẫuTinTổngHợp: điều kiện mà các mẫu tin tổng hợp phải thỏa mãn (phép chọn) Lưu ý : Khi có dùng hàm kết hợp trong mệnh đề Select tức là có dùng đến Group by Các fields được đưa vào mệnh đề Seclect (ngoại trừ biểu thức) phải giống các fields trong mệnh đề Group. Trong đó các fields chính phải có giá trị tương quan 1-1 với các fields phụ. Nếu không sẽ làm cho ý nghĩa của việc gom nhóm bị sai lệch dẫn đến kết quả sai. 3.1.1.2.2 Ví dụ Sử dụng CSDL canbo.mdb thực hiện các câu lệnh sau: 1. Tìm số nhân viên của từng phòng ban SELECT Phongban.TenPB, Count(Canbo.MaCB) AS SoNV FROM Phongban INNER JOIN Canbo ON Phongban.MaPB = Canbo.MaPB 43
  44. GROUP BY Phongban.TenPB; 2. Tìm tổng số công đoàn viên nam và nữ SELECT Canbo.Gioitinh, Count(Canbo.MaCB) AS SoCDV FROM Canbo WHERE (((Canbo.Vaocongdoan)=True)) GROUP BY Canbo.Gioitinh; 3.1.1.3 Truy vấn lồng nhau (nested query, sub query) Là những câu lệnh truy vấn mà trong thành phần WHERE hay HAVING có chứa thêm một câu lệnh Select khác. Câu lệnh select khác này gọi là subquery. Ta lồng câu Select vào phần Where hay Having 3.1.1.3.1 Cú pháp o bieuthuc toanTuSoSanh [ANY | ALL | SOME] (cauLenhSQL) ANY, SOME là bất kỳ, ALL là tất cả Các mẫu tin của query chính thỏa mãn toán tử so sánh với bất kỳ/ tất cả mẫu tin nào của subquery o bieuThuc [NOT] IN (cauLenhSQL) Các mẫu tin của query chính có giá trị bằng với một giá trị trong subquery o [NOT] EXISTS (cauLenhSQL). Các mẫu tin của query chính thỏa mãn khi subquery có mẫu tin Lưu ý : Miền giá trị của các cột trong mệnh đề select trong câu truy cấn con phải bằng miền giá trị của các cột trong mệnh đề where trong câu truy vấn cha. Nếu một quan hệ (bảng) được dùng 2 lần trong câu truy vấn thì phải đổi tên quan hệ trong câu truy vấn cha. Hiểu và vận dụng tốt lệnh truy vấn dữ liệu là một việc làm cực kỳ cần thiết để tạo ra các kết quả cho báo cáo, thống kê số liệu. 3.1.1.3.2 Ví dụ 1. Lập danh sách các trưởng phòng SELECT Canbo.MaCB, Canbo.Hoten, Canbo.Ngaysinh, Canbo.Gioitinh FROM Canbo 44
  45. WHERE (((Canbo.MaCB) In (select MaTP from [Phongban]))); 2. Tìm thông tin người có mức lương hệ số cao nhất (sử dụng lại câu query trên) SELECT Query4.[Mã cán bộ], Query4.[Họ và tên], Query4.[Hệ số lương], Query4.[Lương HS] FROM Query4 WHERE (((Query4.[Lương HS])>=All (select [Lương HS] from [Query4]))); 3.1.1.4 Truy vấn hợp (union query) Khi có nhu cầu thực hiện truy vấn có kết quả như toán tử hợp 3.1.1.4.1 Cú pháp Select Union Select 3.1.1.4.2 Ví dụ Lệnh sau đây gấp đôi danh sách các phòng ban SELECT MaPB, TenPB, MaTP FROM PHONGBAN UNION SELECT MaPB, TenPB, MaTP FROM PHONGBAN 3.1.2 Ngôn ngữ thao tác cập nhật dữ liệu 3.1.2.1 Thêm dữ liệu. 3.1.2.1.1 Thêm trực tiếp một bộ giá trị. Cú pháp: INSERT INTO [( , , )] VALUES ( , , ) Lưu ý : - Nếu cột được khai báo kiểu dữ liệu chuỗi hoặc kiểu ngày, thì khi nhập dữ liệu, giá trị của cột phải được đặt trong cặp dấu nháy đơn (‘ ‘), nếu cột được khai báo kiểu dữ liệu số thì giá trị để bình thường. - Nếu ta chèn đầy đủ giá trị cho các cột thuộc tính trong bảng thì không cần phải khai báo các thuộc tính. Các giá trị chèn vào phải tương ứng với miền giá trị của thứ tự các cột khi tạo bảng. 45
  46. - Nếu ta chèn không đầy đủ giá trị cho các cột thuộc tính trong bảng thì phải khai báo các cột thuộc tính mà có giá trị sẽ chèn vào và thứ tự các giá trị chèn vào phải tương ứng với thứ tự các cột được khai báo. Ví dụ : Thêm một dòng dữ liệu vào bảng Phongban INSERT INTO Phongban(MaPB, TenPB, MaTP) VALUES (‘HC’, ‘Hành chính’, ‘0002’) Tương đương : INSERT INTO Phongban VALUES (‘HC’, ‘Hành chính’, ‘0002’) Trường hợp chèn không đầy đủ bộ giá trị : INSERT INTO Phongban(MaPB, TenPB) VALUES (‘HC’, ‘Hành chính’) 3.1.2.1.2 Thêm một hay nhiều bộ giá trị từ bảng có sẵn. Cú pháp : INSERT INTO [( , , ) SELECT , , FROM [WHERE ] [GROUP BY ] [HAVING ] [ORDER BY [Asc|Desc], [Asc|Desc], [Asc|Desc]] 3.1.2.1.3 Tạo một bảng mới với các bộ giá trị được lấy từ một bảng đã có sẵn. Cú pháp : SELECT , , INTO FROM 46
  47. [WHERE ] [GROUP BY ] [HAVING ] [ORDER BY [Asc|Desc], [Asc|Desc], [Asc|Desc]] Ví dụ: Lấy danh sách nhân viên trong phòng hành chính lưu vào một bảng riêng tên NV_PHC SELECT Canbo.MaCB, Canbo.MaPB, Canbo.MaCV, Canbo.Hoten, Canbo.Ngaysinh, Canbo.Gioitinh INTO NV_PTC FROM Canbo where MaPB='TC'; 3.1.2.2 Truy vấn cập nhật dữ liệu (action query, data modification query) 3.1.2.2.1 Cú pháp Update SET = , = , = , [Where ] 3.1.2.2.2 Ví dụ: Cập nhật hệ số lương cho nhân viên có MaCB = ‘0020’ là 3 Update Canbo SET Hesoluong = 3, Where MaCB = ‘0020’ 3.1.2.3 Truy vấn xóa dữ liệu 3.1.2.3.1 Cú pháp xóa dữ liệu (theo từng bộ): Delete From [Where ] 47
  48. 3.1.2.3.2 Ví dụ Xóa cán bộ có MaCB = ‘0014’ Delete From Canbo Where MaCB = ‘0014’ Lưu ý : Nếu điều kiện Where không có thì tất cả các bộ dữ liệu trong bảng sẽ bị xóa. Ví dụ : xóa toàn bộ dữ liệu trong bảng KQ Delete From Canbo 3.2 Đối tượng database Đối tượng DataBase: Lưu trữ CSDL (gồm các bảng, mối quan hệ giữa các bảng) Khai báo: DIM Tên biến AS Database ‘ khai báo biến thuộc kiểu đối tượng Database Gán giá trị: SET Tên biến = CurrentDB() ‘ Mở CSDL ra và gán CSDL hiện hành cho biến SET Tên biến = OpenDatabase(“Đường dẫn”) Ví dụ: DIM db As Database SET db = OpenDatabase(“C:\Baitap\qlbh.mdb”) Lưu ý: Sau khi dùng xong phải đóng lại bằng lệnh Db.Close 3.3 Đối tượng recordset Đối tượng Recordset: Lưu trữ các dòng trong 1 bảng (1 Query). Trong dòng có các thuộc tính. Khai báo: Dim Tên biến as Recordset Gán giá trị cho biến: Set Tên biến = Db.OpenRecordSet (“Tên bảng cần truy xuất”, DB_OPEN_TABLE) Ví dụ: Dim Db as Databse Dim rc as Recordset 48
  49. Set Db = CurrentDB() Set rc = Db.OpenRecordset(“MONHOC”, OPEN_TABLE) Lưu ý: DB_OPEN_TABLE: Tham chiếu đến 1 bảng, dữ liệu có thể thay đổi được DB_OPEN_DYNASET: Tham chiếu đến bảng, query, dliệu có thể thay đổi được DB_OPEN_SNAPSHOT: Tham chiếu đến 1 bản sao của dliệu, không thay đổi dữ liệu được 3.3.1 Thuộc tính xác định vị trí (dòng ) của Recordset .BOF = True : trước bản ghi đầu tiên, hoặc không có bản ghi .EOF = True : sau bản ghi cuối cùng, hoặc không có bản ghi .MoveFirst: di chuyển tới dòng đầu trong bảng .MoveNext: di chuyển tới dòng tiếp theo Ví dụ: Kiểm tra xem bảng có dữ liệu chưa Set rc = Db.OpenRecordset(“MONHOC”, OPEN_TABLE) If( rc.BOF = True) then Msgbox “Bang MONHOC chua co du lieu” End if Ví dụ: Set rc = Db.OpenRecordset(“MONHOC”, OPEN_TABLE) If( rc.EOF = True) then Msgbox “Ban dang dung o dong cuoi cung cua bang MONHOC” End if 3.3.2 Truy xuất tới các thuộc tính trong 1 dòng Cú pháp: Cách 1: rc! Tên thuộc tính Cách 2: rc. Field(Tên thuộc tính) Ví dụ: Di chuyển qua từng dòng trong bảng MONHOC và in ra thuộc tính TenMH 49
  50. Trong sự kiện Form Load Gọi Module nối dữ liệu Mở bảng MONHOC Di chuyển tới dòng đầu của bảng Vòng lặp Do While duyệt qua các dòng và lấy thuộc tính TenMH hiển thị lên ListBox Di chuyển sang dòng tiếp theo 3.3.3 Sửa thông tin trên một bảng 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: Định vị tới bản ghi cần sử trên recordset Ra lệnh Edit Gán giá trị mới cho các trường cần sửa Ra lệnh Update Ví dụ: Sửa tên môn học của môn có mã môn học là AV1 thành “Anh Văn 1” Dim Rs As Recordset Set Rs = Db.OpenRecordset (“MONHOC”, DB_OPEN_TABLE) DO WHILE (Rs.EOF = False) IF Rs!MaMH = “AV1” THEN Rs.EDIT Rs!TenMH = “Anh Văn 1” Rs.UPDATE EXIT DO ELSE Rs.MoveNext LOOP 50
  51. Rs.Close 3.3.4 Thêm 1 dòng vào bảng Để 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: Ra lệnh Addnew Gán giá trị cho các trường của bản ghi mới Ra lệnh Update Ví dụ: Thêm một dòng vào bảng MONHOC với thông tin như sau: “AV2; Anh Văn 2” Dim Rs As Recordset Set Rs = Db.OpenRecordset (“MONHOC”, DB_OPEN_TABLE) Rs.ADDNEW Rs!MaMH = “AV2” Rs!TenMH = “Anh Văn 2” Rs.UPDATE Rs.Close 3.3.5 Xoá 1 dòng trong bảng Cần thận trọng mỗi khi ra lệnh này vì thông tin sẽ bị xóa ra khỏi CSDL. Ví dụ: Xóa môn học có mã môn học là “AV1” Dim tbao Set Rs = Db.OpenRecordset (“MONHOC”, DB_OPEN_TABLE) DO WHILE (Rs.EOF = False) IF Rs!MaMH = “AV1” THEN tbao = MsgBox("Đã chắc chắn xoá chưa?", vbYesNo + vbCritical) IF tbao = vbYes Then Rs.DELETE END IF EXIT DO ELSE Rs.MoveNext LOOP Rs.Close 51
  52. 3.4 Đối tượng querydef Đối tượng SQL: để lưu kết quả khi thực hiện một câu truy vấn Cú pháp: Dim tên biến As QueryDef Khai báo biến Set Tên biến = db.CreateQueryDef( ) Tạo câu Query , đặt tên Tên biến.SQL = "câu lệnh SQL" Gán câu lệnh SQL Tên biến.Execute Thực thi câu lệnh Tên biến.Close Giaỉ phóng vùng nhớ Ví dụ: Thêm một dòng vào bảng MONHOC với giá trị như sau: (“TH1”; “Tin hoc”) Trong Form ở ví dụ trên thêm một nút “Thêm Mới” Trong sự kiện Click của nút viết lệnh như sau: Lưu ý: 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 =""; 3.5 Đối tượng tabledef Đối tượng TableDef : Lưu trữ các bảng trong CSDL Khai báo: Dim Tên biến as TableDef ‘ Xuất ra tên các bảng có trong CSDL Db Ví dụ: Liệt kê các bảng trong CSDL Bước 1: Thiết kế Form 52
  53. Bước 2: Tạo Module kết nối CSDL hiện hành Bước 3: Gọi lệnh kết nối trong sự kiện Form load Bước 4: Viết lệnh cho nút trên Form 3.6 Đối tượng Relations Đối tượng Relation dùng để tạo kết nối (RelationShip) giữa 2 bảng trong CSDL Access. Khai báo: Dim db As DAO.Database Dim ten_quanhe as DAO.Relation Set ten_quanhe = db.CreateRelation("ten_rangbuoc", "ten_bang1", " ten_bang2", dbRelationUpdateCascade) ten_quanhe.Fields.Append ten_quanhe.CreateField("tt_khoa_chinh") ten_quanhe.Fields("tt_khoachinh ").ForeignName = " thuoctinh_khoa_ngoai" db.Relations.Append ten_quanhe Ví dụ: Tạo mối quan hệ cho 2 bảng DIEM, MONHOC 53
  54. Dim db As DAO.Database Dim rls As DAO.Relation Set db = CurrentDb Set rls = db.CreateRelation("TaoQuanHe", "DIEM", "MONHOC", dbRelationUpdateCascade) rls.Fields.Append rls.CreateField("MaMH") rls.Fields("MaMH").ForeignName = "MaMH" db.Relations.Append rls 3.7 Lập trình trên các đối tượng Cơ sở dữ liệu 3.7.1 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. 3.7.2 Để nạp thư viện DAO3.6 Bước 1: Chọn nút trên thanh công cụ để chuyển sang cửa sổ mã lệnh Bước 2: Chọn menu Tools / References Bước 3: Chọn mục Microsoft DAO 3.6 Object Libraly, nhấn nút OK để hoàn tất. 54
  55. 3.7.3 Ví dụ Tạo bảng NHAN_VIEN trong Table gồm các thuộc tính như trên Form. Tạo Form theo mẫu. 1. List Danh Sách - Dùng để chứa Mã NV (Khi nhấn nút Xuất lên list) - Khi chọn một Mã NV trong list, thông tin của nhân viên tương ứng được hiển thị sang các ô Textbox, nhưng các ô Textbõ sẽ bị khóa lại, chỉ để người dùng xem thông tin. 2. Nút Thêm Mới: dùng để xóa các ô Textbox để người dùng nhập dữ liệu mới. 3. Nút lưu - Lưu dữ liệu mới nếu MaNV chưa tồn tại (Thêm mới) - Lưu dữ liệu sửa đổi khi MaNV đã tồn tại (Sửa) - Các hành động cần có thông báo, nếu người dùng đồng ý mới thực hiện 4. Nút xóa dùng xóa thông tin nhân viên đang hiển thị, yêu cầu thông báo trước khi xóa. Nếu đồng ý thì xóa. 3.7.3.1 Kết nối CSDL mở bảng NHANVIEN Private Sub Form_Load() Set db = CurrentDb() Set rc = db.OpenRecordset("NHAN_VIEN") End Sub 3.7.3.2 Nút xuất lên list Private Sub Command19_Click() list_ds.RowSource = "" ‘ xóa dữ liệu trong điều khiển rc.MoveFirst ‘di chuyển tới dòng đầu Do While Not rc.EOF ‘duyệt qua các dòng list_ds.AddItem rc.Fields("MaNV") ‘lấy MaNV điền vào List 55
  56. rc.MoveNext ‘ di chuyển đến dòng tiếp theo Loop End Sub 3.7.3.3 Sự kiện Click của List Private Sub list_ds_Click() Dim vitri As Integer vitri = list_ds.ListIndex ‘lấy vị trí con trỏ rc.MoveFirst Do While Not rc.EOF If rc.Fields("MaNV") = list_ds.ItemData(vitri) Then txt_manv = rc.Fields("MaNV") ‘kiểm tra MaNV chọn có tồn tại txt_hoten = rc.Fields("HoTen") ‘trong bảng không txt_ngaysinh = rc.Fields("NgaySinh") ‘nếu có thì xuất dữ liệu dòng tìm GioiTinh = rc.Fields("GioiTinh") ‘được lên các Textbox Exit Do End If rc.MoveNext Loop End Sub 3.7.3.4 Nút thêm mới Private Sub Command20_Click() txt_manv = "" ‘xóa các Textbox txt_manv.SetFocus ‘đưa con trỏ về Textbox MaNV txt_hoten = "" txt_ngaysinh = "" End Sub 3.7.3.5 Nút xóa Private Sub Command21_Click() rc.MoveFirst Do While Not rc.EOF If rc.Fields("MaNV") = txt_manv Then If MsgBox("Ban co muon xoa khong?", vbYesNo, "Thong bao") = vbYes Then rc.Delete rc.MoveNext End If Exit Do End If rc.MoveNext Loop End Sub ‘kiểm tra MaNV chọn có tồn tại trong bảng không ‘nếu có sẽ hỏi xem người dùng có muốn xóa không ‘nếu có cho xóa, nếu không thì bỏ qua 56
  57. 3.7.3.6 Nút lưu Private Sub Command16_Click() Dim kt As Integer ‘giả sử khi kt =0 có nghĩa là chưa tồn tại MaNV ‘lưu khi sửa dữ liệu kt = 0 If (IsNull(txt_manv) Or IsNull(txt_hoten) Or IsNull(txt_ngaysinh)) Then MsgBox "Yeu cau nhap du thong tin", vbDefaultButton1, " Thong bao" Else rc.MoveFirst Do While rc.EOF = False If rc.Fields("MaNV") = txt_manv Then If (MsgBox("MaNV nay da ton tai, Ban co muon sua du lieu khong", vbOKCancel, "Thong bao") = vbOK) Then rc.Edit rc.Fields("HoTen") = txt_hoten rc.Fields("NgaySinh") = txt_ngaysinh rc.Fields("GioiTinh") = GioiTinh rc.Update End If kt = 1 Exit Do End If rc.MoveNext Loop ‘ lưu khi thêm mới If kt = 0 Then If (MsgBox("Ban co muon luu du lieu khong?", vbOKCancel, "Thong bao") = vbOK) Then rc.AddNew rc.Fields("MaNV") = txt_manv rc.Fields("HoTen") = txt_hoten rc.Fields("NgaySinh") = txt_ngaysinh rc.Fields("GioiTinh") = GioiTinh rc.Update End If End If End If 3.8 Bài tập CSDL Hàng Hóa 57
  58. 1. Tạo query thống kê thông tin khách hàng mua trong tháng 2 năm 2007 2. Tạo query thống kê thông tin các mặt hàng hiện có ở công ty 3. Tạo query tìm kiếm thông tin khách hàng có tên là Tiến 4. Tạo query hiển thị chi tiết thông tin từng mặt hàng bán: biết thanhtien = soluong * dongia 5. Tạo query tính tổng tiền phải trả cho từng khách hàng gồm: tên khách, địa chỉ, tên hàng, số lượng, tổng tiền, khuyến mãi, thuế, phí giao hàng, tổng tiền phụ thu, tổng tiền phải trả. a. Tổng tiền = Số lượng * đơn giá b. Khuyến mãi: nếu ngày mua trùng ngày 2/9 (ngày thành lập công ty) sẽ được giảm 5% Tổng tiền c. Thuế = 10% Tổng tiền d. Phí giao hàng: i. Nếu tổng tiền dưới 1.000.000 đ thì phí 10% Tổng tiền ii. Nếu tổng tiền từ1.000.000 đ đến 5.000.000thì phí 5% Tổng tiền iii. Nếu tổng tiền dưới 5.000.000 đến 10.000.000 đ thì phí 2% Tổng tiền iv. Ngược lại là miễm phí e. Tổng tiền phụ thu = thuế + phí giao hàng f. Tổng tiền phải trả = tổng tiền – khuyến mãi + tổng tiền phụ thu. 6. Tạo query tìm kiếm khách hàng gồm tên khách hàng, địa chỉ, email (với tên khách hàng người dùng tự nhập) 7. Tạo query tìm kiếm các hóa đơn bán trong ngày. Với ngày do người dùng nhập 8. Tạo query tìm kiếm hàng hóa gồm tên hàng, đơn vị tính, đơn giá. Với tên hàng người dùng nhập. 58
  59. 9. Tạo query thống kê các hóa đơn được xuất trong khoảng thời gian mà người dùng nhập vào. 10. Tạo query tìm kiếm hàng hóa theo giá tiền do người dùng nhập vào giá tiền 11. Tạo query đưa ra thông tin của mặt hàng có giá cả cao nhất 12. Thống kê tạo danh sách gồm: tên khách hàng, địa chỉ, số lần mua hàng 13. Tạo query đưa ra bảng tổng hợp tổng tiền bán được từng ngày của cửa hàng như sau: 14. Tạo query đưa ra bảng tổng hợp tổng số lượng bán và tổng tiền đã bán ra của từng loại mặt hàng như sau: 15. Tạo query kiểm tra thông tin mặt hàng có ít người mua nhất 16. Tạo query đưa ra thông tin của mặt hàng bán chạy nhất 17. Tạo bảng tính tổng tiền từng hoá đơn bán hàng như sau: 18. Tạo query kiểm tra thông tin khách hàng có tổng tiền mua là ít nhất 19. Tạo query tìm kiếm khách hàng tham gia mua hàng sớm nhất gồm thông tin đầy đủ của khách hàng (có ngày mua trong hóa đơn là sớm nhất) 20. Lập bảng tổng hợp số lượng bán ra từng ngày của từng mặt hàng như sau: 59
  60. 21. Lập bảng tổng hợp số lượng mua từng mặt hàng của các khách hàng như sau: CSDL Vật tư 1. Tạo các câu Query thực hiện chức năng. Tổng số lần Nhập hàng. Tổng số lần Xuất hàng. Tổng số lần Nhập hàng và Xuất hàng. Tổng số lần Nhập hàng và Xuất hàng ở từng Sơ Sở ( có 3 Cơ Sở) Tính tổng số số lượng, số lượng nhiều nhất., số lượng ít nhất trên từng nhóm vật tư theo từng loại Nhập hoặc Xuất. Tìm số lượng hàng Xuất lớn nhất của vật tư có kí hiệu đầu là “U” tại Cơ Sở 1. Tìm số lường hàng Nhập ít nhất của vật tư có ký hiệu đầu là “U” hoặc “L” tại Cơ Sở 2 trong 2 năm 2005 và 2006. 2. Tạo các Query khai thác dữ liệu từ Table [NHAP XUAT], yêu cầu thực hiện như sau: Cho ra danh sách các khách hàng mua hàng trong tháng 3/2005 tại Cơ sở 1. Tên chiết xuất là [Ngay], [Khach hang], [Co so], [Vat tu], [So luong] thay vì sử dụng chính tên các tập tin của bảng nguồn. Lưu Query tên: [KHACH HANG 305]. Cho ra danh sách các khách hàng mua mặt hàng có 3 ký tự đầu là “USB” với số lường >=10 hoặc Khách hàng mua mặt hàng có 2 ký tự đầu là “HD” với số lượng >=3. Khi thi hành Query tên chiết xuất các trường là: [Ten Khach Hang], [Vat Tu], [So Luong]. Lưu Query tên: [KHACH HANG USBHD]. 60
  61. Cho ra danh sách khách hàng cung cấp hàng từ năm 2008 về trước hoặc những khách hàng cung cấp kể từ ngày hiện tại ( dùng hàm Date() để lấy ngày giờ hiện tại trên hệ thống) về trước 30 ngày. Khi thi hành Query , vùng tin [HTEN] chiết xuất thành [NHA CUNG CAP]. Lưu tên Query là: [NHA CUNG CAP 2008]. 3. Thêm mẩu tin ( WEBC, Webcam,cai,12.000.00) vào bảng DANHMUCVATTU. 4. Chọn Object Query, sau đó tạo 1 Query mới (Crosstab Query) mang tên: THONG KE NHAP XUAT VAT TU, với yêu cầu thực hiện việc thống kê tổng số lượng từng loại vật tư nhập – xuất ở từng Cơ sở như mẫu dưới: 5. Thực hiện Query mới mang tên [DOANH THU] . Trong đó sử dụng 2 Tabl nguồn là: [DANH MUC VAT TU] và [NHAP XUAT], thực hiện lần lượt các yêu cầu sau: Các Field [MAVT], [LOAI], [NGAY], [SOLG], [DON_GIA] lấy từ các bảng nguồn. Thêm vùng tin DONGIABAN = DON_GIA +(5% x DON_GIA). Thêm vùng tin THTIEN = DONGGIABAN*SOLG. Thêm vùng tin THUE được tính: Nếu THTIEN <=2.000.000 thì tính 5% THTIEN. Ngược lại tính 10% THTIEN. Thêm vùng tin THUCTHU = THTIEN – THUE. Lưu ý: Việc tính DONGIABAN VA THTIEN chỉ tính cho những mẩu tin có vùng LOAI =”X” ( chỉ tính cho hàng bán). Vùng tin [LOAI] chỉ đưa vào QUERY để đặt điều kiện chứ không cho hiển thị khi thi hành Query. CSDL nhân viên Sử dụng ngôn ngữ lập trình VBA thực hiện viết lệnh cho các nút trên Form thực hiện các chức năng sau: 61
  62. 1. Tạo Form để cập nhật thông tin cho từng bảng trong CSDL (5 Form) a. Yêu cầu có kiểm tra dữ liệu người dùng nhập trước khi thêm vào bảng b. Trước khi thực hiện các yêu cầu của người dùng cần có Msgbox xác nhận yêu cầu. 2. Tạo Form thống kê số ngày nghỉ của nhân viên theo từng lý do, tính lương cho nhân viên. 3. Tạo Form thống kê số giờ tăng ca theo từng ca, tính tiền tăng ca cho nhân viên. 62
  63. Tài liệu tham khảo 1. Giáo trình Microsoft Access 2007 (Ebook) của Lớp k47ĐH CNTT thuộc Đại học Nông Lâm. (Ngày truy cập: 12/06/2010) 2. Hướng dẫn thực hàng Microsoft Access. Mai Liên Khương (Ebook) (Ngày truy cập: 15/05/2010) 3. Giáo trình Access 2000 (Ebook) của Nguyễn Sơn Hải. (Ngày truy cập: 16/06/2010) 2000.1209915.html 4. Giáo trình Access (Ebook) của Nguyễn Anh Khoa. Trung tâm tin học 14 Bà Triệu Hà Nội. (Ngày truy cập: 12/06/2010) 5. Giáo trình Lập trình trực quan (Ebook) của Võ Trung Hùng, Đại học bách khoa Đà Nẵng (Ngày truy cập: 09/01/2010) 6. Tự học Microsoft Access 2010 (Ebook), Đỗ Trọng Danh-Nguyễn Vũ Ngọc Tùng, Nhà xuất bản Đại học sư phạm. (Ngày truy cập: 10/06/2010) trong-danh-ths-nguyen-vu-ngoc-tung.1228005.html 63