Doorlopend formulier op meerdere waarden filteren

Status
Niet open voor verdere reacties.

Sabreur1970

Gebruiker
Lid geworden
8 nov 2013
Berichten
6
Ik probeer in Access 2007 een (doorlopend) formulier te bouwen, waarin ik de mogelijkheid wil hebben op één of op meerdere criteria te filteren. De filtercriteria wil ik het liefst via een Keuzelijst kunnen kiezen.
De tabel bestaat uit ongeveer 220 records (en groeiende).
Als ik via de wizzard een keuzelijst maak kan ik wel naar een record zoeken, maar de lijst in het keuzevak is wel 220 items lang. Terwijl er maar 4 criteria in staan. Als ik het eindelijk voor elkaar heb om dit te groeperen werkt de 'filtering' opeens niet meer. :(

Ik wil kunnen filteren op : [txtLand], [txtStaat] en [txtStatus].
De keuzelijsten heten respectievelijk : [cmbFilterLand], [cmbFilterStaat] en [cmbFilterStatus]

Waarbij het aantal criteria in VeldB afhankelijk is van het gekozen criterium in VeldA (hoe dit werkt is inmiddels wel gelukt)

Ik ben nu al de hele dag aan het proberen en heb heel veel scripts gevonden. De scripts die ik enigszins kan begrijpen werken helaas niet en de scripts die misschien wel kunnen werken, zijn dusdanig ingewikkeld dat een beginner als ik er geen kaas van kan breien.

Is er een eenvoudige, begrijpelijke methode, waarop ik de filtering voor elkaar kan krijgen?

Huidige code:
Code:
Option Compare Database

Private Sub Bijschrift19_Click()
    Me.cmbFilterLand.Visible = True
    
End Sub

Private Sub cmdResetFilter_Click()

    With Me
        .Filter = ""
        .FilterOn = False
        .cmbFilterLand = ""
        .cmbFilterStaat = ""
    End With

End Sub

Private Sub Form_Current()
' Provide a record counter for using with custom navigation buttons
' (when not using Access built in navigation)
Dim rst As DAO.Recordset
Dim lngCount As Long

    Set rst = Me.RecordsetClone
    If rst.RecordCount > 0 Then
        With rst
            .MoveFirst
            .MoveLast
            lngCount = .RecordCount
        End With
    End If
    
    'Show the result of the record count in the text box (txtRecordNo)
    Me.txtRecordNo = "Record: " & Me.CurrentRecord & " van " & lngCount
    On Error GoTo 0
    Exit Sub

End Sub

Private Sub cmdAdjDate_Click()
    Me.datAanschafDatum.SetFocus
        
End Sub

Private Sub cmdAdjPrice_Click()
    Me.valAanschafPrijs.SetFocus
    
End Sub

Private Sub cmdSluiten_Click()
    DoCmd.Close acForm, Me.Form.Name

End Sub

Private Sub cmdVervers_Click()
    Me.Refresh
    
End Sub

voorbeeld van de database:
screenshot.jpg
 
Laatst bewerkt:
Je geeft wel code, maar de code waar het ècht om gaat zit er niet bij. Da's dus jammer, want de enige code die ik zou willen zien, is die van de keuzelijst(en).
 
Hi OctaFish,
da's nu nèt mijn probleem. Ik heb inmiddels een stuk of vijftien verschillende codes gevonden voor de keuzelijsten, waarbij de helft voor mij net zo goed in het chinees geschreven hadden kunnen worden omdat ze zo ingewikkeld in elkaar zaten dat ik niet eens kon begrijpen wat er nu stond. Ik kon niet eens achterhalen welke velden ik voor mijn formulier moest aanpassen :o
En de andere helft werkten gewoon niet.

De meest eenvoudige die ik kon vinden (gebaseerd op een enkel criterium) is:
Code:
Private Sub cbmFilterLand_AfterUpdate()
     Me.Filter = "[txtLand] = '" & Me.cbmFilterLand & "'"
     Me.FilterOn = True
End Sub
Maar die werkt in mijn formulier niet. Geeft geen resultaat.

En als ik deze code gebruik, zijn er dan nog andere voorwaarden aan het instellen van de gegevens van het keuzevak? Daarmee bedoel ik: Keuzevak is nu ingesteld om in het formulier het record te zoeken die ik in de lijst selecteer. Botst dat met deze functie? Misschien moet ik nog iets in de formulier-eigenschappen dingen anders instelen of juist niet. Maar dan zou ik niet weten wat.

Helaas is de Help-functie van Microsoft er in de loop van de jaren ook niet beter op geworden. Er is een aantal handleidingen in omloop, maar die zijn voornamelijk van Access2003 en ik heb inmiddels begrepen dat er heel veel veranderd is in de upgrade naar Access2007.
 
Een veld met de naam txtLand zou ik zelf nooit gebruiken; wel als naam voor een tekstveld op een formulier. Het veld zou bij mij dus [Land] heten. En uit een tabel [Landen] komen, omdat landen vaker voorkomen. En in dat geval zou ik in het formulier een landveld met een getal verwachten, niet met een tekst. Als ik naar je plaatje kijk, zou ik niet weten wèlk veld het land laat zien. Een veld met de inhoud KR zou Kroatïe kunnen zijn, maar het oogt allemaal erg Duits, dus dan denk ik eerder aan Duitsland, Oostenrijk of Zwitserland.
De code zelf overigens zou perfect moeten werken. Als die dat niet doet, ligt het dus niet aan de code, maar aan de keuzelijst/tabel.
 
Hi Michel,
tja, als het beestje maar een naam heeft. Ik geef mijn velden altijd herkenbare prefixes. txtNaam is een veld met tekst, numNaam is een veld met numerieke waarde, datNaam is een datumveld en valNaam is een veld met valuta. Doe ik ook bij de objecten. tblNaam is een tabel, qryNaam is een query, frmNaam is een formulier en rapNaam is een rapport. Zo kan je tenminst aan de veldnaam zien waar je het over hebt. Is ook een stuk makkelijker als je in een formulier een veldnaam 'Land' hebt met gegevens uit een tabel 'Land'.

KR is overigens een afko voor KeizerRijk. Het betreft hier namelijk een database voor een medaille-verzameling van duitse medailles. Ik maak daarin onderscheid omdat het duitse rijk in de geschiedenis vaak is veranderd en anders ingedeeld. Vandaar ook twee aparte tabellen met voor dit formulier twee aparte zoek-criteria. Eentje voor het 'Land' en eentje voor de afzonderlijke Staat. Maakt terugzoeken makkelijker. Een medaille uit de stad Hannover kan bijvoorbeeld als oorsprong hebben Koninkrijk Hannover, Koninkrijk Pruisen, Vrijstaat Pruisen of Bundesland Niedersachsen.

Ik zal voor nu gewoon eens proberen het formulier helemaal van blanco af aan opnieuw op te bouwen. Misschien dat er door de vele wijzigingen ergens in de eigenschappen iets verkeerds is ingeslopen wat de codering tegenwerkt. Heb jij eventueel nog tips voor de formulier-eigenschappen? Wat perse wèl en wat perse níet aan te geven (op gebied van filtrering en sortering bijvoorbeeld)
Als ik overigens een keuzelijst invoeg. Moet ik deze dan aanmaken met als typering 'record zoeken in lijst' of 'waarde gebruiken voor verder gebruik'?
 
Opgelost !!!!!!

Het is me gelukt !!!! :thumb:

met behulp van H8 van de handleiding op http://handleiding.helpmij.nl/ ben ik een heel eind gekomen.

Blijkbaar zijn er een paar dingen van belang geweest:
1) De rijbron voor de keuzelijst was in mijn eerste poging niet goed gedefinieerd. Dit ziet er nu als volgt uit
Eerste filtercriterium (land):
Code:
SELECT [tblMedaille].[txtLand], [tblMedaille].[txtLandLang] FROM tblMedaille 
GROUP BY [tblMedaille].[txtLand], [tblMedaille].[txtLandLang] 
ORDER BY [tblMedaille].[txtLand];
Tweede filtercriterium (staat):
Code:
SELECT tblMedaille.txtStaat, tblMedaille.txtStaatLang, tblMedaille.txtLand FROM tblMedaille 
GROUP BY tblMedaille.txtStaat, tblMedaille.txtStaatLang, tblMedaille.txtLand 
HAVING (((tblMedaille.txtLand)=[Formulieren]![frmVoorraad2]![cmbFilterLand])) 
ORDER BY tblMedaille.txtStaat;
2) Vervolgs is de VBA-code als volgt geworden:
Code:
Private Sub cmbFilterLand_AfterUpdate()
    Me.Filter = "[txtLand] = '" & Me.cmbFilterLand & "'"
    Me.FilterOn = True

End Sub

Private Sub cmbFilterStaat_Enter()
    Me.cmbFilterStaat.Requery
    
End Sub

Private Sub cmbFilterStaat_AfterUpdate()
    Me.Filter = "[txtStaat] = '" & Me.cmbFilterStaat & "'"
    Me.FilterOn = True

End Sub

Private Sub cmdResetFilter_Click()

    With Me
        .Filter = ""
        .FilterOn = False
        .cmbFilterLand = ""
        .cmbFilterStaat = ""
    End With

End Sub
deze methode heb ik zelfs uit weten te breiden zodat ik nu op vijf verschillende criteria kan filteren.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan