Live filter op lijst refreshed niet

Status
Niet open voor verdere reacties.

Bandito

Gebruiker
Lid geworden
8 okt 2012
Berichten
199
IK heb een lijst met daarin allemaal debiteuren. Via een textbox (txtdebiteurnummer) kan ik deze lijst "live" filteren. De lijst veranderd terwijl ik type.

Nu is het zo dat de lijst niet de oorspronkelijke waardes laat zien wanneer ik de textbox leegmaak. Eigenlijk zou de lijst zijn begin waardes moeten laten zien wanneer de textbox leeg wordt gemaakt. Hoe voeg ik dat toe aan de code?

Edit: Wanneer ik backspace gebruik worden er steeds meer resultaten zichtbaar maar het laatste stapje, een lege textbox, laat niet de complete lijst (zonder filter) zien.


Code achter de txtdebiteurnummer:
Code:
Private Sub txtDebiteurnummer_Change()
Dim strFullList       As String
Dim strFilteredList   As String

If blnSpace = False Then
Me.Refresh
strFullList = "SELECT Debiteurnummer, Debiteurnaam, DebZoekNaam FROM DebiteurenVertineoQuery ORDER BY Debiteurnummer;"
strFilteredList = "SELECT Debiteurnummer, Debiteurnaam, Telefoonnummer FROM DebiteurenVertineoQuery WHERE [Debiteurnummer] LIKE ""*" & Me.txtDebiteurNummer.Value & _
                  "*"" OR [Debiteurnaam] LIKE ""*" & Me.txtDebiteurNummer.Value & "*"" OR [DebZoekNaam] LIKE ""*" & Me.txtDebiteurNummer.Value & "*""  ORDER BY [Debiteurnummer]"
fLiveSearch Me.txtDebiteurNummer, Me.lstDebiteuren, strFullList, strFilteredList
End If
End Sub

Macro voor de live search:
Code:
Function fLiveSearch(ctlSearchBox As TextBox, ctlFilter As Control, _
                      strFullSQL As String, strFilteredSQL As String, Optional ctlCountLabel As Control)
  Const iSensitivity = 0
  Const blnEmptyOnNoMatch = True
  
On Error GoTo err_handle
    ctlSearchBox.SetFocus
    ctlSearchBox.SelStart = Len(ctlSearchBox.Value) + 0
        If ctlSearchBox.Value <> "" Then
            If Len(ctlSearchBox.Value) > iSensitivity Then
                ctlFilter.RowSource = strFilteredSQL
            If ctlFilter.ListCount > 0 Then
                ctlSearchBox.SetFocus
                ctlSearchBox.SelStart = Len(ctlSearchBox.Value) + 0
        Else
            If blnEmptyOnNoMatch = True Then
                ctlFilter.RowSource = ""
            Else
                ctlFilter.RowSource = strFullSQL
            End If
            End If
        Else
                ctlFilter.RowSource = strFullSQL
             End If
        Else
                ctlFilter.RowSource = strFullSQL
        End If
        If IsMissing(ctlCountLabel) = False Then
           ctlCountLabel.Caption = "Weergave van " & Format(ctlFilter.ListCount - 1, "#,##0") & " record(s)"
         End If
Exit Function
err_handle:
   Select Case Err.Number
    Case 91
    Case 94
    Case Else
         MsgBox "Er heeft zich een onverwachte fout voorgedaan" & vbCrLf & Err.Description & _
            vbCrLf & "Error " & Err.Number & vbCrLf & "Line: " & Erl
    End Select
End Function
 
Laatst bewerkt:
Ik heb wel eens eerder ingewikkelde constructies gezien, maar deze hoort in mijn top 10 thuis :). Wat een ingewikkelde manier gebruik je om te filteren! Dat kan echt simpeler.
Om te beginnen: als je wilt kunnen zoeken in meer dan één veld, en dat ook nog eens tegelijkertijd, dan is het veel simpeler om die zoekvelden in de onderliggende query samen te zetten in één veld. In de query zet je dan zoiets:
Code:
     Zoekveld: [Debiteurnummer] & [Debiteurnaam] & [DebZoekNaam]
In je zoektekstveld op je formulier hoef je dan alleen maar naar de ingetypte tekst te zoeken in dat combiveld. Omdat het veld in de onderliggende query staat, kun je er ook simpel op filteren:
Code:
Private Sub txtDebiteurnummer_Change()
    If Len(Me.txtDebiteurNummer.Text) = 0 Or Me.txtDebiteurNummer.Text = vbNullString Then
        Me.Filter = ""
        Me.FilterOn = False
    Else
        Me.Filter = "[Zoekveld] LIKE ""*" & Me.txtDebiteurNummer.Value & "*"""
        Me.FilterOn = True
    End If
End Sub
En dat is alle code die je nodig hebt om snel en soepel te kunnen filteren, waarbij je dus altijd ziet wat er is ingetypt. Of is weggehaald.
 
Een top 10, dat beschouw ik als een compliment maar komt grotendeels door onwetendheid ;)


Helaas, het werkt nog niet.

In de query:
Code:
Zoekveld: Debiteuren.[DebNr] & [Debnaam]

In het bij wijzigen event van txtDebiteurnummer:
Code:
Private Sub txtDebiteurnummer_Change()
    If Len(Me.txtDebiteurNummer.Text) = 0 Or Me.txtDebiteurNummer.Text = vbNullString Then
        Me.Filter = ""
        Me.FilterOn = False
    Else
         Me.Filter = "[Zoekveld] LIKE ""*" & Me.txtDebiteurNummer.Value & "*"""
         Me.FilterOn = True
    End If
End Sub

Wanneer ik de code toevoeg veranderd txtDebiteurnummer in overschrijven. Bijvoorbeeld wanneer ik de K indruk en vervolgens de E dan verdwijnt de K en komt de E er voor in de plaats. Daarnaast wordt de listbox niet gefiltered. Het scherm flikkert een beetje dus je ziet wel dat er iets gebeurd maar op het scherm veranderd er niks.
 
Om de cursor naar het eind te verplaatsen, moet je nog een extra regel toevoegen. Die had je (min of meer) al, dus die heb ik weggelaten. Maar hier komt de volledige code (minus een klein foutje dat er nog in zat)

Code:
Private Sub txtDebiteurnummer_Change()
    If Len(Me.txtDebiteurnummer.Text) = 0 Or Me.txtDebiteurnummer.Text = vbNullString Then
        Me.Filter = ""
        Me.FilterOn = False
        Me.txtDebiteurnummer.SetFocus
    Else
        Me.Filter = "[Zoekveld] LIKE ""*" & Me.txtDebiteurnummer.[B]Text [/B]& "*"""
        Me.FilterOn = True
        Me.txtDebiteurnummer.SelStart = Me.txtDebiteurnummer.SelLength
    End If
End Sub
Overigens heb jij van het queryveld wat anders gemaakt als ik:
Code:
     Zoekveld: [Debiteurnummer] & [Debiteurnaam] & [DebZoekNaam]
werd:
Code:
     Zoekveld: Debiteuren.[DebNr] & [Debnaam]
Jouw code zou kunnen werken als je twee velden hebt, en twee of meer tabellen met het veld [Debnr]. Dan moet je ook de tabelnaam toevoegen. Anders is dat niet nodig. In mijn voorbeeldje zit het veld DebNr maar één keer, en dan hoeft dat dus niet.
 
Helaas, hij filtered nog niet.

Ik ben nieuwe met query's en voeg dus maar voor de zekerheid een afbeelding toe met daarin de query. De gegevens worden geladen uit een externe database waarop ik dan weer een query uitvoer.

Naamloos.png
 
Dat je een externe bron gebruikt maakt niet uit, maar je geeft in de query een paar velden aan alias, en vervolgens gebruik je die aliasnaam in de zoekveld formule. En dat gaat niet werken, want je verwijst daarmee naar niet-bestaande velden. Ik zie eerlijk gezegd ook geen reden om die veldnamen te hernoemen, want de veldbeschrijvingen kun je net zo goed op een formulier aanpassen. Laat de veldnamen gewoon staan, zou ik zeggen! In ieder geval dus in de formule die het zoekveld instelt.
Code:
     Zoekveld:[DebNr] & [DebNaam] & [DebZoekNaam]
De code heb ik zelf getest op een eigen db, waarin ik dus een query gebruik waarin ik op deze manier een aantal velden samenstel, zodat de functie volkomen identiek is. En bij mij werkt het dus exact zoals ik verwacht.
 
Mijn excuses voor mijn late reactie.

in de query staat nu het volgende:
2.png

De code onder txtDebiteurnummer:
Code:
Private Sub txtDebiteurnummer_Change()
    If Len(Me.txtDebiteurNummer.Text) = 0 Or Me.txtDebiteurNummer.Text = vbNullString Then
        Me.Filter = ""
        Me.FilterOn = False
        Me.txtDebiteurNummer.SetFocus
    Else
        Me.Filter = "[Zoekveld] LIKE ""*" & Me.txtDebiteurNummer.Text & "*"""
        Me.FilterOn = True
        Me.txtDebiteurNummer.SelStart = Me.txtDebiteurNummer.SelLength
    End If
End Sub

Wanneer ik begin met zoeken gebeurt er de eerste 4 tekens niks (bijvoorbeeld 1234), er wordt niks gefilterd. zodra ik het vijfde teken ingeef crasht ie met de volgende melding:
3.png

Met de fout op:
Code:
Me.txtDebiteurNummer.SelStart = Me.txtDebiteurNummer.SelLength
 
Laatst bewerkt:
Wat gebeurt er als je in de stapmodus door de code loopt? Want het is natuurlijk heel vreemd dat er de eerste 4 tekens niks gebeurt, en na de 5e een foutmelding.
 
Of ik weet niet hoe stapmodus werkt of ik krijg er niet veel meer informatie uit:

1.png
 
Ik zou de stapmodus op de eerste regel aanzetten, niet op de laatste.
 
De stap staat nu op de eerste regel maar krijg daar al meteen de fout:
2.png

Ik kom ook niet verder met stap of stap over of iets, ik krijg hele tijd deze fout in mijn scherm:
3.png
 
Ja, dat is logisch in dit geval. Op het moment dat je hier de stapmodus aanzet, heeft het tekstvak niet meer de focus. En de eigenschap .Text kan alleen gebruikt worden op objecten die de focus hebben. Je zult de volgende regel moeten pakken :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan