Leuk dat een aantal mensen een oplossing geeft die vergelijkbaar is met het verwijderen van dode blaadjes uit een plant, maar het lijkt mij nuttiger om het probleem bij de
wortels aan te pakken. En dat is: waarom zou je filteren op formulier A, en de resultaten bekijken op formulier B? Dat is a) onhandig, b) tijdrovend en c) lastiger te programmeren, en d) moeilijker in het onderhoud. Ik denk bijvoorbeeld aan de situatie dat je een filter maakt, het formulier opent en vervolgens een ánder filter wilt gebruiken. Moet je eerst het formulier sluiten, nieuw filter maken en formulier opnieuw openen. Laat ik het laten bij de opmerking dat ík dat bepaald niet handig vind!
Mijn oplossing is dus: wat is nu makkelijker dan de filters op formulier frmSelectie te zetten? Daarmee omzeil je alle genoemde problemen: je krijgt bij het openen gelijk alle beschikbare records te zien, en kunt dan naar hart en lust gaan filteren. Dat filteren doe je natuurlijk niet (alleen) op de tabellen tblJaar en/of tblMaand, maar
altijd in combinatie met de tabel tblSelectie, omdat je (lijkt mij
alleen waarden wilt filteren die in tblSelectie voorkomen. Waarom zou je een jaar filteren of een maand, die nog niet gebruikt is? Nutteloos...
Dan krijg je dus in de koptekst van frmSelectie drie extra keuzelijsten, waarmee je de gevraagde selecties kunt maken. Die filter je dan ongeveer zoals hierboven in de twee voorbeelden zijn aangegeven. Ik gebruik daarvoor een aparte functie:
Code:
Function Filteren()
Dim sFilter As String
If Not IsNull(Me.cboJaar.Value) Then sFilter = "Jaar=" & Me.cboJaar.Value
If Not IsNull(Me.cboMaand.Value) Then sFilter = sFilter & IIf(sFilter <> "", " AND ", "") & "Maand=" & Me.cboMaand
If Not IsNull(Me.cboStatus.Value) Then sFilter = sFilter & IIf(sFilter <> "", " AND ", "") & "Status=" & Me.cboStatus
With Me
.Filter = sFilter
.FilterOn = (Not sFilter = vbNullString)
End With
End Function
En die start je vanaf je formulier met drie acties:
Code:
Private Sub cboJaar_Click()
Filteren
End Sub
Code:
Private Sub cboMaand_Click()
Filteren
End Sub
Code:
Private Sub cboStatus_Click()
Filteren
End Sub
En om de keuzelijsten leeg te maken:
Code:
Function FilterWeg()
With Me
.cboJaar = Null
.cboMaand = Null
.cboStatus = Null
.Filter = ""
.FilterOn = False
End With
End Function
Code:
Private Sub Knop16_Click()
FilterWeg
End Sub