Afhankelijke keuzelijsten in doorlopend formulier

Status
Niet open voor verdere reacties.

john64

Gebruiker
Lid geworden
12 jun 2011
Berichten
268
Goedemiddag
Ik heb een doorlopend formulier met o.a. 2 keuzelijsten.
De inhoud van Keuzelijst2 is afhankelijk van de gemaakte keuze in Keuzelijst1.
Na aanpassen kzl1 wordt de inhoud van kzl2 geupdate, maar het vervelende is dat dit ook gebeurd bij reeds ingevoerde records.
Dus als ik bij record1 kies in kzl1 voor Groente, dan moet ik bij kzl2 kunnen kiezen uit Sla, Andijvie, Spinazie enz.
Dit gaat goed, maar als ik bij record2 in kzl1 kies voor Fruit, dan kan ik in kzl2 kiezen voor Appel, Banaan, enz, dan is helaas ook kzl2 bij record1 geupdate.

Hoe kan ik de keuzelijsten alleen in huidig record aan laten passen ? Of is dit niet mogelijk, en moet ik in dit geval een nieuw record toevoegen door een apart formulier te maken voor het toevoegen van een enkel record.

hoop dat mijn probleemstelling beetje duidelijk beschreven is :(

mvg
John
 
Je hebt een heel logisch probleem dat niet is op te lossen. In je formulier heb je namelijk maar één keuzelijst, waarvan je er hooguit meerdere ziet, afhankelijk van het aantal records in het doorlopende formulier. En die ene keuzelijst kan uiteraard maar één Rijbron hebben. Vervelend is dat je in een eerder stadium op basis van een andere Rijbron waarden hebt gekozen, en de keuzelijst(en) die je ziet, lijken dus leeg. Maar ze zijn het, als het goed is, niet want de gekozen waarde is wel degelijk opgeslagen in je tabel. Dus heel erg is het nu ook weer niet, hooguit oogt het slecht.

Is er wat aan te doen? Ja en nee. Wat je sowieso moet doen om de keuzelijst de gekozen waarden te laten zien, is de Rijbron van de keuzelijst standaard niet te filteren. Wanneer filter je hem dan wel? Alleen als je een nieuw record aanmaakt: dan, en alleen dan, heb je namelijk de filtering nodig. Je zult dus in je procedure code moeten gebruiken die in de status NewRecord de lijst filtert, en in de overige gevallen de hele lijst laat zien.
 
Hoi Michel,
Kun je aangeven hoe je dat in de code moet regelen met NewRecord?
Code:
Private Sub kzl1_AfterUpdate()
    If Me.NewRecord Then
        kzl2.Requery
    End If
End Sub

maar dit maakt nog niet echt indruk
 
Je code is in beginsel goed maar een beetje kort door de bocht. Sowieso kan je niet met Requery werken, omdat je twee queries moet hebben, één die de keuzelijst uitleest en het filter aan de query toewijst en één die de kale query maakt. De gemaakte query wijs je dan toe als recordbron aan de keuzelijst. Maar je begin is goed :)
 
Michel,

Ik krijg het nog niet voor elkaar.
De 2e keuzelijst moet niet alleen bij NewRecord de juiste waarden filteren, maar ook als een huidig record gewijzigd wordt.
Kun je nog iets meer uitleg geven bij je opmerking over
je twee queries moet hebben, één die de keuzelijst uitleest en het filter aan de query toewijst en één die de kale query maakt. De gemaakte query wijs je dan toe als recordbron aan de keuzelijst.

Welke query moet je waar invoeren, en moet e.e.a. uitgevoerd worden bij een bepaald event ?

mvg
John
 
Als je het formulier opent, en je hebt al records in je tabel staan, dan wil je in je keuzelijst zien wat er is gekozen. Dat kan alleen als je niet kijkt naar de eerste keuzelijst (althans: op een doorlopend formulier) omdat elk record in beginsel een ander filter van de eerste keuzelijst kan hebben. De recordbron kan dus alleen maar iets zijn als: "SELECT [VELD1], [VELD2] FROM [TABEL]". Die Recordbron zet je op de 2e keuzelijst bij het laden van het formulier. Ga je een nieuw record maken (of wijzigen, maakt voor de techniek niet uit) dan verandert de situatie. Dan is de 1e keuzelijst de aansturing van de 2e. De recordbron wordt dan: "SELECT [VELD1], [VELD2] FROM [TABEL] WHERE [VELD1] = [KEUZELIJST1]". De nieuwe recordbron wijs je toe aan de 2e keuzelijst op het moment van veranderen van de 1e, dus bij het Change event of AfterUpdate. Wanneer? Me.AdNew, of, bij bijwerken, Me.Dirty=True. Dus daar bouw je een check op.
 
Hallo Michel,
Dank voor snelle antwoord op dit belachelijk late uur :)

De recordbron kan dus alleen maar iets zijn als: "SELECT [VELD1], [VELD2] FROM [TABEL]". Die Recordbron zet je op de 2e keuzelijst bij het laden van het formulier
Die heb ik

De recordbron wordt dan: "SELECT [VELD1], [VELD2] FROM [TABEL] WHERE [VELD1] = [KEUZELIJST1]".
Begrijp ik het goed dat deze code dan ergens in de VBA als recordbron toegevoegd moet worden aan de klz2 ?

Code:
Private Sub kzlCode_AfterUpdate()
Dim strSQL As String
    
    If Me.Dirty Then
        
        strSQL = "SELECT qfilActueleScopes.* " & _
                    "FROM qfilActueleScopes " & _
                    "WHERE (((qfilActueleScopes.CertificatieschemaID) = " & [kzlCode] & "))"
        
        On Error Resume Next
        
        'Voeg geselecteerde scopes toe aan keuzelijst
        Me.kzlScope.RowSourceType = "Table/Query"
        Me.kzlScope.RowSource = strSQL
        
    End If    
End Sub

Het filteren van de kzl2 gaat op zich wel goed, maar alle overige records worden ook opnieuw gefilterd, en dasniegoe

Is deze gedachtenkronkel een beetje wat het zijn moet of zit ik helemaal verkeerd ?

En eigenlijk wil ik dat kzl2 de goede gefilterde lijst laat zien, ongeacht of je kzl1 op dat moment hebt aangepast. De filtering doet het nu alleen bij wijzigen van kzl1.

mvg
John
 
Laatst bewerkt:
Je mist nog de ELSE tak. En die gebruik je om de ongefilterde recordbron toe te wijzen aan de keuzelijst.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan