Keuzelijst met invoervak op basis van andere keuzelijst

Status
Niet open voor verdere reacties.

dirkdrent

Gebruiker
Lid geworden
3 jan 2006
Berichten
382
Ik had al even gekeken op het forum maar kom er toch niet uit want dit voorbeeld helpt mij niet http://www.helpmij.nl/forum/showthread.php/610352-Sub-categorie?highlight=afhankelijke+keuzelijst

Ik zou in een keuzelijst met invoervak graag gegevens willen filteren.
In de bijlage heb ik een voorbeelddatabase geplaatst met hierin een tabel genaamd gegevens met 5 velden en een formulier (gegevens).

Idgegevens
Categorie
Bedrijf
Plaats
Land

Nu wil ik graag in een formulier 3 keuzelijksten met invoervak hebben die afhankelijk van elkaar gegevens zichtbaar maken of wel filteren. Concreet wil ik dus een keuzelijst met invoervak voor [categorie], een keuzelijst met invoervak voor [plaats] en een keuzelijst met invoervak voor [land].

Voorbeeld:
Ik wil graag alleen de winkels (categorie) in de plaats Groningen (plaats) en binnen Nederland (land) dit zou ik in werkelijkheid niet doen maar het gaat even om te weten hoe ik te werk moet gaan.

Wie weet hoe ik bovenstaande voor elkaar kan krijgen?Bekijk bijlage Opzoeken.zip
 
Laatst bewerkt:
Ik kan overdag geen 2007 db's openen, dus ik kan je voorbeeld vanavond pas bekijken. Kun je er nog een 2003 versie van maken, dan heb ik overdag ook wel tijd. Dus je zult het nu even met theorie moeten doen... En die is, als ik je tabelindeling zo bekijk, toch wel identiek aan het voorbeeld met de afhankelijke keuzelijst :)
Het verschil (vemoed ik) met het voorbeeldje, is dat de keuzelijsten daar niet zijn gekoppeld aan een tabel, wat bij jou denk ik wel het geval is. Niet getreurd: hetzelfde voorbeeld heb ik in dit draadje aangepast zodat de gegevens nu wel zijn op te slaan. Misschien komt dat meer in de buurt?
 
Bekijk bijlage Opzoeken 2003 versie.zipBedankt voor reactie... Ik heb het voorbeeldje ook even voor access 2003 opgeslagen zodat u daar eventueel ook in kunt gaan werken. Zelf gebruik ik 2007 maar volgens mij maakt het voor deze vraag niet uit welke versie je gebruikt.

Ik heb voorbeeld ook nog even iets verder uitgewerkt want mogelijk ben ik niet geheel duidelijk geweest... In het draadje van bovenstaande gebeurt helaas niet datgene wat ik graag zou willen in mijn formulier. Het is niet de bedoeling dat er een extra tabel/Query of gegevens worden aangemaakt, wat ik graag zou willen dat ik de gegevens van de velden kan filteren op categorie, plaats en land net zoals excel dit doet bij automatisch filter. Het gaat in dit geval om de gegevens in 1 tabel te filteren gezien categorie, plaats en land in dezelfde tabel staan.
Ik hoop u begrijpt wat ik bedoel....
 
Jouw vraag is op zich al regelmatig voorbij gekomen, met bijpassende voorbeelden. Maar omdat die van jou best simpel is, heb ik er een nieuw voorbeeld van gemaakt.
 

Bijlagen

Bedankt voor deze oplossing inclusief voorbeeld, ondanks dat de vraag misschien al meerdere keren is langs gekomen heb toch het voorbeeld bestudeerd en liep tegen het volgende aan....

Ik heb in mijn eigen voorbeeld geprobeerd het zelfde te bereiken...
Het volgende is mij opgevallen dat er gebruik gemaakt wordt van "Gebeurtenisprocedure"

[cboland] 2 gebeurtenisprocedure (nabijwerken en na kiezen)
[cboplaats] 2 gebeurtenisprocedure (nabijwerken en na kiezen)
[cbocategorie] 1 gebeurtenisprocedure (nabijwerken)

De gebeurtenisprocedure nabijwerken is als volgt:

Code:
 Private Sub cboLand_AfterUpdate()
    Dim tmp
    strSQL = "SELECT DISTINCT Plaats FROM Gegevens WHERE Land = '" & Me.cboLand & "' ORDER BY Plaats"
    Me.cboPlaats.RowSource = strSQL
    Me.cboPlaats.Requery
    Call Filteren

End Sub

Vraag 1:
Is deze code geschreven of kun je deze krijgen door bijvoorbeeld een wizard ergens te volgen?

Vraag 2:
Waarom heeft [cbocategorie] 1 gebeurtenisprocedure (nabijwerken) en dus niet de nakiezen gebeurtenisprocedure?

Vraag 3:
Ik heb de aanpassingen gedaan in mijn oude voorbeeld wanneer ik in mijn formulier een selectie maak op bijvoorbeeld land dan krijg ik een popup venster te zien met de volgende mededeling... compileerfout: sub of function is niet gedefineerd! Hier wordt verwezen naar Call filteren (kan het zijn dat ik deze actie nog ergens moet toevoegen in VB?)

Ik heb mijn bewerkte voorbeeld hieronder geplaatst.... misschien ga ik er iets te diep op in maar ben benieuwd waar ik de dingen niet goed doe en wil graag dingen zelf in de toekomst uitvoeren :D

Bekijk bijlage Opzoeken v 2 voor 2003.zip
 
Laatst bewerkt door een moderator:
Vraag 1: dit soort code krijg je niet met macro's, of met wizards. Zelf pennen (of kopieëren ;) ) dus!
Vraag 2: De drie keuzelijsten zijn van elkaar afhankelijk in 'aflopende' zin: je kiest eerst een land, dan een plaats en dan een categorie. Als je als land Duitsland kiest, wil je plaatsen kunnen kiezen in Duitsland (logisch...). Als je vervolgens een plaats kiest, wil je categorieën kiezen die in die plaats beschikbaar zijn. Verander je echter het land, dan is de gekozen plaats (uit Duitsland tenslotte) niet meer logisch, want niet liggend in het nieuw gekozen land. Daarom is het logisch dat de keuzelijst cboPlaats leeg wordt gemaakt als je een ander land gaat kiezen. Hetzelfde geldt voor de categorieën. Vandaar dat bij de gebeurtenis <Bij Kiezen> van de keuzelijst cboLand de twee andere keuzelijsten leeg worden gemaakt. Bij het kiezen van de keuzelijst cboPlaats geldt iets vergelijkbaars: kies je een andere plaats, dan heb je vermoedelijk andere categorieën. Dus daarom wordt bij die keuzelijst de gebeurtenis <Bij Kiezen> gebruikt om cboCategorie leeg te maken.
Bij de keuzelijst cboCategorie speelt dat probleem niet, omdat er geen keuzelijsten van afhankelijk zijn: ongeacht welke keuze je maakt, het is altijd een keuze die aangereikt wordt door de bovenliggende keuzelijst cboPlaats.
Normaal gesproken maak ik op dit soort formulieren nog een knop die alle keuzelijsten leeg maakt, en alle records weer laat zien. Volgens mij kun je met de beschikbare code die knop zelf wel maken; alle code die je nodig hebt staat in het formulier :)

Wat alledrie de keuzelijsten doen, is het formulier filteren: kies je een land, dan zie je alleen de records uit dat land. Hetzelfde voor de twee andere keuzelijsten. Dat filter stel je in op het moment dat je een waarde kiest, dus vandaar de gebeurtenis <Na bijwerken>.

Vraag 3:
De keuzelijsten maken gebruik van een losse functie <Filteren>. Daarmee wordt uiteindelijk het filter gemaakt en toegepast, dus die functie heb je inderdaad nodig.
 
Super bedankt voor je uitgebreide uitleg... ik begrijp het nu iets beter (gaat langzaam maar dan heb je ook wat). Alleen zit ik nog met de foutmelding m.b.t. de filter want in het antwoord op vraag 3 geeft u aan dat je gebruik moet maken van een losse functie <Filteren> maar hoe stel ik deze in zodat de foutmelding opgeheven wordt.
 
In mijn voorbeeld zit die functie op het formulier; daar kun je dus een kopie van maken, en dan plak je hem in je eigen formulier onderaan de laatste procedure.
 
Nog een manier?

Alles werkt perfect en bedankt voor deze fantastische en zeer snelle ondersteuning... toch vond ik een voorbeeld op het forum die iets anders werkt maar waarbij u ook advies heeft gegeven het gaat om onderstaande vraag...

http://www.helpmij.nl/forum/showthread.php/647117-Zoekformulier-maken-in-acces-2007

Ik heb u geplaatste voorbeeld (Filteren_v1) bestudeerd en wat mij opviel was dat de oplossing in dit voorbeeld ook overeenkomt met datgene wat ik wil. Wat mij opvalt is het volgende t.o.v. bovenstaande voorbeeld:

a) Bij gebeurtenisprocedure (afther update) wordt gebruik gemaakt van =fFilterH()
b) Bij gebeurtenisprocedure (On enter) hebben we een eventprocedure zoals bijvoorbeeld onderstaand

Code:
[COLOR="#696969"]Private Sub c4_Enter()
    Call fComboRS("c4")
End Sub[/COLOR]

C) Er 2 extra functies op het formulier staan de fComboRS (n as string)

Code:
[COLOR="#696969"]Function fComboRS(n As String)
    If Len(sFilterH) > 0 Then
        Me(n).RowSource = "SELECT DISTINCT " & Me(n).Tag & " FROM " & sTabel & " WHERE " & sFilterH
    Else
        Me(n).RowSource = "SELECT DISTINCT " & Me(n).Tag & " FROM " & sTabel
    End If
End Function[/COLOR]

en de functie fFilterH(Optional n)

Code:
[COLOR="#696969"]Function fFilterH(Optional n)
Dim i   As Integer

    If IsMissing(n) Then n = ""
        sFilterH = ""
    For i = 1 To iAantalF
        If Me("f" & i).Name <> n And Len(Me("f" & i)) > 0 Then
            sFilterH = sFilterH & Me("f" & i).Tag & " LIKE " & sBegin & Me("f" & i) & "*" & Chr(34) & " " & sAndOr
        End If
    Next i
    For i = 1 To iAantalC
        If Len(Me("c" & i)) > 0 Then
            sFilterH = sFilterH & Me("c" & i).Tag & " LIKE " & sBegin & Me("c" & i) & "*" & Chr(34) & " " & sAndOr
        End If
    Next i
    If Len(sFilterHStukje) > 0 Then
        sFilterH = sFilterH & sFilterHStukje
    ElseIf Len(sFilterH) > 0 Then
        sFilterH = Left$(sFilterH, Len(sFilterH) - (Len(sAndOr) + 1))
    End If
    If Len(sFilterH) > 0 Then
        Me.Filter = sFilterH
        Me.FilterOn = True
''        Me.RecordSource = "SELECT * FROM " & sTabel & " WHERE " & sFilterH
    Else
''        Me.RecordSource = "SELECT * FROM " & sTabel
        Me.Filter = ""
        Me.FilterOn = False
    End If
    Me.Requery
    sFilterHStukje = ""

End Function[/COLOR]

D) Er wordt gebruik gemaakt van TAG

Uit nieuwsgierigheid heb ik de stappen doorlopen en heb een klein voorbeeldje gemaakt met dezelfde opbouw zoals bij mijn vorige voorbeelden in deze vraag. Ik bovenstaande A, B, C en D uitgevoerd echter en heb ik geprobeerd te filteren op 1 veld namelijk land (deze heb ik voor het gemak ook even c4 genoemd) echter krijg ik de melding Syntax error in FROM clause.

Ik ben benieuwd wat ik hier niet goed gedaan hebben...

Bekijk bijlage Opzoeken NEW.zip
 
Laatst bewerkt door een moderator:
Ik heb er nog eens nagekeken maar ben na mijn weten niets vergeten. Hopelijk kan iemand mij helpen....
 
Thanx... sorry dat wist ik niet zag wel bij andere berichten dat de code anders neergezet was maar wist niet hoe ik dit kon bewerkstelligen maar vanaf nu zal ik het op deze manier toepassen.
 
Er zijn verschillende manieren om functies te maken en gebruiken, zoals je inmiddels ook al hebt gezien :) Het voorbeeld in het andere draadje is wat universeler gemaakt dan in jouw db, en dat is een heel andere aanpak.
Als je een functie universeel maakt, moet je de code zodanig maken dat hij op verschillende plaatsen is te gebruiken. Dat houdt automatisch in, dat je veel meer zaken uniform moet inrichten en checken. De code wordt dus groter en ingewikkelder. I jouw geval is de code specifiek toegeschreven voor één formulier. Dan kun je het filter dus heel compact maken. Als je wil filteren op een aantal formulieren, dan is een universele functie aan te bevelen. Die is namelijk vrij snel te implementeren. Mits je je aan de conventies van dat filter houdt uiteraard...
Ik zal uiteraard dit weekend eens kijken wat er nog schort aan jouw db.
 
Ik ben wel zeer benieuwd naar de universele aanpak, super dat je mijn voorbeeld even wilt bestuderen op deze manier kom ik er achter wat ik fout heb gedaan.

ps. ik ben gestart met de cursus en heb net hoofdstuk 1 afgerond zijn dingen als bovenstaande ook terug te vinden in de cursus of is het handig om eventueel naast deze cursus een beginnenrscursus vba te doen?
 
Deze onderwerpen komen ook in de cursus aan bod, en anders voeg ik het alsnog toe. Ik schrijf de cursus tenslotte niet voor mezelf, maar voor de mensen die 'm willen lezen :) En dat geldt overigens ook voor onderwerpen die je graag behandeld zou zien.
 
Hallo Michel, is het nog gelukt afgelopen weekend m.b.t. mijn database heb zelf ook nog gekeken maar ik haal de fout er zo 1,2,3 niet uit.... Hoop dat u er wel uit komt.
 
Oh ja, alleen ben ik vergeten om 'm terug te posten :o
Ik heb er zelfs een andere versie bijgezet, die ik tegenwoordig liever gebruik, omdat de filterfunctie wat mij betreft nog wat beter werkt.
Kijk maar eens of je er chocola van kan maken :)
 

Bijlagen

Ik probeer er chocola van te maken maar het lukt nog niet echt in mijn daadwerkelijke database.... Ik heb de velden waar ik op wil zoeken in het formulier geplaatst en daar waar nodig aangepast, alleen wanneer ik bij rolldown ga kijken geeft hij geen waarden weer maar wel een leeg vak met een scrollbar maar de waarden zijn niet zichtbaar. De rowsource bij de keuzelijst is als volgt

SELECT DISTINCT T_Beursgegevens.Beurssjabloon, [T_Basis Adressen Stap 1].Land FROM [T_Basis Adressen Stap 1] LEFT JOIN T_Beursgegevens ON [T_Basis Adressen Stap 1].Id=T_Beursgegevens.BeursId ORDER BY [T_Basis Adressen Stap 1].Land;

Alleen als ik bij het desbetreffend veld de code bekijk die achter after update staat zie dan zie je dit

Private Sub cboLand_AfterUpdate()
Dim tmp
strSQL = "SELECT DISTINCT Plaats FROM [T_Basis Adressen Stap 1] WHERE Land = '" & Me.cboLand & "' ORDER BY Plaats"
Me.cboPlaats.RowSource = strSQL
Me.cboPlaats.Requery
Call Filteren
End Sub

Ik vermoed dat ik bij de rood gekleurde letters hier iets niet goed doe gezien het formulier gebasseerd is op onderstaande code

SELECT T_Beursgegevens.Beurssjabloon, [T_Basis Adressen Stap 1].* FROM [T_Basis Adressen Stap 1] LEFT JOIN T_Beursgegevens ON [T_Basis Adressen Stap 1].Id=T_Beursgegevens.BeursId;

Ik heb het gevoel dat ik er dicht bij ben maar krijg het nog niet geheel voor elkaar... PLEASE HELP! Ik ben zeer benieuwd wat ik fout doe....
 
Laatst bewerkt:
Ik snap niet helemaal wat je met de eerste code probeert; de eerste keuzelijst zou vermoed ik landen moeten laten zien; waarom heb je dan het veld Beurssjabloon daar bij staan? En waarom een Outer join met [T_Basis Adressen Stap 1]? Om een land te selecteren heb je (als je geen aparte tabel Landen hebt) alleen de tabel [T_Basis Adressen Stap 1] nodig. In jouw code selecteer je een waarde uit Sjabloon, en die wil je als filter gebruiken voor Plaats. Dat kan natuurlijk niet; je wilt filteren op Land, en niet op Beurssjabloon.
Dat je in de eerste keuzelijst niks ziet, komt waarschijnlijk doordat je (veel te veel overigens omdat je het * teken gebruikt) te weinig velden ziet in de keuzelijst.
 
Het probleem is dat ik momenteel nog een oude database gebruik die ik in het begin een keer gemaakt heb. Ik ben nu bezig om deze t.z.t. op te splitsen naar meerdere tabellen omdat ik nu 90% van de gegevens in 1 tabel heb staan. Echter beurs sjabloon heb ik wel in een aparte tabel staan. Deze heb ik dus op het formulier gekoppeld met de tabel T_Basis Adressen Stap 1. Ik begrijp dat dit inderdaad verder van ideaal is maar voor nu als snelle oplossing moet ik nog even blijven werken met de oude.

Betekent het uitgaande van jouw feedback dat ik bij row source dus gewoon T_Basis Adressen Stap 1 kan selecteren en hierin het veld [Land] aangeven dus betekent dit dat ik geen rekening hoef te houden met de basis waarop het formulier de gegevens op haalt
SELECT T_Beursgegevens.Beurssjabloon, [T_Basis Adressen Stap 1].* FROM [T_Basis Adressen Stap 1] LEFT JOIN T_Beursgegevens ON [T_Basis Adressen Stap 1].Id=T_Beursgegevens.BeursId;

Ik heb dit gedaan en voor [Land] en [Plaats] werkt dit perfect echter de laatste [productomschrijving] werkt dit niet hij geeft hier een error met de melding syntax error in FROM clause. Ik heb hier bij row source (venster geopend SQL statement : Query builder) 2 velden geplaatst namelijk de Id van T_Basis Adressen Stap 1 en [Productomschrijving] van T_Basis Adressen Stap 1

Bij de laatste doe ik dus iets niet goed?


Ik snap niet goed wat u bedoeld met:
Dat je in de eerste keuzelijst niks ziet, komt waarschijnlijk doordat je (veel te veel overigens omdat je het * teken gebruikt) te weinig velden ziet in de keuzelijst.

Ik hoef toch in de eerste keuzelijst alleen maar het veld [Land] te zien en niet andere velden toch?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan