Combineren van comboboxes

Status
Niet open voor verdere reacties.

Marcel4831

Gebruiker
Lid geworden
25 mei 2021
Berichten
21
Geachte,

Ik heb twee tabellen in Access:

1. Landen met als fieldname LandID en Landnaam.
2. Steden met als fieldname StadID, Stadnaam en LandID.

De bedoeling is, wanneer via een combobox in de eerste tabel een land gekozen wordt dat in de tweede combobox enkel de steden van dat specifieke land verschijnen.
Daarom heb ik in de tweede tabel ook de feeldname LandID voorzien heb om te kunnen koppelen.

Het lukt mij echter niet.
Hoe kan ik dat best oplossen?

M.v.g.
Marcel
 
Laatst bewerkt:
Toch is dat niet zo moeilijk. Er zit wel een klein stukje programmeerwerk aan vast. Zelf doe ik e.e.a. op basis van de keuzelijst cboLand. Daarin kies je namelijk je LandID. Ik gebruik zelf een voorbeeld op basis van Provincie, Stad en Straatnaam, maar je kunt dat wel ombouwen denk ik.

Code:
Private Sub cboProvincie_Click()
    strSQL = "SELECT DISTINCT PlaatsID, Plaats, Gemeente FROM Plaats WHERE ProvincieID=" & Me.cboProvincie & " ORDER BY [Plaats];"
    With Me.cboPlaats
        .RowSource = strSQL
        .Requery
        .SetFocus
    End With
End Sub

Code:
Private Sub cboPlaats_Click()
    strSQL = "SELECT DISTINCT StraatID, Straat FROM Straat WHERE PlaatsID=" & Me.cboPlaats.Value & " ORDER BY Straat;"
    With Me.cboStraat
        .RowSource = strSQL
        .Requery
        .SetFocus
    End With
End Sub

Code:
Private Sub cboStraat_Click()
    strSQL = "SELECT Postcode, Van, Tem, Soort, StraatID FROM Postcodes WHERE StraatID=" & Me.cboStraat.Value & " ORDER BY Postcode, Soort, Van"
    With Me.cboPostcode
        .RowSource = strSQL
        .Requery
        .SetFocus
    End With
End Sub
 
Hartelijk dank voor Uw reactie maar ik had toch graag wat meer uitleg gekregen.
Als ik het goed begrijp hebt U een gewone cbo.Provincies aangemaakt en wordt er bij "On Click" een Me.provincies gecreeerd,. Waar staat die Me. voor?
Wat is de combinatie voor Plaats?
 
Je interpreteert de code verkeerd. Ik heb in mijn voorbeeld drie keuzelijsten: cboProvincie, cboPlaats en cboStraat (in werkelijkheid zijn het er nog meer ;)). Elke keuzelijst in de 'boom' stelt de onderliggende tak in, dus cboProvincie stelt de bron van cboPlaats in, en die stelt de bron op zijn beurt de bron in van cboStraat. Je hebt immers veel meer straten (226777) dan dan plaatsen (2456) dan provincies (12). Dus met de gebeurtenis <Bij Klikken> stel je de opvolgende keuzelijsten in (Ik gebruik meestal Bij klikken, niet Na bijwerken).

Me. etc. is slechts een techniek om van een object op een formulier met één aanroep meerdere eigenschappen in te stellen. Me staat daarbij voor het actieve object, en dat is het formulier zelf. Zou ik With Me niet gebruiken, dan kreeg je: Me.cboPlaats.Rowsource, Me.cboPlaats.Requery en Me.cboPlaats.SetFocus als opdracht. Mag ook, veel minder efficient. En je typt je het klaplazarus. Nu roep je één keer een object aan, en kun je met de punt (.) gelijk de gewenste eigenschappen kiezen uit de keuzelijst. Vind ik persoonlijk veel makkelijker werken. Maar doet dus niks af aan de acties zelf.
 
Het is me helemaal niet duidelijk.
Ik stel de code in zoals U voor Provincies hebt voorgeschreven en geeft geen foutmeldingen.
Hoe wordt de verbinding gemaakt tussen cboProvincies en cboPlaats. Wanneer ik een cboplaats wil aanmaken krijg ik als bron enkel de keuze tussen tables en queries of beide.
Hoe introduceer ik de bron voor de cboPlaats?
U bent enorm ervaren in deze materie en misschien ziet U enkele details over het hoofd omdat ze voor U zo vanzelfsprekend zijn terwijl ik als leek niet kan volgen.

M.v.g.
Marcel
 
Hoe wordt de verbinding gemaakt tussen cboProvincies en cboPlaats. … Hoe introduceer ik de bron voor de cboPlaats?
Als je de codes bekijkt, dan zie je dat de vervolg Keuzelijsten geen rijbron hebben :). De rij bronnen worden ingesteld nadat je een keuze hebt gemaakt in de bovenliggende keuzelijst. Daarom zie je een aantal codes met de regel .RowSource = strSQL. Oftewel: het zijn niet-gebonden Keuzelijsten. En jij hoeft daar dus niets aan in te stellen.
 
Geachte,

Er loopt duidelijk nog iets fout.
Even alles op een rijtje:

Ik maakte een combobox, cboProvincie die me een keuzelijst met provincies geeft.
Ik creëerde een Event Procedure zoals in Uw voorbeeld aangegeven
Bij het aanklikken van een bepaalde provincie loopt waarschijnlijk de procedure, ik krijg in elk geval geen foutmeldingen.
Bij de selectie van "Plaats" krijg ik echter geen drop down menu, enkel een leeg vakje.
Wat doe ik verkeerd?

M.v.g.
Marcel
 
De glazen bollen zijn helaas op in Rotterdam, en ik heb alleen een defect exemplaar liggen, want ik zie er niks in :). Zonder de db te zien is het lastig, zonder de gebruikte code onmogelijk. Je zult op zijn minst meer informatie moeten geven.
 
@OctaFish, Hoewel jouw code in #2 zou moeten werken krijg ik het ook niet aan de praat. Access gebruik ik bijna alleen om grote datasets snel te kunnen analyseren en niet vaak voor dit soort zaken. Om niet dommer te worden is het natuurlijk wel leuk om in dit soort vragen mee te kijken.:d

In de db 2 tabellen, 1 query om typo's uit te sluiten en een form met 2 comboboxen. In de variabele y heb ik even de SQL-code van Query1 gezet.

Code:
Option Compare Database
Private Sub CBO_Provincie_Click()
'strSQL = "SELECT DISTINCT Plts_ID, Plaatsnaam, FROM TblPlaatsen WHERE Prov_ID=" & Me.CBO_Provincie & " ORDER BY [Plaatsnaam]"
y = "SELECT TblPlaatsen.Plts_ID, TblPlaatsen.Plaatsnaam, TblPlaatsen.Prov_ID FROM TblPlaatsen WHERE (((TblPlaatsen.Prov_ID)=1)) ORDER BY TblPlaatsen.Plaatsnaam;"

    With Me.CBO_plaats
        .RowSource = y 'strSQL
        .Requery
        .SetFocus
    End With
End Sub
 

Bijlagen

@vena: jouw voorbeeldje bevat een aantal fouten. De belangrijkste: je hebt de keuzelijst ingesteld als <Lijst met waarden>. Dat werkt nooit samen met een SQL string. Daarnaast heb je ook nog eens een SQL string ingesteld op de keuzelijst CBO_plaats, en dat is dus óók een foutje, omdat je de SQL nu juist vastlegt d.m.v. de keuzelijst CBO_Provincie. Díe gebruik je om de recordbron van de keuzelijst te bepalen. De vervolgkeuzelijst moet dus niet-gebonden zijn. Zoals ik in bericht #6 al heb uitgelegd :). Als je deze twee aanpassingen maakt, dan werkt de db al zoals het hoort. Ik zou dan nog wel de opmaak van de kolommen aanpassen. Nu gebruik je één kolom, dus je ziet alleen het veld Plts_ID. JE wilt natuurlijk de plaatsnamen zien :).
 
Bedankt voor je reactie. Ga ik even mee stoeien.:thumb: Waarschijnlijk heeft de TS dan dezelfde fouten gemaakt en is het nut van een voorbeeldje weer aangetoond. Even los van het debuggen kost het opzetten van zo'n Db maar een paar minuten. Dus waarom mensen het niet gelijk doen blijft een beetje een raadsel.

@Marcel4831, je moet er ook voor zorgen dat het gebruik van macro's is toegestaan. (Had ik in eerste instantie ook uitstaan en dan gebeurt er sowieso niets)
 
Geachte,

Hartelijk dank voor de suggesties maar ik kon de code niet laten draaien.
Na enig zoek- en probeerwerk heb ik volgende code toegepast en die werkt zoals verwacht.

Private Sub CboProvincie_AfterUpdate()

Me.CboPlaats.RowSource = "SELECT [Plaats].[PlaatsID], [Plaats].[Plaats], [Plaats].[Gemeente]" & "FROM [Plaats]" & "WHERE [PlaatsID] = " & Me.cboProvincie & _
" ORDER BY Plaats"
Me.CboPlaats = Me.CboPlaats.ItemData(0)

Ik zal de vraag afsluiten

M.v.g.
Marcel
 
Laatst bewerkt:
Nooit AfrerUpdate gebruiken als het niet nodig is: _Click is in dit geval echt de beste optie. Zoals al een paar keer uitgelegd :).
 
Geachte OctaFish,

U hebt inderdaad al geschreven dat 'On Click' beter is dan 'After Update'.
Ik heb omgeschakeld en het resultaat blijft hetzelfde.
Wat is dan het grote verschil tussen beide opties?

M.v.g.
Marcel
 
After_update wordt pas uitgevoerd als je het object verlaat. _Click wordt uitgevoerd zodra je in de keuzelijst een keuze aanklikt. Code wordt dus direct uitgevoerd als je klikt. Bij After_Update moet je dus eerst een ander object activeren. Ik combineer de aangereikte code vaak met een Dropdown op de volgende keuzelijst. De gebruiker kan dan gelijk beginnen met selecteren, en hoeft niet eerst de keuzelijst open te klikken. Het werkt dus makkelijker en sneller. What’s not to like? :).
 
Weet wel iets van Access, heb hier nooit van gehoord, dus klopt dit?
Graag ook bewijzen van andere!
 
Bewijs? Kun je makkelijk zelf testen lijkt mij. Gebruik een keuzelijst, maak een kopie, en zet dezelfde code bij de één in Na bijwerken, en bij de ander Bij klikken en kijk wat er gebeurt. Bijvoorbeeld als actie de waarde van (een kolom van de) keuzelijst in een tekstvak zetten. Of de tweede keuzelijst gelijk uitklappen. Ik heb het overgebruikersgemak, waarbij de gebruiker minder handelingen hoeft te doen en dus automatisch sneller kan werken. Technisch maakt het uiteraard geen donder uit qua snelheid.
 
Harry,

Dan leest OctaFish zijn eigen handleiding (hoofdstuk 8) nog maar eens een keer.

Gr. Cor
 
Wat nou Cor, heb je de handleiding echt gelezen? :d.
 
Overigens maak ik in de cursus geen vergelijking tussen _AfterUpdate en _Click. Dit hoofdstuk is bedoeld voor beginners die voor het eerst met de wizard een keuzelijst maken en daarbij wordt dus AfterUpdate gebruikt. Ik hoef jou toch hopelijk niet uit te leggen dat Microsoft (geldt met name voor de wizards) bepaald niet geneigd is de beste oplossingen te gebruiken in hun voorstellen. Dus de suggestie wekken dat ik mezelf tegenspreek, vind ik erg flauwtjes.
Bovendien: de cursus is alweer een paar jaar oud. Ik was toen uiteraard al buitengewoon goed en bekwaam, maar ondertussen staat er op mijn kennis geen maat meer :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan