Bekijk de onderstaande video om te zien hoe je onze site als een web app op je startscherm installeert.
Opmerking: Deze functie is mogelijk niet beschikbaar in sommige browsers.
Zoals ik al eerder aangaf, de functie IsNumeric is onbetrouwbaar om te bepalen of een veldtype numeriek of tekst is!Werknummer is alleen wel tekst wat nu dan gezien wordt als een nummeriek veld?
of kan ik dat omzeilen?
Private Sub txtFilter1_Change()
sNaam = Screen.ActiveControl.Name
sTag = Me(sNaam).Tag
sWaarde = Me(sNaam).Text
CheckFilter sNaam, sWaarde
Me(sNaam) = sWaarde
Me(sNaam).SelStart = Me(sNaam).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 tmpMatrix
Dim tmp
Dim rst As Recordset
Dim iFltr As Integer, iLst As Integer
'-----------------------------------------------------------------------------------------------------------
'Eerst de grootte van de matrix bepalen....
'Dat doen we door alle filters door te lopen, en de inhoud in een matrix te zetten.
'We lopen door de controls heen op basis van het ControlType.
'-----------------------------------------------------------------------------------------------------------
x = 0
iFltr = 0
iLst = 0
For Each ctl In Controls
With ctl
Select Case .ControlType
Case acTextBox
If LCase(Left(.Name, 9)) = "txtFilter" Then
.SetFocus
iFltr = iFltr + 1
On Error Resume Next
If Not .Text = "" Then
x = x + 1
If x = 1 Then
ReDim sTekst(x)
Else
ReDim Preserve sTekst(x)
End If
'-----------------------------------------------------------------------------------
'De matrix wordt gevuld met de Veldnaam, de Filternaam en het Filterveld.
'Deze worden met een scheidingsteken in één string gezet die later gesplitst wordt.
'-----------------------------------------------------------------------------------
sTekst(x) = .Tag & "|" & .Text & "|" & .Name
End If
End If
Case acListBox
'-------------------------------------------------------------------------------------------
'Een listbox kan meerdere items bevatten die geselecteerd worden.
'Die moeten allemaal apart worden uitgelezen.
'-------------------------------------------------------------------------------------------
If LCase(Left(.Name, 9)) = "lstFilter" Then
sKeuze = ""
.SetFocus
iFltr = iFltr + 1
iLst = iLst + 1
On Error Resume Next
If Me("lstFilter" & iLst).ItemsSelected.Count >= 1 Then
x = x + 1
If x = 1 Then
ReDim sTekst(x)
Else
ReDim Preserve sTekst(x)
End If
For Each itm In Me("lstFilter" & iLst).ItemsSelected
sKeuze = sKeuze & Me("lstFilter" & iLst).ItemData(itm) & "\"
Next itm
Do While Right(sKeuze, 1) = "\"
sKeuze = Left(sKeuze, Len(sKeuze) - 1)
Loop
'-----------------------------------------------------------------------------------
'Ook hier wordt een samengestelde string gemaakt van de filterwaarden.
'-----------------------------------------------------------------------------------
sTekst(x) = .Tag & "|" & sKeuze & "|" & .Name
End If
End If
Case acComboBox
If LCase(Left(.Name, 9)) = "cboFilter" Then
.SetFocus
iFltr = iFltr + 1
On Error Resume Next
If Not .Value = "" Then
x = x + 1
If x = 1 Then
ReDim sTekst(x)
Else
ReDim Preserve sTekst(x)
End If
sTekst(x) = .Tag & "|" & .Text & "|" & .Name
End If
End If
End Select
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.
'===========================================================================================================
'-----------------------------------------------------------------------------------------------------------
'Dan de variabelen vullen met gegevens
'We doen dat door een extra matrix te maken op basis van het filter
'-----------------------------------------------------------------------------------------------------------
ReDim sFilters(x, 3)
For i = LBound(sFilters) To UBound(sFilters)
tmpMatrix = Split(sTekst(i), "|")
For x = LBound(tmpMatrix) To UBound(tmpMatrix)
sFilters(i, x + 1) = tmpMatrix(x)
Next x
Next i
i = 0
x = 0
'===========================================================================================================
'-----------------------------------------------------------------------------------------------------------
'Dan op basis van de variabelen het filter opbouwen
'-----------------------------------------------------------------------------------------------------------
Select Case Me.fraOptie.Value
Case 1
sAndOr = " AND "
Case 2
sAndOr = " OR "
End Select
sFilter = ""
For i = LBound(sFilters) To UBound(sFilters)
If LBound(sFilters) = UBound(sFilters) Then
If InStr(sFilters(i, 2), "\") > 0 Then
tmpMatrix = Split(sFilters(i, 2), "\")
For x = LBound(tmpMatrix) To UBound(tmpMatrix)
'-------------------------------------------------------------------------------------------
'Eerst controleren of er getallen in het spel zijn, of tekst.
'-------------------------------------------------------------------------------------------
If IsNumeric(tmpMatrix(x)) Then
sFilter = sFilter & "[" & sFilters(i, 1) & "] = " & tmpMatrix(x)
Else
sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & tmpMatrix(x) & "*"""
End If
If x < UBound(tmpMatrix) Then sFilter = sFilter & " OR "
Next x
Else
sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
End If
Else
'---------------------------------------------------------------------------------------------------
'Vervolgens controleren of de listbox meerdere items bevat, die gesplitst moeten worden.
'Die worden dan allemaal apart worden uitgelezen en in het filter gezet.
'---------------------------------------------------------------------------------------------------
If InStr(sFilters(i, 2), "\") > 0 Then
tmpMatrix = Split(sFilters(i, 2), "\")
For x = LBound(tmpMatrix) To UBound(tmpMatrix)
'-------------------------------------------------------------------------------------------
'Uiteraard ook hier weer controleren of er getallen in het spel zijn, of tekst.
'-------------------------------------------------------------------------------------------
If IsNumeric(tmpMatrix(x)) Then
sFilter = sFilter & "[" & sFilters(i, 1) & "] = " & tmpMatrix(x)
Else
sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & tmpMatrix(x) & "*"""
End If
If x < UBound(tmpMatrix) Then sFilter = sFilter & " OR "
Next x
Else
If IsNumeric(sFilters(i, 2)) Then
sFilter = sFilter & "[" & sFilters(i, 1) & "] = " & sFilters(i, 2)
Else
sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
End If
If i < UBound(sFilters) Then
sFilter = sFilter & sAndOr
End If
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
'===========================================================================================================
'-----------------------------------------------------------------------------------------------------------
'En als laatste functie om de verticale scrollbar aan- of uit te zetten.
'-----------------------------------------------------------------------------------------------------------
CheckScrollbar
'===========================================================================================================
Exit Function
LeegFilter:
Me.Filter = ""
Me.FilterOn = False
On Error Resume Next
Me(Zoekveld).SetFocus
End Function
Option Compare Database
Option Explicit
Function tmpDossierIDOpslaan() As Integer
'geheugen reserveren voor tmpDossierID
Dim tmpDossierID As Integer
'Variabele declareren
tmpDossierID = DossierID
End Function
Function tmpDossierIDLaden() As Integer
Me.DossierID = tmpDossierID
End Function
Option Compare Database
Option Explicit
Public plngDossierGeselecteerd As Long
Function fDossierGeselecteerd() As Long
fDossierGeselecteerd=plngDossierGeselecteerd
End Fuction
plngDossierGeselecteerd=me!DossierID
DoCmd.OpenForm "frmDossiersEnkel", , , "dossier_ID=" & Me!Dossier_ID
plngDossierGeselecteerd=me!DossierID
Option Compare Database
Option Explicit
Public plngDossierGeselecteerd As Long
Function fDossierGeselecteerd() As Long
fDossierGeselecteerd=plngDossierGeselecteerd
End Function
Private Sub Form_Load()
Me.DossierID = fDossierGeselecteerd
End Sub
Dan zou je de code algemener kunnen maken, door ze, na wat aanpassingen, in een algemene module te zetten. Die code kan dan van uit ieder zoekformulier worden opgeroepen.Ik ga denk ik meer van dit soort filter zoek schermen bouwen
Je hebt een formulier <Filteren> in je db, die het inderdaad niet doet. Maar die had ik binnen 12 seconden weer aan de praat: de velden die in de tabel zaten heb je een andere naam gegeven op de tekstvakken. Op zich mag dat wel, maar je filtert op de Tabelvelden, niet op de Formuliervelden. Dus door de <Extra Info> in de zoekvelden te koppen aan de tabelvelden, deed het filter het gelijk weer. Maar je laatste opmerking slaat vermoedelijk op een ander formulier?
We gebruiken essentiële cookies om deze site te laten werken, en optionele cookies om de ervaring te verbeteren.