Chào các Bạn,
Hôm nay chúng ta sẽ trao đổi đến một công cụ để quản lý tập hợp các thành phần thuộc object do chúng ta tự tạo ra (bằng cách thức ta đã trao đổi trong các bài trước). Công cụ này được Access VBA gọi là
Collection.
Trong Access VBA,
Collection là một Object như
một tập hợp các thành phần nhiều object xác định. Chẳng hạn như tập hợp từng dòng danh sách trong cùng 1 danh bạ vậy .
Collection trong Access VBA có 3 methods và 1 Property sau đây:
- Methods:
+
Add: dùng để thêm một thành phần vào Collection tự tạo. Chúng ta có thể dễ dàng truy xuất đến thành phần bất kỳ trong Collection này thông qua một khoá chỉ định, khoá này gọi là “Key”
+
Item: dùng để truy xuất đến 1 thành phần xác định thông qua 1 chỉ số index (hay là chỉ số thứ tự) của thành phần xác định đó trong Collection tự tạo
+
Remove: dùng để xoá 1 thành phần xác định khỏi Collection tự tạo thông qua chỉ số index hoặc key tương ứng của thành phần đó.
- Property:
+
Count: dùng để lấy tổng số thành phần đang có trong Collection tự tạo
Trong file ứng dụng minh họa, giả định chúng ta có nhu cầu cần xử lý một danh sách thỏa một điều kiện lọc xác định nào đó.
Cách làm khoa học nhất là sử dụng Collection để tập hợp danh sách đó lại, sau đó sẽ tùy nghi xử lý.
Với cách làm này, việc xử lý sẽ tách tập hợp danh sách này riêng ra khỏi file dữ liệu, tránh nặng nề cho các tác vụ khác trong môi trường nhiều người dùng trong mạng máy tính. Đồng thời ta cũng được lợi là danh sách (đã được lọc) ấy sẽ được lưu trữ tạm thời trong bộ nhớ máy tính (RAM) nên việc xử lý sẽ nhanh hơn.
Các Bạn xem ví dụ sau nhé:
Giả định ta muốn lấy toàn bộ danh sách đã được lọc trên form “frmContacts” để ghi vào 1 bảng dữ liệu đã được tạo trước đó (giả định bảng này tên là tblDs, với 2 cột dữ liệu: Id và Ten).
Ta sẽ phải làm 2 việc sau đây:
1. Ta viết thủ tục sau để lấy dữ liệu vào bảng tblDs, có nội dung như sau:
Mã:
Sub GetDataFromCollection(strSQL As String)
'
Dim sqlSt As String, sCri As String, vCount As Long
Dim MyRec As ADODB.Recordset
'
Dim MyObj As clsDanhba
Dim TestCol As Collection
Set TestCol = New Collection
'
Set MyRec = ProcessRecordset(strSQL)
'Sau đây ta sẽ duyệt MyRec để nạp các dòng danh sách cho TestCol (Collection)
Do Until MyRec.EOF
Set MyObj = New clsDanhba
MyObj.PopulatePropertiesFromRecordset MyRec
TestCol.Add MyObj 'Thêm thành phần vào Collection với method Add
MyRec.MoveNext
Loop
MyRec.Close
Set MyRec = Nothing
Set MyObj = Nothing
'
vCount = TestCol.Count 'Lấy tổng số dòng danh sách (thành phần) đã thêm vào Collection với Property Count
'Sau đây ta duyệt từng thành phần trong Collection TestCol để cho ghi vào bảng tblDs
'Hoặc Bạn có thể viết code khác để làm một việc nào đó khác
'Xin chú ý cách duyệt các thành phần của 1 Collection thông qua cấu trúc câu lệnh For Each ... Next
DoCmd.RunSQL "DELETE * FROM tblDs"
For Each MyObj In TestCol
With MyObj
DoCmd.Hourglass True
DoCmd.RunSQL "INSERT INTO tblDs(Id, Ten) VALUES(" & .DanhbaId & ",'" & .Ten & "')"
DoCmd.Hourglass False
End With
Next
Set TestCol = Nothing
'Open Table tblDs
MsgBox "Danh sach nay co tat ca la: " & vCount & " nguoi"
DoCmd.OpenTable "tblDs", , acReadOnly
End Sub
2. Ta bổ sung thêm thiết kế cho form “frmContacts”, với:
+ 1 nút lệnh có caption là “Lấy Danh sách”
+ và thêm thủ tục sự kiện Click Even cho nút lệnh này như sau:
Mã:
...
GetDataFromCollection GetSQL
'Cho hien ket qua len form
Call RunSearch
...
Bạn nào muốn xem chứ ngại viết như trên thì tải về file ứng dụng từ link sau nhé:
http://www.mediafire.com/?o5krl1bznxpanjy
Như vậy ta đã khảo sát xong 1 trường hợp sử dụng Collection.
Cũng xin các Bạn lưu ý: có rất nhiều cách sử dụng Collection. Ở đây tôi chỉ trình bày 1 cách, các Bạn có thể tùy trường hợp và nhu cầu cụ thể để sử dụng thích hợp.
Trong bài sau, chúng ta sẽ tìm hiểu vấn đề nên thiết kế Form gắn kết với nguồn dữ liệu (Bound-Form) hay thiết kế Form không gắn kết với nguồn dữ liệu (UnBound-Form).