Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
619,34 KB
Nội dung
Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 162 CHƯƠNG 7 LẬP TRÌNHCƠ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ậptrì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ậptrì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. Các chủ đề sẽ được bàn đến trong chương này bao gồm: Lớp đối tượng truy cập dữliệu (DAO- Data Access Objects); Bài toán tìm kiếm; Bài toán đặt lọc; Một số bài toán khác. Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 163 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ậptrình truy cập và xử lý dữliệu trong các hệ CSDL. Ở đây CSDL Access, ngôn ngữ lậptrì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ậptrình VBA; Bước 2: Chọn thực đơn Tools | References Hộp thoại sau xuất hiện: 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. Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 164 Trước khi bước vào học lậptrì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ậptrìnhcó 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ậptrì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. 1.1 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ậptrì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ậptrì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 đó: Cơsởdữliệu Các kết nối dữliệu Ứng dụng Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 165 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ụ: Workspaces Databases RecordSets QueryDefs TableDefs Relations Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 166 - 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 '------------------------------------ '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 1.2 Đố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: Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 167 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 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. 1.3 Đố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: Khai báo Set rs=db.OpenRecordset(<Name>) Trong đó: Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 168 - 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; - <Name> 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") Một số thuộc tính của Recordset Thuộc tính Name Trả về xâu ký tự trong tham số <name> 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 Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 169 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") 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 đó. Các phương thức di chuyển bản ghi của Recorset Phương thức MoveFirts Để chuyển con trỏ về bản ghi đầu tiên Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 170 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 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 Giáo trình Microsoft Access 2000 Copyright ® Nguyễn Sơn Hải Trang 171 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 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 [...]... 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à Trang 180 Copyright® Nguyễn Sơn Hải Giáo trình Microsoft Access 2000 frm_formcon Chú ý đến tên gọi này vì phần tiếp sau sẽ sử dụng nó để lậptrì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ẹ... canbo.luongchinh = hesoluong * 290000" qr.Execute qr.Close Trang 174 Copyright® Nguyễn Sơn Hải Giáo trình Microsoft Access 2000 1.5 Đố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 Một số thuộc tính quan... 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: Trang 176 Copyright® Nguyễn Sơn Hải Giáo trình Microsoft Access 2000 Giá trị: Tương ứng với kiểu dbBoolean Boolean dbByte Byte dbChar Char dbCurrency Currency dbDate Date/Time dbDecimal... 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") tbl.Fields.Append tbl.Fields.Append... toán đặt lọc dữliệu Đặ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 sau khi đã được xây dựng và đang hoạt động: Trang 178 Copyright® Nguyễn Sơn Hải Giáo trình Microsoft...Copyright® Nguyễn Sơn Hải Giáo trình Microsoft Access 2000 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... 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 Muốn thế, việc lậptrì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... 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 End If End Sub 1.4 Đố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ậptrình tạo các Query từ các câu... 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: Trang 179 Copyright® Nguyễn Sơn Hải Giáo trình Microsoft Access 2000 - 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: - Đóng thiết kế form con lại... 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 Trang 181 Copyright® Nguyễn Sơn Hải Giáo trình Microsoft Access 2000 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 . 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. 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