Doorlopend formlier filteren met onafhankelijk veld

Status
Niet open voor verdere reacties.

datakraker

Gebruiker
Lid geworden
6 apr 2014
Berichten
5
Hoi, sinds kort heb ik weer tijd om mijn oude hobby weer op te pakken: lekker frutselen met een database in Acces! :D

Nou wil ik in een doorlopend formulier realtime kunnen filteren.
In de formulierkoptekst heb ik daarom onafhankelijke velden weggezet. In deze velden wil ik waarden in kunnen voeren waarmee de records binnen het formulier gefilterd worden.
Het lukt mij helaas niet om dit voor elkaar te krijgen. Ik heb het geprobeerd met een macro, en met voorbeeld VBA dat ik op dit forum had gevonden, maar helaas.
Nou heeft een macro oplossing mijn voorkeur omdat mijn VBA kennis i.c.m. Acces zo goed als nihil is.
Maar als iemand mij een VBA oplossing voor mijn database kan aanraden dan ook graag! Want mijn goal is het wel te leren kennen.

Hieronder een impressie van het formulier:
20140409 Formuliervoorbeeld.png

Hieronder een voorbeeld van een Macro filter dat ik heb geprobeerd in te stellen:
20140409 Macro voorbeeld.png

Dat werkt helaas niet omdat die de verwijzing naar het onafhankelijk veld ziet als de vraag voor in een dialoogvenster:
20140409 Dialoogvenster.png

Ik hoop dat mijn vraagstelling duidelijk is, graag verneem ik een idee voor een oplossing.
 
Nou heeft een macro oplossing mijn voorkeur omdat mijn VBA kennis i.c.m. Acces zo goed als nihil is.
Nee toch? Waarom zou je met een roeiboot de oceaan steken als je voor hetzelfde geld met een motorcruiser mee kan? Bovendien gaat het echt niet met een macro, wat in mijn ogen een heel slap vervangsel is van programmeren. De leercurve die je voor macro's nodig hebt, kun je dus veel beter in VBA steken, want uiteindelijk ga je daar toch op over. Gelijk het diepe dus maar in :).
Filteren op één tekstvak is nog wel te doen, maar ga je filters combineren, dan wordt het een stuk lastiger. Maar de structuur van het filter is niet zo heel lastig, en combineren dus ook niet.
Een voorbeeldje van filteren met één tekstvak:
Code:
Private Sub FilterTekst_Change()
Dim sFilter

    If Me.FilterTekst.Text <> "" Then
        sFilter = "[Toepassing] Like ""*" & Me.FilterTekst.Text & "*"""
        Me.Filter = sFilter
        Me.FilterOn = True
        Me.FilterTekst.SelStart = Me.FilterTekst.SelLength
    Else
        sFilter = ""
        Me.FilterOn = False
    End If
End Sub
Deze code maakt gebruik van de tekst die je intypt, en stelt het filter in.
Anders wordt het als je meerdere velden gebruikt, want dan moet je checken of a) het filter al gevuld is en b) of het veld wel is ingevuld. En hoe meer velden, hoe ingewikkelder de code wordt. In dat geval kun je veel beter een functie maken die generiek alle tekstvelden afloopt.
 
Bedankt voor je snelle reactie, ik duik graag in het diepe :)
De code ingevoerd, alleen krijg ik een foutmelding op deze regel:

sFilter = "[Toepassing] Like ""*" & Me.FilterTekst.Text & "*"""

Ik begrijp niet wat je bedoeld met [Toepassing]. Ik heb daar verwijzingen naar het te filteren veld ingevoerd maar het werkt niet.
Zou een deskundige mij dat uit willen leggen?
 
Soms is een uitleg heel erg banaal :). Een filter maakt gebruik (want werkt op) een veld. In mijn voorbeeldje: het veld [Toepassing]. That's all.
 
Dat dacht ik al omdat het tussen de rechte haakjes [] stond. Maar dat werkte niet.
Ik ga het een andere keer nog eens proberen.
 
Als je consequent bent in je naamgeving, dan zou deze code bij jou moeten werken:
Code:
Private Sub RoepnaamFilter_Change()
Dim sFilter

    If Me.RoepnaamFilter.Text <> "" Then
        sFilter = "[Roepnaam] Like ""*" & Me.RoepnaamFilter.Text & "*"""
        Me.Filter = sFilter
        Me.FilterOn = True
        Me.RoepnaamFilter.SelStart = Me.RoepnaamFilter.SelLength
    Else
        sFilter = ""
        Me.FilterOn = False
    End If
End Sub
 
Octafish je bent geweldig!!:thumb:
Het werkt zelfs met meerdere tekstvakken tegelijk.

Ik heb je tekst gekopieerd en het werkte direct.
Ik snap er niets van want dacht dat ik precies hetzelfde had gedaan, maar zal wel ergens een tikfoutje gemaakt hebben.:rolleyes:

Nou is het alleen jammer dat als zo'n zoekveld geleegd wordt dat acces de cursor laat verspringen van de formulierkoptekst naar het eerste record en snap ik niet waarom dit getypt moest worden: Me.Voorlettersfilter.SelStart = Me.Voorlettersfilter.SelLength
Maar daarvoor zal ik een nieuwe topic aan moeten maken, want mijn vraag is opgelost, nogmaals super bedankt!
 
Uitleg: SelStart en SelLength worden gebruikt om de cursor achter de laatste letter in het filtervak te zetten, nadat het filter is uitgevoerd. Als je het tekstvak leeg maakt (kan uiteraard met Backspace) dan wordt het filter uitgezet in de Else deel van de functie. Een leeg tekstvak is namelijk gelijk aan geen filter. Access ververst bij elke handeling het formulier, dus geen filter = 1e record.
 
Weer wat geleerd :)

Ik heb het probleem dat de cursor verspringt opgelost door onder in het Else blok te zetten:
Me.Filtertekst.Setfocus

Dus:
[CPP]
Private Sub FilterTekst_Change()
Dim sFilter

If Me.FilterTekst.Text <> "" Then
sFilter = "[Toepassing] Like ""*" & Me.FilterTekst.Text & "*"""
Me.Filter = sFilter
Me.FilterOn = True
Me.FilterTekst.SelStart = Me.FilterTekst.SelLength
Else
sFilter = ""
Me.FilterOn = False
Me.FilterTekst.Setfocus
End If
End Sub
[/CPP]


Overigens in tegenstelling tot mijn eerdere reactie en zoals Octafish ook al heeft opgemerkt kan met deze methode niet meerdere velden (tekstvakken) tegelijk gefilterd worden. Want intypen in een ander filterveld betekent dat het filter geheel opnieuw ingesteld wordt.
 
Je kunt, als je dat zou willen, met de eigenschap RecordsetClone en FindFirst nog een Bookmark maken, zodat je als het filter leeg gemaakt wordt daarna weer terugkeert naar het record waar je gebleven was. Maakt het wellicht helemaal af ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan