ongke0711 > 08-05-17, 02:33 AM
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
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
subasatran > 24-03-21, 12:49 AM
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
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.
Private Sub cboCB1_AfterUpdate()
mPhongBan = Me.cboCB1.Value
End Sub
(24-03-21, 12:49 AM)subasatran Đã viết:
subasatran > 26-03-21, 01:08 AM
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
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
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)
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
ongke0711 > 01-04-21, 06:45 PM
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
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