Filtercode werkt niet

Status
Niet open voor verdere reacties.

tobo100

Gebruiker
Lid geworden
14 okt 2013
Berichten
156
hallo Octa
ik heb n vraag aangaande een eerder article het gaat om
http://www.helpmij.nl/forum/showthread.php/650185-Dynamisch-filteren-in-access-Uitgebreid/page2
daar schijf jij #28 dat je de code voor dit programmaatje hebt herschreven
je plakt een gedeelte er van
nu is mijn vraag zou je de hele code er van willen plakken of nog liever het
het programmatje compleet in die nieuwe style
dan kan ik vandaar uit verder gaan sleutelen
ik zit net als de vraag steller daar in kwestie met numerieke velden

bij voorbaat dank Tobo
 
De filtercode is compleet; welk deel denk je te missen? Het is wellicht handiger als je jouw versie van de db post, dan kunnen we daarin zien wat er fout is.
 
klopt filtercode wel maar de rest nog niet ik heb problemen met "skeuze" variable niet gedeclareerd
daarna doet itm heel erg moeilijk "For Each itm In Me("lstFilter" & iLst).ItemsSelected"
vandaar ff de vraag voor de hele code als ik die heb lukt het misschien wel in een keer
lukt het niet dan moet ik er even wat vertrouwelijke gegevens uit sleutelen
ik hoor het van je bvd Tobo
 
Ik zag dat de variabele sKeuze inderdaad niet in de lijst met variabele declaraties stond. Die kun je er simpel bijtypen, het is een String variabele. Dus boven de functie bij de andere variabelen.
 
klopt heb ik gedaan en dan doet
daarna doet itm heel erg moeilijk "For Each itm In Me("lstFilter" & iLst).ItemsSelected"
compuleerfout:
for each besturingselement variable moet een variant of object zijn
 
even mij complete code voor de duidelijkheid
fout melding met rood aan gegeven
PHP:
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 Bedrijfsnaam_BeforeUpdate(Cancel As Integer)

End Sub

Private Sub Form_Current()
    CheckScrollbar
End Sub

Private Sub Form_Load()
    CheckScrollbar
End Sub

Private Sub cmdFilterLeeg_Click()
Dim sControl As String
''MsgBox TypeName(sControl)
    
    sControl = Screen.PreviousControl.Name
    For i = 1 To 4
        Me("txtFilter" & i).Value = ""
    Next i
    Me.Filter = ""
    Me.FilterOn = False
    Me.Requery
    Me.Repaint
    Me(sControl).SetFocus
    CheckScrollbar
''    Form_Current

End Sub

Private Sub fraOptie_AfterUpdate()
    CheckFilter
End Sub
Private Sub txtFilter1_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter1 = sWaarde
    Me.txtFilter1.SelStart = Me.txtFilter1.SelLength
End Sub

Private Sub txtFilter2_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me(sNaam).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(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter3 = sWaarde
    Me.txtFilter3.SelStart = Me.txtFilter3.SelLength
    End Sub
    
Private Sub txtFilter4_Change()
    sNaam = Screen.ActiveControl.Name
    sTag = Screen.ActiveControl.Tag
    sWaarde = Me(sNaam).Text
    CheckFilter sNaam, sWaarde
    Me.txtFilter4 = sWaarde
    Me.txtFilter4.SelStart = Me.txtFilter4.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
Dim skeuze As String
Dim itm As String 'WERKTniet

'-----------------------------------------------------------------------------------------------------------
'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
  hier gaat het fout---->>       [COLOR="#FF0000"]  For Each itm In Me("lstFilter" & iLst).ItemsSelected[/COLOR]
                            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

Function CheckScrollbar()
    
    Set rst = Me.RecordsetClone
    If Me.NewRecord Then
        Me!lblNavigate.Caption = "New Record"
    Else
        With rst
            .Bookmark = Me.Bookmark
            Me!lblNavigate.Caption = "Record " & _
                .AbsolutePosition _
                & " of " & .RecordCount
        End With
    End If
    On Error GoTo Stoppen
    rst.MoveLast
    rst.MovePrevious
    If rst.RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If

Stoppen:

End Function
 
Laatst bewerkt:
Zou je de code kunnen opmaken met de CODE knop, en niet met de QUOTE knop? Wordt-ie een stuk leesbaarder van. Er zit een foutje in je code:
Code:
For Each itm In Me("lstFilter" & i).ItemsSelected
 
nee er verandert niet om helaas zou je het complete database programma voor me willen uploaden
dan gaat het vast veel sneller
vast bedankt..
 
Verander dit:
Code:
Dim itm As String
eens naar
Code:
Dim itm As Variant
Dat wil nog wel eens helpen. je hebt de teller inderdaad iLst genoemd, dus dat deel is goed. Het gaat nu waarschijnlijk fout bij de variabele itm die van het type Variant moet zijn.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan