Ik had hier op het forum een mooi en handig voorbeeldje gevonden van Octafish, waarbij er in een formulier een dynamische filter staat.
Ik had deze wat overgenomen, in de hoop van deze aan het werk te krijgen in mijn formulier. Ik heb hem voor een stukje aan het werk gekregen, maar helaas niet zoals ik het had willen hebben. Ik had een filter willen toepassen op naam, adres en plaats. Ik had het vakje met de keuze tussen and en or weggenomen, omdat ik graag had gehad dat hij de bestaande selectie verfijnde, wanneer je een tweede filterveld invulde. Dus ging ik er vanuit dat het zowiezo altijd een AND is.
Echter lukt zelfs een eerste stap al niet. Ik kan wel perfect filteren op de naam, maar wanneer ik het filterveld van de naam leeg laat en bvb iets invul bij het filterveld van het adres of de plaats, dan krijg ik niet alle gegevens die ik zou moeten krijgen. Iemand een idee waar de oorzaak zou kunnen zitten?
Dit gebruik ik momenteel:
Ik had deze wat overgenomen, in de hoop van deze aan het werk te krijgen in mijn formulier. Ik heb hem voor een stukje aan het werk gekregen, maar helaas niet zoals ik het had willen hebben. Ik had een filter willen toepassen op naam, adres en plaats. Ik had het vakje met de keuze tussen and en or weggenomen, omdat ik graag had gehad dat hij de bestaande selectie verfijnde, wanneer je een tweede filterveld invulde. Dus ging ik er vanuit dat het zowiezo altijd een AND is.
Echter lukt zelfs een eerste stap al niet. Ik kan wel perfect filteren op de naam, maar wanneer ik het filterveld van de naam leeg laat en bvb iets invul bij het filterveld van het adres of de plaats, dan krijg ik niet alle gegevens die ik zou moeten krijgen. Iemand een idee waar de oorzaak zou kunnen zitten?
Dit gebruik ik momenteel:
Code:
Option Compare Database
Option Explicit
Option Base 1
Dim rst As Recordset
Dim sNaam As String, sTag As String, tmp As String, sWaarde As String
Dim x As Integer, i As Integer
Private Sub txtFilter1_Change()
sNaam = Screen.ActiveControl.Name
sTag = Screen.ActiveControl.Tag
sWaarde = Me.txtFilter1.Text
CheckFilter sNaam, sWaarde
Me.txtFilter1 = sWaarde
Me.txtFilter1.SelStart = Me.txtFilter1.SelLength
End Sub
Private Function CheckFilter(Optional Zoekveld As String, Optional Waarde As String)
Dim sFilter As String
Dim sFilters() As String, sTekst() As String
Dim ctl As Control
Dim sAndOr As String
Dim rst As Recordset
Dim iFltr As Integer
'Eerst de grootte van de matrix bepalen....
x = 0
iFltr = 0
For Each ctl In Controls
With ctl
If LCase(Left(.Name, 9)) = "txtFilter" Then
.SetFocus
iFltr = iFltr + 1
On Error Resume Next
If Not .Text = "" Then
x = x + 1
ReDim Preserve sTekst(x)
sTekst(x) = .Text
End If
End If
End With
Next ctl
'Als de tekstfilters leeg zijn, dan filter leegmaken en stoppen....
If x = 0 Then GoTo LeegFilter
'...... anders doorgaan, en matrix herdefiniëren.
ReDim sFilters(x, 3)
'Dan de variabelen vullen met gegevens
i = 0
x = 0
For Each ctl In Controls
With ctl
If LCase(Left(.Name, 9)) = "txtFilter" Then
.SetFocus
'' MsgBox Asc(.Text)
If Not sTekst((i + 1)) = "" Then
i = i + 1
sFilters(i, 1) = .Tag
sFilters(i, 2) = sTekst(i)
sFilters(i, 3) = .Name
x = x + 1
End If
End If
End With
Next ctl
'Dan op basis van de variabelen het filter opbouwen
'Select Case Me.fraOptie.Value
' Case 1
sAndOr = " AND "
' Case 2
' sAndOr = " OR "
'End Select
For i = LBound(sFilters) To UBound(sFilters)
If LBound(sFilters) = UBound(sFilters) Then
sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
Else
sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
If i < UBound(sFilters) Then
sFilter = sFilter & sAndOr
End If
End If
Next i
'Filter vervolgens op formulier toepassen.
Me.Filter = sFilter
Me.FilterOn = True
If Not Zoekveld = "" Then
Me(Zoekveld).SetFocus
End If
Set rst = Me.RecordsetClone
With rst
.Bookmark = Me.Bookmark
Me!lblNavigate.Caption = "Record " & _
.AbsolutePosition + 1 _
& " of " & .RecordCount
.MoveLast
.MovePrevious
If .RecordCount < 26 Then
Me.ScrollBars = 0
Else
Me.ScrollBars = 2
End If
End With
Exit Function
LeegFilter:
Me.Filter = ""
Me.FilterOn = False
On Error Resume Next
Me(Zoekveld).SetFocus
End Function
Private Sub txtFilter2_Change()
sNaam = Screen.ActiveControl.Name
sTag = Screen.ActiveControl.Tag
sWaarde = Me.txtFilter2.Text
CheckFilter sNaam, sWaarde
Me.txtFilter2 = sWaarde
Me.txtFilter2.SelStart = Me.txtFilter2.SelLength
End Sub
Private Sub txtFilter3_Change()
sNaam = Screen.ActiveControl.Name
sTag = Screen.ActiveControl.Tag
sWaarde = Me.txtFilter3.Text
CheckFilter sNaam, sWaarde
Me.txtFilter3 = sWaarde
Me.txtFilter3.SelStart = Me.txtFilter3.SelLength
End Sub