lehongduc > 03-07-12, 05:31 PM
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
...
GetDataFromCollection GetSQL
'Cho hien ket qua len form
Call RunSearch
...
lehongduc > 03-07-12, 06:11 PM
lehongduc > 05-07-12, 12:27 PM
Noname > 05-07-12, 02:14 PM
(05-07-12, 12:27 PM)lehongduc Đã viết: Chào các Bạn,Bài viết rất hay và câu nói rất chí lý! Mình thấy nhiều bạn cứ cố nhét thật nhiều VBA vào để có vẻ 'pro', nhưng thật ra chỉ vài câu query là giải quyết được vấn đề.Mình từng thấy 1 chương trình kế toán chỉ có code đọc số thành chữ là dùng VBA, còn lại toàn query và macro và "10 năm vẫn chạy tốt". Và cũng đúng như bạn phân tích, unbound đúng là xử lý tốt hơn Bound, nhưng các bạn cần cân nhắc hiệu quả kinh tế khi dùng nó!
Hôm nay, xin trao đổi với các Bạn về Bound Form và UnBound Form
1. Bound Form là gì?
Bound Form là 1 form được gán Record Source xác định,
............
2. UnBound Form là gì?
Ngược với Bound Form, UnBound Form là form không gắn với 1 nguồn dữ liệu xác định nào cả.
.....
3. Vậy, nên áp dụng Bound Form hay UnBound Form? Cái nào ưu việt hơn?
Câu trả lời ở đây là: lựa chọn phải tùy vào mục đích ta áp dụng để làm gì và trong hoàn cảnh cụ thể như thế nào?
Nếu chỉ với dữ liệu chạy cục bộ, chỉ có một người sử dụng trong cùng 1 thời gian và quy mô dữ liệu không lớn lắm thì lựa chọn áp dung Bound Form sẽ tốt hơn, vì dễ dàng và nhanh chóng.
Cái nào ưu việt hơn? cái nào giúp ta đạt được mục đích với chi phí ít nhất (tiền bạc, thời gian, công sức) là cái ưu việt hơn. Ở đây chúng ta cần suy niệm nguyên tắc của tiền nhân là “đừng bao giờ mổ gà bằng dao mổ trâu và ngược lại.”
Xuân Thanh > 05-07-12, 03:16 PM
(05-07-12, 02:14 PM)Noname Đã viết:(05-07-12, 12:27 PM)lehongduc Đã viết: Chào các Bạn,Bài viết rất hay và câu nói rất chí lý! Mình thấy nhiều bạn cứ cố nhét thật nhiều VBA vào để có vẻ 'pro', nhưng thật ra chỉ vài câu query là giải quyết được vấn đề.Mình từng thấy 1 chương trình kế toán chỉ có code đọc số thành chữ là dùng VBA, còn lại toàn query và macro và "10 năm vẫn chạy tốt". Và cũng đúng như bạn phân tích, unbound đúng là xử lý tốt hơn Bound, nhưng các bạn cần cân nhắc hiệu quả kinh tế khi dùng nó!
Hôm nay, xin trao đổi với các Bạn về Bound Form và UnBound Form
1. Bound Form là gì?
Bound Form là 1 form được gán Record Source xác định,
............
2. UnBound Form là gì?
Ngược với Bound Form, UnBound Form là form không gắn với 1 nguồn dữ liệu xác định nào cả.
.....
3. Vậy, nên áp dụng Bound Form hay UnBound Form? Cái nào ưu việt hơn?
Câu trả lời ở đây là: lựa chọn phải tùy vào mục đích ta áp dụng để làm gì và trong hoàn cảnh cụ thể như thế nào?
Nếu chỉ với dữ liệu chạy cục bộ, chỉ có một người sử dụng trong cùng 1 thời gian và quy mô dữ liệu không lớn lắm thì lựa chọn áp dung Bound Form sẽ tốt hơn, vì dễ dàng và nhanh chóng.
Cái nào ưu việt hơn? cái nào giúp ta đạt được mục đích với chi phí ít nhất (tiền bạc, thời gian, công sức) là cái ưu việt hơn. Ở đây chúng ta cần suy niệm nguyên tắc của tiền nhân là “đừng bao giờ mổ gà bằng dao mổ trâu và ngược lại.”
lehongduc > 07-07-12, 05:07 PM
Function BuildSQLSelectLimitDanhba(FromId, ToId) As String
On Error GoTo HandleError
Dim strSQLRetrieve As String
sChemaName = GetSchemaTable("tblDanhsach")
strSQLRetrieve = "SELECT * FROM " & sChemaName & ".tblDanhsach"
strSQLRetrieve = strSQLRetrieve & " WHERE DanhbaId BETWEEN " & FromId & " AND " & ToId
strSQLRetrieve = strSQLRetrieve & " ORDER BY DanhbaId"
BuildSQLSelectLimitDanhba = strSQLRetrieve
Exit Function
HandleError:
GeneralErrorHandler Err.Number, Err.Description, DB_QUANLY, "BuildSQLSelectLimitDanhba"
Exit Function
End Function
Function RetrieveDanhba(WithLimit As Boolean, Optional FromId, Optional ToId) As ADODB.Recordset
'RetrieveDanhba: Truy xuat recordset cua Danhba thong qua cau lenh strSQLStatement
On Error GoTo HandleError
Dim strSQLStatement As String
Dim rsCont As New ADODB.Recordset
‘Dòng ngay bên dưới là dòng để nạp chuỗi SELECT toàn bộ danh bạ
'strSQLStatement = BuildSQLSelectDanhba
‘==== Nay ta REM nó lại để nạp đoạn code thay thế sau đây:======
If WithLimit = True Then
strSQLStatement = BuildSQLSelectLimitDanhba(FromId, ToId)
Else
strSQLStatement = BuildSQLSelectDanhba
End If
‘============== HẾT ĐOẠN CODE MỚI ===============
Set rsCont = ProcessRecordset(strSQLStatement)
Set RetrieveDanhba = rsCont
Exit Function
HandleError:
GeneralErrorHandler Err.Number, Err.Description, CLS_DANHBA, "RetrieveDanhba"
Exit Function
End Function
Public lngRecCount As Long
Sub GetTotalRecCount()
Dim strSQLStatement As String
Dim rsSourceRec As ADODB.Recordset
strSQLStatement = BuildSQLSelectDanhba
Set rsSourceRec = ProcessRecordset(strSQLStatement)
lngRecCount = rsSourceRec.RecordCount
Set rsSourceRec = Nothing
End Sub
lehongduc > 08-07-12, 07:03 AM
lehongduc > 08-07-12, 09:05 PM
Private Sub SetComboRowSource(stFilter)
Dim sqlSt As String
Dim r As ADODB.Recordset
sqlSt = "SELECT ten, diachi, danhbaid FROM " & GetSchemaTable("tblDanhsach") & ".tblDanhsach"
sqlSt = sqlSt & " WHERE ten LIKE N'%" & stFilter & "%'"
sqlSt = sqlSt & " ORDER BY danhbaid"
Debug.Print sqlSt
Set r = ProcessRecordset(sqlSt)
Set Me.Combo0.Recordset = r
With Me.Combo0
.BoundColumn = 1
.ColumnCount = 3
.ColumnWidths = "7 Cm;7 Cm;0"
End With
r.Close
Set r = Nothing
End Sub
Private Sub Combo0_Enter()
If Len(Me.Combo0) > 0 Then SetComboRowSource Me.Combo0
End Sub
lehongduc > 09-07-12, 07:56 AM
Private Sub Combo0_KeyDown(KeyCode As Integer, Shift As Integer)
Dim stFilter
If KeyCode = vbKeyF4 Or (KeyCode = vbKeyDown And Shift = acAltMask) Then 'Bẩy phím F4 hoặc Alt+Mũi tên xuống
stFilter = Me.Combo0.Text
If Len(stFilter) > 0 Then
SetComboRowSource stFilter
End If
End If
End Sub
lehongduc > 09-07-12, 01:22 PM