Afhankelijke keuzelijst op doorlopen formulier Access

Status
Niet open voor verdere reacties.

Matjes

Gebruiker
Lid geworden
21 jun 2016
Berichten
76
Goedemiddag,

In Access heb ik een doorlopend formulier gemaakt met drie keuzelijsten:

Keuzelijst 1 = onafhankelijk
Keuzelijst 2 = afhankelijk van Keuzelijst 1
Keuzelijst 3 = afhankelijk van Keuzelijst 2

Hiervoor heb ik onderstaande VBA code toegepast welke goed werkt bij een nieuw record.

Echter als je het formulier opent waarbij al records in de tabel staan dan zou ik ook graag willen zien wat er in de afhankelijke keuzelijsten is gekozen. Dat werkt nu nog niet. Bij het openen van het formulier zijn de afhankelijke keuzelijsten van de bestaande records nu leeg.

Waarschijnlijk moet ik met twee recordbronnen o.i.d. gaan werken. Een voor nieuwe of te wijzigen records en één voor bestaande records. Maar ik krijg dit nog niet voor elkaar.

Iemand die mij verder op weg kan helpen met dit probleem?

Code:
'Keuzelijst 1 = Object_Id

Private Sub cboObject_Id_AfterUpdate() 'Keuzelijst 2 Fabrikant

Me.cboFabrikant_Id.RowSource = "SELECT tFabrikant.Fabrikant_Id, tFabrikant.Fabrikant, tObjecttype_Fabrikant.Objecttype_Id " & _
        "FROM tFabrikant INNER JOIN (tFabrikant_type INNER JOIN tObjecttype_Fabrikant ON tFabrikant_type.Fabrikant_type_Id = tObjecttype_Fabrikant.Fabrikant_type_Id) ON tFabrikant.Fabrikant_Id = tFabrikant_type.Fabrikant_Id " & _
        "WHERE tObjecttype_Fabrikant.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " " & _
        "ORDER BY tFabrikant.Fabrikant;"

End Sub


Private Sub cboFabrikant_Id_AfterUpdate() 'Keuzelijst 3 Fabrikant type

    Me.cboFabrikant_type_Id.RowSource = "SELECT tFabrikant_type.Fabrikant_type_Id, tFabrikant_type.Type, tObjecttype_Fabrikant.Objecttype_Id, tFabrikant.Fabrikant_Id " & _
        "FROM tFabrikant INNER JOIN (tFabrikant_type INNER JOIN tObjecttype_Fabrikant ON tFabrikant_type.Fabrikant_type_Id = tObjecttype_Fabrikant.Fabrikant_type_Id) ON tFabrikant.Fabrikant_Id = tFabrikant_type.Fabrikant_Id " & _
        "WHERE tObjecttype_Fabrikant.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " And tFabrikant.Fabrikant_Id = " & Me.cboFabrikant_Id.Column(0) & " " & _
        "ORDER BY tFabrikant_type.Type;"
    
End Sub
 
Laatst bewerkt:
Waarschijnlijk moet ik met twee recordbronnen o.i.d. gaan werken. Een voor nieuwe of te wijzigen records en één voor bestaande records.
Dat zie je goed! Afhankelijke keuzelijsten in een doorlopend formulier zijn sowieso al vervelend, omdat je maar één keuzelijst hebt natuurlijk die je dan tig keer herhaald ziet. Dus bij een nieuw record en een gemaakte keuze, zie je dat alle bovenliggende records vermoedelijk ook niks meer laten zien, als de keuze daarin tenminste afwijkt van wat je in het nieuwe record selecteert. Daar is niks aan te doen, of je moet een enkelvoudig formulier gebruiken. Daar gebeurt uiteraard precies hetzelfde, alleen zie je het dan niet :). Een struisvogel zou dus voor die optie kiezen denk ik :D.

Goed, terug naar jouw probleem. Dat wordt dus veroorzaakt doordat je een filter op de keuzelijst hebt staan. En dat moet er dus af. Dat betekent, zoals je al constateerde, dat je per keuzelijst 2 queries moet hebben: één voor als je in een nieuw record zit, en één voor als je door de records bladert. Althans: zo doe ik het. In de gebeurtenis <Bij aanwijzen> kun je simpel checken of je in een nieuw record zit of niet. Bijvoorbeeld zo:
Code:
Private Sub Form_Current()
Dim strSQL As String, strwHere As String, strOrder As String
    strSQL = "SELECT tFabrikant.Fabrikant_Id, tFabrikant.Fabrikant, tObjecttype_Fabrikant.Objecttype_Id " _
        & "FROM tFabrikant INNER JOIN (tFabrikant_type INNER JOIN tObjecttype_Fabrikant " _
        & "ON tFabrikant_type.Fabrikant_type_Id = tObjecttype_Fabrikant.Fabrikant_type_Id) " _
        & "ON tFabrikant.Fabrikant_Id = tFabrikant_type.Fabrikant_Id "
    strwHere = "WHERE tObjecttype_Fabrikant.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " "
    strOrder = "ORDER BY tFabrikant.Fabrikant;"
    If Me.NewRecord Then
        Me.cboFabrikant.RowSource = strSQL & strwHere & strOrder
    Else
        Me.cboFabrikant.RowSource = strSQL & strOrder
    End If
    Me.cboFabrikant.Requery
End Sub
 
Hi OctaFish,

Dank voor het snelle antwoord. Vandaag weer verder gegaan met de DB en jouw onderstaande code toegepast (enigszins gewijzigd v.w.b. de query). Het lijkt te gaan werken echter krijg ik bij deze code indien het record nieuw is de volgende foutmelding:

"Syntaxfout (operator ontbreekt in query-expressie tObject.Objecttype_Id =."

Code:
Private Sub Form_Current()
Dim strSQL As String, strwHere As String, strOrder As String
    strSQL = "SELECT tFabrikant.Fabrikant_Id, tFabrikant.Fabrikant, tObjecttype.Objecttype_Id " _
         & "FROM tObjecttype INNER JOIN ((tFabrikant INNER JOIN tFabrikant_type " _
         & "ON tFabrikant.Fabrikant_Id = tFabrikant_type.Fabrikant_Id) INNER JOIN tObjecttype_Fabrikant_type " _
         & "ON tFabrikant_type.Fabrikant_type_Id = tObjecttype_Fabrikant_type.Fabrikant_type_Id) " _
         & "ON tObjecttype.Objecttype_Id = tObjecttype_Fabrikant_type.Objecttype_Id "
    strwHere = "WHERE tObjecttype.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " "
    strOrder = "ORDER BY tFabrikant.Fabrikant;"
    If Me.NewRecord Then
        Me.cboFabrikant_Id.RowSource = strSQL & strwHere & strOrder
            Else
        Me.cboFabrikant_Id.RowSource = strSQL & strOrder
    End If
    Me.cboFabrikant_Id.Requery
End Sub

Als ik deze regel van de code wijzig
Code:
strwHere = "WHERE tObjecttype.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " "
naar de volgende code
Code:
 strwHere = "WHERE tObjecttype.Objecttype_Id = '" & Me.cboObjecttype_Id.Column(0) & "' "
(twee ' ' toegevoegd) dan krijg ik bij een nieuw record de volgende foutmelding:

"Gegevenstypen komen niet overeen in criteriumexpressie".

Ik ben al een tijdje aan het zoeken naar een oplossing maar ik kom er niet uit :confused:

Een oplossing is dan ook zeer welkom. Eveneens zou ik ook nog graag willen dat het filter ook werkt als een record wordt bewerkt indien deze niet nieuw is. Kan ik dat met me.dirty voor elkaar maken?
 
Deze regel
Code:
    strwHere = "WHERE tObjecttype.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " "
werkt alleen als er een gekozen waarde is in Me.cboObjecttype_Id. Bij een nieuw record is dat waarschijnlijk niet het geval. Je kunt deze constructie dus eigenlijk alleen goed gebruiken bij de eerste keuzelijst op een subformulier, en dan nog alleen als die een waarde krijgt uit een hoofdformulier. Wat je wél kunt doen, is de SQL genereren op basis de keuzelijst cboObjecttype_Id. En dat doe ik dus tegenwoordig ook regelmatig: ik laat afhankelijke keuzelijsten in eerste instantie helemaal leeg, en geef ze pas een inhoud bij het bladeren (om alles te kunnen laten zien) of selecteren (als er iets is gekozen in een andere keuzelijst). Probeer dus eens een variant waarbij je de <Bij klikken> gebeurtenis van Me.cboObjecttype_Id gebruikt om de keuzelijst cboFabrikant_Id te vullen.

Quootjes eromheen zetten werkt overigens niet; dat doe je alleen als de waarde een tekst is. Daarom krijg je deze foutmelding, want je behandelt nu een getal als tekst. En dat is wat anders.
 
Ik heb nu een gebeurtenis <bij klikken> op cboObjecttype_Id geplaatst:

Code:
Private Sub cboObjecttype_Id_Click()
Dim strSQL As String, strwHere As String, strOrder As String
    strSQL = "SELECT tFabrikant.Fabrikant_Id, tFabrikant.Fabrikant, tObjecttype_Fabrikant_type.Objecttype_Id " _
         & "FROM (tFabrikant INNER JOIN tFabrikant_type " _
         & "ON tFabrikant.Fabrikant_Id = tFabrikant_type.Fabrikant_Id) INNER JOIN tObjecttype_Fabrikant_type " _
         & "ON tFabrikant_type.Fabrikant_type_Id = tObjecttype_Fabrikant_type.Fabrikant_type_Id "
    strwHere = "tObjecttype_Fabrikant_type.Objecttype_Id = " & Me.cboObjecttype_Id.Column(0) & " "
    strOrder = "ORDER BY tFabrikant.Fabrikant;"
    If Me.NewRecord Then
        Me.cboFabrikant_Id.RowSource = strSQL & strwHere & strOrder
            Else
        Me.cboFabrikant_Id.RowSource = strSQL & strOrder
    End If
    Me.cboFabrikant_Id.Requery
End Sub

Ik blijf een zelfde soort foutmelding houden:

27-9-2016 15-44-21.jpg

Klaarblijkelijk gaat er nog iets niet goed :confused: maar ik het zie het even niet meer...

Wat ik mij ook nog afvraag is als wanneer de filter goed werkt bij een nieuw record, of degene die gewijzigd wordt, dat van de overige records in de gegevensblad de ingevuld waarde wel zichtbaar zijn en blijven?
 
Laatst bewerkt:
Ik zie een herhaling in de WHERE staan die niet deugt. Dat zou dit moeten zijn: tObjecttype_Fabrikant_type.Objecttype_Id = 2
Kun je dit resultaat eens posten?

Code:
Dim t
t=InputBox("","",strSQL & strwHere & strOrder)
 
Hallo Ocatafish,

Dank voor de ondersteuning. Het probleem heb ik gevonden, ik was de WHERE vergeten in strwHere ;)

Resultaat van de inputbox is nu bijvoorbeeld:

Code:
SELECT tFabrikant.Fabrikant_Id, tFabrikant.Fabrikant, tObjecttype_Fabrikant_type.Objecttype_Id FROM (tFabrikant INNER JOIN tFabrikant_type ON tFabrikant.Fabrikant_Id = tFabrikant_type.Fabrikant_Id) INNER JOIN tObjecttype_Fabrikant_type ON tFabrikant_type.Fabrikant_type_Id = tObjecttype_Fabrikant_type.Fabrikant_type_Id WHERE tObjecttype_Fabrikant_type.Objecttype_Id = 21 ORDER BY tFabrikant.Fabrikant;
 
Op deze manier krijg ik het werkend.

Het is alleen zo bij een nieuw record dat van de overige records in het gegevensblad de ingevulde gegevens onzichtbaar worden. Is hier nog wat aan doen? Of toch maar voor een enkelvoudig formulier kiezen :rolleyes:
 
Dat is logisch, en in een enkelvoudig formulier heb je exact hetzelfde probleem, alleen zie je het dan niet. Mooie struisvogeloplossing dus :D. Het is ook logisch, want je hebt maar één exemplaar van een veld/object op je formulier staan. Op een enkelvoudig formulier zie je dat object ook maar één keer, maar op een doorlopend formulier wordt het object herhalend weergegeven. Heb je 15 records in een doorlopend formulier, dan zie je dus ook 15 keer hetzelfde in de keuzelijsten. Niets aan te doen dus. Ik gebruik ook zelden doorlopende formulieren voor invoer, want je hebt er niks an. Een enkelvoudig (eventueel als popup) is veel logischer en handiger.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan