-
Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
ongke0711 > 08-05-17, 02:33 AM
Chào các bạn,
Trên diễn đàn đã có nhiều kiểu Form tìm kiếm nhưng nay tôi chia sẻ với các bạn Form tìm kiếm theo nhiều tiêu chí và hiển thị ngay khi gõ ký tự hoặc chọn dữ liệu. Form này dùng Hàm, không dùng Query.
Các bạn tham khảo nhé.
Code Hàm và Sub tìm kiếm trong Form module:
Mã PHP:Option Compare Database
Option Explicit
Private mChuoiTimKiem As String
Private mDaThoiViec As Boolean
Private mPhongBan As String
Private mChucVu As String
Private Sub Form_Load()
mChuoiTimKiem = ""
mDaThoiViec = False
mPhongBan = ""
mChucVu = ""
ChayLenhTimKiem
End Sub
Private Sub ChayLenhTimKiem()
Dim sFilter As String
If Len(mChuoiTimKiem) <> 0 Then
sFilter = NoiDieuKienTK(sFilter, "HoTen Like ""*" & mChuoiTimKiem & "*""")
End If
If mDaThoiViec Then
sFilter = NoiDieuKienTK(sFilter, "DaThoiViec = True")
End If
If Len(mPhongBan) <> 0 Then
sFilter = NoiDieuKienTK(sFilter, "MaPhongBan IN(" & mPhongBan & ")")
End If
If Len(mChucVu) <> 0 Then
sFilter = NoiDieuKienTK(sFilter, "MaChucVu IN(" & mChucVu & ")")
End If
Debug.Print sFilter
Me.subHoSoCNV.Form.Filter = sFilter
Me.subHoSoCNV.Form.FilterOn = True
End Sub
Private Function NoiDieuKienTK(sFilter As String, sItem As String) As String
Dim NewFilter As String
If Len(sFilter) = 0 Then
NewFilter = sItem
Else
NewFilter = "(" & sFilter & " AND " & sItem & ")"
End If
NoiDieuKienTK = NewFilter
End Function
- Code cho các control lọc điều kiện tìm kiếm: 1 Textbox, 1 Checkbox, 2 ListBox
Mã PHP:Private Sub txtSearch_Change()
mChuoiTimKiem = Me.txtSearch.Text
ChayLenhTimKiem
End Sub
Private Sub chkDaThoiViec_Click()
mDaThoiViec = Me.chkDaThoiViec
ChayLenhTimKiem
End Sub
Private Sub lstPhongBan_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstPhongBan
For i = 0 To .ListCount
If .Selected(i) Then
s = s & "," & .Column(0, i)
End If
Next i
End With
If Len(s) Then
s = Mid(s, 2)
End If
mPhongBan = s
ChayLenhTimKiem
End Sub
Private Sub lstChucVu_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstChucVu
For i = 0 To .ListCount
If .Selected(i) Then
s = s & "," & .Column(0, i)
End If
Next i
End With
If Len(s) Then
s = Mid(s, 2)
End If
mChucVu = s
ChayLenhTimKiem
End Sub
Link file demo: http://www.mediafire.com/file/tqntflpun5...ype%29.mdb -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
subasatran > 24-03-21, 12:49 AM
Hi anh Ongke0711,
Cảm ơn về bài chia sẻ về form Tìm Kiếm của anh.
Dựa trên bài này, nếu đổi 2 Listbox thành 2 combobox thì đoạn code bên dưới
Mã:Private Sub lstPhongBan_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstPhongBan
For i = 0 To .ListCount
If .Selected(i) Then
s = s & "," & .Column(0, i)
End If
Next i
End With
If Len(s) Then
s = Mid(s, 2)
End If
mPhongBan = s
ChayLenhTimKiem
End Sub
Private Sub lstChucVu_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstChucVu
For i = 0 To .ListCount
If .Selected(i) Then
s = s & "," & .Column(0, i)
End If
Next i
End With
If Len(s) Then
s = Mid(s, 2)
End If
mChucVu = s
ChayLenhTimKiem
End Sub
phải điều chỉnh như thế nào để form tim kiếm vẫn chạy được và đúng.
2. Em có nhu cầu dùng 2 combobox liên hết với nhau để tìm kiếm như ví dụ này.
Combobox 1 là cha với rowsource là table. Combobox 2 là con với rowsource được truy vấn dựa trên combobox 1.
Dữ liệu tìm kiếm như bài ví dụ của anh.
Mong anh giúp đỡ và hướng dẫn. Cám ơn anh. -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
ongke0711 > 24-03-21, 08:05 AM
(24-03-21, 12:49 AM)subasatran Đã viết: Dựa trên bài này, nếu đổi 2 Listbox thành 2 combobox thì đoạn code bên dưới
phải điều chỉnh như thế nào để form tim kiếm vẫn chạy được và đúng.
Nếu dùng comboBox thì code ngắn gọn hơn nhiều vì không phải nối chuỗi tìm kiếm trong Listbox khi chọn nhiều Item.
Trong code tôi có dùng 2 cái biến tầm Form module là: mPhongBan, mChucVu để lưu tham số tìm kiếm từ 2 listbox, bạn chỉ cần thay đổi các truyền giá trị cho nó ở sự kiện ComboBox_AfterUpdate là được rồi. Nếu nhiều comboBox hơn thì thêm biến.
Vd:
Mã PHP:Private Sub cboCB1_AfterUpdate()
mPhongBan = Me.cboCB1.Value
End Sub
Làm tương tự cho các comboBox còn lại.
(24-03-21, 12:49 AM)subasatran Đã viết:
2. Em có nhu cầu dùng 2 combobox liên hết với nhau để tìm kiếm như ví dụ này.
Combobox 1 là cha với rowsource là table. Combobox 2 là con với rowsource được truy vấn dựa trên combobox 1.
Dữ liệu tìm kiếm như bài ví dụ của anh.
Trường hợp này xử lý giống trong demo thì trường hợp comboBox1 sau khi thay đổi nhưng chưa chọn giá trị của comboBox2 => code sẽ chỉ lọc điều kiện theo CB1 thôi. -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
subasatran > 26-03-21, 01:08 AM
Hi anh Ongke0711,
Cảm ơn anh nhiều về các gợi ý của anh.
Ở ý thứ 2,em có tìm kiếm trên mạng và tạo một Sub để lọc rowsource cho các combobox cấp 2 và 3.
Cơ bản thấy cũng lọc được trong các combobox cấp 2 và 3 nhưng nó bị vướng hai chỗ như sau:
1. Ở combobox thứ 3(MaChucVu), sau sự kiện AfterUpdate thì Function ChayLenhTimKiem nó không chạy.
2. Em muốn trường hợp khi sự kiện AfterUpdate ở các combobox cha thì các combobox con phải reset lại rỗng(trong rowsource vẫn được có dữ liệu nhưng không thể hiện lên combobox).Ví dụ như em đã chọn 3 giá trị cho 3 combobox(giả sử Phòng Kế Toán - Nhóm Báo Cáo - Kế Toán Trưởng), sau đó em chọn lại giá trị ở conbobox MaPhongBan(giả sử Phòng Thí Nghiệm) thì 2 combobox kia bị reset về rỗng(trong rowsource combobox 2 vẫn có các MaNhom và MaChucVu tương ứng với Phòng Thí Nghiệm)
Nhờ anh kiểm tra và hướng dẫn giúp em với.
Note : Em xin phép sử dụng luôn nguồn data và file của anh(em add thêm một field MaNhom để tạo ra 3 cấp). Nhu cầu của em cần filter đến 5 cấp.
Trong sub em tìm trên mạng có một số đoạn code nếu để thì bị báo lỗi, sắn tiện nếu được anh chỉ em biết nguyên nhân tại sao bị lỗi luôn không, các dòng màu cam là khi bỏ vào sub thì bị báo lỗi.
Link file đính kèm
Chi tiết Sub như bên dưới.
Mã PHP:Public Sub fnADOComboboxSetRS(cmb As ComboBox, strSQL As String)
[color=#e82a1f] 'Dim rst As ADODB.Recordset[/color]
Dim rst As DAO.Recordset
Dim lngCount As Long
[color=#e82a1f] 'On Error GoTo fnADOComboboxSetRS_Error => Dong nay[/color]
[color=#e82a1f] 'Set rs = fnADOSelectCommon(strSQL, adLockReadOnly, adOpenForwardOnly)[/color]
Set rst = CurrentDb.OpenRecordset(strSQL)
If Not rst Is Nothing Then
If Not (rst.EOF And rst.BOF) Then
Set cmb.Recordset = rst
lngCount = cmb.ListCount
End If
End If
[color=#e82a1f]'fnADOComboboxSetRS_Exit:[/color]
[color=#e82a1f]' If Not rs Is Nothing Then[/color]
[color=#e82a1f]' If rs.State = adStateOpen Then rs.Close[/color]
[color=#e82a1f]' Set rs = Nothing[/color]
[color=#e82a1f]' End If[/color]
[color=#e82a1f]' Exit Sub[/color]
[color=#e82a1f]'fnADOComboboxSetRS_Error:[/color]
[color=#e82a1f]' Select Case Err[/color]
[color=#e82a1f]' Case Else[/color]
[color=#e82a1f]' fnErr "modODBC->fnADOComboboxSetRS", True[/color]
[color=#e82a1f]' Resume fnADOComboboxSetRS_Exit[/color]
[color=#e82a1f]' End Select[/color]
End Sub
Mã PHP:Private Sub lstPhongBan_AfterUpdate()
Dim strSQL As String
mPhongBan = Me.lstPhongBan.Value
'MsgBox mPhongBan
strSQL = ""
strSQL = strSQL + " SELECT DISTINCT MaNhom"
strSQL = strSQL + " FROM tblHoSoCNV"
strSQL = strSQL + " WHERE MaPhongBan IN ('" & mPhongBan & "')"
strSQL = strSQL + " ORDER BY [MaNhom] ASC"
'MsgBox strSQL
fnADOComboboxSetRS lstNhom, strSQL
ChayLenhTimKiem
End Sub -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
ongke0711 > 26-03-21, 08:45 AM
(26-03-21, 01:08 AM)subasatran Đã viết: Ở ý thứ 2,em có tìm kiếm trên mạng và tạo một Sub để lọc rowsource cho các combobox cấp 2 và 3.
Cơ bản thấy cũng lọc được trong các combobox cấp 2 và 3 nhưng nó bị vướng hai chỗ như sau:
1. Ở combobox thứ 3(MaChucVu), sau sự kiện AfterUpdate thì Function ChayLenhTimKiem nó không chạy.
2. Em muốn trường hợp khi sự kiện AfterUpdate ở các combobox cha thì các combobox con phải reset lại rỗng(trong rowsource vẫn được có dữ liệu nhưng không thể hiện lên combobox).Ví dụ như em đã chọn 3 giá trị cho 3 combobox(giả sử Phòng Kế Toán - Nhóm Báo Cáo - Kế Toán Trưởng), sau đó em chọn lại giá trị ở conbobox MaPhongBan(giả sử Phòng Thí Nghiệm) thì 2 combobox kia bị reset về rỗng(trong rowsource combobox 2 vẫn có các MaNhom và MaChucVu tương ứng với Phòng Thí Nghiệm)
- Bạn viết code đúng rồi đó, chỉ có cái là quên thiết lập Eventprocedure cho combox 3 trong Properties.
- Về việc Reset lại các comboBox con thì đơn gỉan là bạn gán giá trị rỗng cho nó thôi. Sau khi bạn Requery 2 comboBox con thì bạn gán"
Me.combo2.Value = ""
Me.combo3.Value = ""
- Trong câu lệnh SQL tổng hợp Row Source cho comboBox: bạn không cần dùng "IN" vì điều kiện chỉ có 1 giá trị từ comboBox Cha, dùng = hoặc LIKE.
- Chú ý nếu điều kiện dạng Number thì không cần bao quanh tham số bằng dấu nháy đơn.
Nói thêm:
Vì là ví dụ mẫu nên bạn lấy nguồn cho ComboBox từ Table dữ liệu nguồn là tblHoSoNV cho nhanh chứ thực tế đừng bao giờ làm vậy. Bạn phải xây dựng riêng rẽ các table danh mục để làm nguồn cho comboBox. Bạn thử nghỉ nếu table dữ liệu nguồn lên đến trăm ngàn dòng thì mỗi lần tổng hợp Row Source cho từng ComboBox, nó phải truy vấn một lượng lớn dữ liệu như thế nào. -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
hmhieu > 01-04-21, 05:53 PM
(08-05-17, 02:33 AM)ongke0711 Đã viết: Chào các bạn,
Trên diễn đàn đã có nhiều kiểu Form tìm kiếm nhưng nay tôi chia sẻ với các bạn Form tìm kiếm theo nhiều tiêu chí và hiển thị ngay khi gõ ký tự hoặc chọn dữ liệu. Form này dùng Hàm, không dùng Query.
Các bạn tham khảo nhé.
Code Hàm và Sub tìm kiếm trong Form module:
Mã PHP:Option Compare Database
Option Explicit
Private mChuoiTimKiem As String
Private mDaThoiViec As Boolean
Private mPhongBan As String
Private mChucVu As String
Private Sub Form_Load()
mChuoiTimKiem = ""
mDaThoiViec = False
mPhongBan = ""
mChucVu = ""
ChayLenhTimKiem
End Sub
Private Sub ChayLenhTimKiem()
Dim sFilter As String
If Len(mChuoiTimKiem) <> 0 Then
sFilter = NoiDieuKienTK(sFilter, "HoTen Like ""*" & mChuoiTimKiem & "*""")
End If
If mDaThoiViec Then
sFilter = NoiDieuKienTK(sFilter, "DaThoiViec = True")
End If
If Len(mPhongBan) <> 0 Then
sFilter = NoiDieuKienTK(sFilter, "MaPhongBan IN(" & mPhongBan & ")")
End If
If Len(mChucVu) <> 0 Then
sFilter = NoiDieuKienTK(sFilter, "MaChucVu IN(" & mChucVu & ")")
End If
Debug.Print sFilter
Me.subHoSoCNV.Form.Filter = sFilter
Me.subHoSoCNV.Form.FilterOn = True
End Sub
Private Function NoiDieuKienTK(sFilter As String, sItem As String) As String
Dim NewFilter As String
If Len(sFilter) = 0 Then
NewFilter = sItem
Else
NewFilter = "(" & sFilter & " AND " & sItem & ")"
End If
NoiDieuKienTK = NewFilter
End Function
- Code cho các control lọc điều kiện tìm kiếm: 1 Textbox, 1 Checkbox, 2 ListBox
Mã PHP:Private Sub txtSearch_Change()
mChuoiTimKiem = Me.txtSearch.Text
ChayLenhTimKiem
End Sub
Private Sub chkDaThoiViec_Click()
mDaThoiViec = Me.chkDaThoiViec
ChayLenhTimKiem
End Sub
Private Sub lstPhongBan_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstPhongBan
For i = 0 To .ListCount
If .Selected(i) Then
s = s & "," & .Column(0, i)
End If
Next i
End With
If Len(s) Then
s = Mid(s, 2)
End If
mPhongBan = s
ChayLenhTimKiem
End Sub
Private Sub lstChucVu_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstChucVu
For i = 0 To .ListCount
If .Selected(i) Then
s = s & "," & .Column(0, i)
End If
Next i
End With
If Len(s) Then
s = Mid(s, 2)
End If
mChucVu = s
ChayLenhTimKiem
End Sub
Link file demo: http://www.mediafire.com/file/tqntflpun5...ype%29.mdb
Thank ongke0711. Nhưng khi mã Chức vụ hoặc Mã phòng ban là chuỗi (thay vì là số như demo) thì mình phải thay đổi code như thế nào? Mong ongke giúp đỡ! -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
ongke0711 > 01-04-21, 06:45 PM
Nếu điều kiện tìm kiếm dạng Text thì phải cho tham số vô cặp dấu nháy đơn.
Chú ý kỹ cú pháp của biến "s".
Mã PHP:Private Sub lstChucVu_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstChucVu
For i = 0 To .ListCount
If .Selected(i) Then
s = s & .Column(0, i) & "','"
End If
Next i
End With
If Len(s) Then
s = "'" & s
s = Left$(s, Len(s) - 2)
End If
mChucVu = s
ChayLenhTimKiem
End Sub -
RE: Demo Form Tìm kiếm (ngay khi gõ) nhiều tiêu chí (dùng Hàm)
hmhieu > 02-04-21, 09:31 AM
(01-04-21, 06:45 PM)ongke0711 Đã viết: Nếu điều kiện tìm kiếm dạng Text thì phải cho tham số vô cặp dấu nháy đơn.
Chú ý kỹ cú pháp của biến "s".
Mã PHP:Private Sub lstChucVu_AfterUpdate()
Dim s As String
Dim i As Integer
With Me.lstChucVu
For i = 0 To .ListCount
If .Selected(i) Then
s = s & .Column(0, i) & "','"
End If
Next i
End With
If Len(s) Then
s = "'" & s
s = Left$(s, Len(s) - 2)
End If
mChucVu = s
ChayLenhTimKiem
End Sub
ongke0711 đúng là cao thủ. Xin chân thành cảm ơn!