Ik heb je voorbeeldje aangepast, en via wat plaatjes en dit verhaal, hoop ik dat je snapt wat er gebeurt!
Allereerst: je hebt een keuzelijst gemaakt voor de merken, die bijna goed is, maar nog niet helemaal... Je hebt er namelijk een query voor gemaakt, die alle merken en types laat zien, terwijl je eigenlijk alleen maar uit de merken wilt kunnen kiezen. In jouw voorbeeld zijn er bijvoorbeeld 2 Vespa's in de lijst, en dat komt omdat je 2 types hebt. Maar het merk hoef je natuurlijk maar één keer te zien. In het nieuwe voorbeeld heb ik dat aangepast, door alleen de kolom Merk in de keuzelijst te zetten, en de optie <Totalen> te gebruiken, zodat je kunt groeperen op Merknaam. Door dit te doen, komen de merken maar één keer voor in de lijst, en dat is wat je ook wilt. Zoals je ziet, heb ik de kolom Typen verwijderd; zou ik dat niet hebben gedaan, dan hadden de merken er nog steeds twee keer in voorgekomen, omdat de optie Groeperen alle combinaties van velden maakt, en die één keer laat zien. Omdat je twee typen hebt voor Vespa, zou je er nog steeds twee zien.
Da's een!
Nu het moeilijkste deel.... De tweede keuzelijst. Zoals je al snapt, kun je pas een type selecteren als je weet welk merk het is. Omdat Access formulieren niet automatisch bijwerkt als je iets op een formulier verandert, moeten wij dat zelf doen. Dat doe je, door Gebeurtenissen te maken.
In dit geval maken we een procedure bij de gebeurtenis <Na bijwerken> van de keuzelijst Merken, omdat deze keuzelijst de verandering op het formulier triggert: je kiest tenslotte een merk uit de keuzelijst, waarna de Typen keuzelijst moet veranderen.
De code die we gaan maken, ziet er als volgt uit:
Code:
Private Sub cboMerk_AfterUpdate()
Dim strSQL As String
strSQL = "SELECT Type FROM [Scooter kosten] " _
& "WHERE (Merk = '" & Me.cboMerk.Value & "') ORDER BY Type;"
Me.cboType.RowSource = strSQL
Me.cboType.Requery
End Sub
Wat doen we hier nu precies?
Allereerst maken we gebruik van een
variabele. Dit is een stukje geheugen in Access, waar we iets in gaan bewaren, in dit geval een stukje tekst.
We beginnen dus met de regel
Dim strSQL as String.
Vervolgens qaan we een
query maken. Zelf maak ik, als de query een beetje ingewikkeld is, een query via de Querybuilder, en kopieer vervolgens de code naar het VBA scherm. Daarna pas ik de query zodanig aan dat hij goed werkt, en klaar is-tie!
In dit geval kun je hem uiteraard ook overtypen, want hij is niet zo lang. We gaan een SQL (query) tekstregel maken, die we
toewijzen aan de variabele die we hebben gedeclareerd.
strSQL = "SELECT Type FROM [Scooter kosten] " _
Het eerste deel van de tekst selecteert het veld Type uit de tabel Scooter kosten.
Het tweede deel
& "WHERE (Merk = '" & Me.cboMerk.Value & "') ORDER BY Type;"
bevat de selectie die we gaan maken uit de tabel Scooter kosten. We willen de types hebben uit de tabel waarvan het Merk gelijk is aan het merk dat we hebben geselecteerd uit de keuzelijst cboMerk. Die vergelijking vind je achter het WHERE deel: Merk='Vespa' zou bijvoorbeeld een uitkomst kunnen zijn als je Vespa hebt geselecteerd, of Merk='Asprilia' als je Asprilia aanklikt.
De tekst wordt opgehaald met de formule Me.cboMerk.Value.
Daarmee is de SQL tekst klaar: er staat dus iets als:
Selecteer in de tabel Scooter Kosten de types, als het merk Vespa is.
(Vrij vertaald)
De volgende stap is: vertel de keuzelijst Type dat de lijst moet opties is aangepast.
Dat gebeurt hier:
Me.cboType.RowSource = strSQL
We zeggen dus: we stellen de Rijbron (in Eigenschappen) van de keuzelijst Type in op de tekst die we met strSQL hebben gemaakt.
Om de waarden nog te kunnen zien als we een ander merk kiezen, hebben we nog één opdracht nodig, en die luidt:
Me.cboType.Requery
Hiermee wordt de bron van de keuzelijst a.h.w. ververst. Laat je die regel weg, dan zal het formulier altijd de keuze laten zien die je de eerste keer krijgt als je een Merk selecteert. En da's natuurlijjk niet de bedoeling!
Hopelijk is het een beetje duidelijker, anders hoor ik het wel!