Keuzelijsten koppelen

Status
Niet open voor verdere reacties.

gangstalaz

Gebruiker
Lid geworden
13 sep 2010
Berichten
131
Hallo,

Ik werk met access 2003 en heb het volgende probleem.


Mijn formulier bestaat uit een hoofdformulier en een subformulier. Gekoppelt aan tblBestellingen en tblBestelregel.
Graag zou ik willen weten hoe ik op leverancier zou kunnen selecteren.
Dus nadat ik bijvoorbeeld leverancier "akkermans" heb geselecteerd uit de keuzelijst, moet ik in de keuzelijst artikelomschrijving alleen de producten van akkermans te zien krijgen.

Op internet heb ik het volgende gevonden alleen krijg ik het niet voormekaar.

Me.Products.RowSource = "SELECT ProductName FROM" & _
" Products WHERE CategoryID = " & Me.Categories & _
" ORDER BY ProductName"
Me.Products = Me.Products.ItemData(0)

Products= tabel artikelen?
Categories= tabel leveranciers?
CategoryID= Leveranciers_ID ?
Productname= ??????

Deze code moet bij Gebeurtenis --> Na bijwerken komen te staan.

Kan iemand mij helpen?

Of misschien dat iemand een ander methode weet?
 
Laatst bewerkt:
Wanneer ik het volgende doe, krijg ik een foutmelding:

Private Sub Leveranciers_AfterUpdate()

Me.tblArtikelen.RowSource = "SELECT Artikelomschrijving FROM" & _
" tblArtikelen WHERE Leveranciers_ID = " & Me.tblLeveranciers & _
" ORDER BY Artikelomschrijving"
Me.tblArtikelen = Me.tblArtikelen.ItemData(0)

End Sub




Dit heb ik ook geprobeerd:


strSQL = "SELECT Leveranciers_ID, Artikelomschrijving FROM tblArtikelen " _
& "WHERE Leveranciers_ID=" & Me.Leveranciers
Me.cboartikel.RowSource = strSQL
Me.cboartikel.Requery

Alleen krijg ik helemaal geen artikel te zien in de keuzelijst Artikelomschrijving.
 
Laatst bewerkt:
Je gebruikt waarschijnlijk een andere naam voor je keuzelijst Artikelen:

Code:
Private Sub [B][COLOR=blue]Leveranciers[/COLOR][/B]_AfterUpdate()
     Me.[B][COLOR=red]Artikelen[/COLOR][/B].RowSource = "SELECT Artikelomschrijving FROM" & _
     " tblArtikelen WHERE Leveranciers_ID = " & Me.[B][COLOR=blue]Leveranciers[/COLOR][/B] & _
     " ORDER BY Artikelomschrijving"
     Me.[B][COLOR=red]Artikelen[/COLOR][/B]= Me.[B][COLOR=red]Artikelen[/COLOR][/B].ItemData(0)
End Sub

Ik zou overigens de keuzelijsten cboArtikelenen cboLeverancier noemen; probeer onderscheid te maken tussen tekstvelden (txtArtikel), keuzevelden (cboArtikel of lstArtikel) en tabelvelden. Als een tabelveld dezelfde naam heeft als een tekstvak op je formulier, kun je in de problemen komen met je VBA code, omdat je dan niet goed kunt aangeven welk object je wilt bijwerken/gebruiken.
 
Ik krijg de volgende te zien: formulier5.JPG


Nadat ik op annuleren heb geklikt en een keuze wil maken uit de keuzelijst met invoervak (artikelomschrijving), krijg ik een leeg lijst.

Waar kan dit aan liggen?

Het gaat dan om de volgende code:


Private Sub cboleverancier_AfterUpdate()

Me.LEVERANCIER = Me.cboLeverancier.Column(0)


Me.cboartikelen.RowSource = "SELECT Artikelomschrijving FROM" & _
" tblArtikelen WHERE Leveranciers_ID = " & Me.cboLeverancier & _
" ORDER BY Artikelomschrijving"
Me.cboartikelen = Me.cboartikelen.ItemData(0)

End Sub

Ik heb ook met een ander foutmelding te maken.
Nadat ik op annuleren heb geklikt en naar ontwerpmodus wil gaan krijg ik de volgende foutmelding:
Kan geen record toevoegen of wijzigen omdat een gerelateerd record is vereist in de tabel tblArtikel_Leverancier
 
Laatst bewerkt:
Het probleem zou kunnen liggen in de keuzelijsten die je gebruikt. Zo te zien heb je een subformulier gemaakt dat je weergeeft als Gegevensblad. In die tabelheb je een keuzelijst Leveranciers ingebouwd; ik zou je aanraden om die er gelijk weer uit te slopen. Gebruik in een tabel alleen het type Tekstveld, want je ziet anders nooit wat je opslaat. En in queries zie je dan ook iets anders dan in de tabellen, omdat je daar wèl de echte waarden ziet. Althans: als je berekeningen gaat doen met velden.
Mijn stelregel is simpel: in een tabel sla je gegevens op, en die wil ik dus zien. Op een formulier maak ik dan wel de keuzelijsten, zodat je op een eenvoudige manier een leverancier(snaam) kunt selecteren. Maar dus nooit in een tabel.... Sowieso heeft een gebruiker niks te zoeken in een tabel, dus vanuit dat oogpunt is het ook al verspilde moeite! En eigenlijk geldt dat dus ook voor subformulieren die je opmaakt als Gegevensblad; je ziet niet wat er in het veld staat.
Ik zou voor het subformulier de eigenschap Doorlopend formulier gebruiken. Niet alleen kun je dan meer opmaakkenmerken gebruiken, zodat het formulier er netter uitziet, je kunt ook betere keuzelijsten maken.
In de code zit nog een kleine fout; waarschijnlijk is het probleem daar al mee verholpen.

Code:
Private Sub cboleverancier_AfterUpdate()
     Me.[B][COLOR=red]cbo[/COLOR][/B]LEVERANCIER = Me.cboLeverancier.Column(0)
     Me.cboartikelen.RowSource = "SELECT Artikelomschrijving FROM" & _
     " tblArtikelen WHERE Leveranciers_ID = " & Me.cboLeverancier & _
     " ORDER BY Artikelomschrijving"
End Sub

De tweede melding die je krijgt is redelijk onschuldig; zodra je bezig bent met een record, zijn er velden die verplicht moeten worden ingevuld als je het record opslaat. Door halverwege naar het Ontwerpscherm te gaan, voldoe je niet aan die eis, en kun je niks opslaan. Je kunt de foutmelding gewoon sluiten.
 
Nu ben ik echt een beetje in de war.

Ik heb achter keuzeveld Artikelomschrijving nog een tekstveld LEVERANCIER staan. Daar komt een leverancier tevoorschijn.
Daarom heb ik bij de keuzelijst cboleverancier de volgende code:

Me.LEVERANCIER = Me.cboLeverancier.Column(0)

En ik had al een keuzelijst cboArtikel in de subformulier. Dit om een artikel te selecteren zodat alle velden ingevuld worden.


Wil je dat ik een keuzelijst leveranciers in de hoofdformulier zet?
 
ow ik snap denk wat je bedoelt.
de keuzelijst zit niet in het tabel maar in het subformulier.
Dus ik heb eigenlijk meerdere tabellen in mijn subformulier.
Het subformulier is gekoppelt met tblBestelregels. Om ook op leverancier te kunnen selecteren heb ik een keuzelijst cboLeveranciers erin gestopt. Dus dit is een ander tabel eigenlijk die in het subformulier zit.
 
In mijn subformulier heb ik verschillende tabellen zitten. Omdat er op leverancier en op artikel gezocht moet worden heb ik beide tabellen hierin verwerkt.
Op artikelen zoeken en selecteren lukt goed.

formulier7.JPG

Op leverancier zoeken lukt ook. MAAR bij het selecteren van een leverancier gaat het mis. Ik krijg dan een leeg artikelenlijst:

formulier8.JPG

Ik gebruik de volgende code voor de keuzelijst cboleveranciers:

Private Sub cboleveranciers_AfterUpdate()
Me.cboartikelen.RowSource = "SELECT Artikelomschrijving FROM" & _
" tblArtikelen WHERE Leveranciers_ID = " & Me.cboleveranciers & _
" ORDER BY Artikelomschrijving"
Me.cboartikelen = Me.cboartikelen.ItemData(0)
End Sub

Waar kan dit aan liggen?

Alvast bedankt!
 
Je hebt de keuzelijst Leveranciers in het subformulier liggen, en in het hoofdformulier. En dat zou ik dus niet doen. Je mag er (Neem ik aan) van uit gaan, dat je per bestelling één leverancier hebt. Deze hoef je dan dus ook maar één keer aan een bestelling te koppelen. Voor de artikelen maak je dan een selectie op basis van die leverancier.
Dit is een voorbeeldje zoals ik het zelf gebruik:

Code:
Private Sub cboArtikelID_Enter()
     [B][COLOR=blue]iBedrijf[/COLOR][/B] = [B][COLOR=red]Me.Parent.cboBedrijf.Column(0)[/COLOR][/B]
     strSQL = "SELECT ArtikelID, Artikel, Prijs FROM tArtikelen " & vbCrLf
     strSQL = strSQL & "WHERE ((tArtikelen.BedrijfID=" & [B][COLOR=blue]iBedrijf[/COLOR][/B] & ") " & vbCrLf
     strSQL = strSQL & "ORDER BY tArtikelen.ArtikelID;"
     Me.cboArtikelID.RowSource = strSQL
     Me.cboArtikelID.Requery
End Sub

Zoals je ziet wordt de Leveranciercode opgehaald uit het hoofdformulier, en in een variabele gezet. Vervolgens wordt met die variabele doorgefilterd in de artikelenlijst. Ik zou overigens de keuzelijst Artikelen niet al standaard vullen met de eerste waarde, dus ik zou de code Me.cboartikelen = Me.cboartikelen.ItemData(0) zelf nooit gebruiken.
 
Laatst bewerkt:
OK ik zal het op die manier doen. Alleen weet ik niet hoe ik dat voor mijn formulier moet aanpassen. Dus welke namen moet ik waar zetten.

Kan jij dat voor mij doen als ik het naar je opstuur?

Of een uitleg geven als je wilt.
 
Octafish,

Omdat ik niet precies wist wat ik waar moest invullen, heb ik maar een ander voorbeeld code van jou gepakt die ik gevonden heb (wat duidelijker overkwam)
Het gaat om de volgende code:

Private Sub cboLeverancier_Click()
Dim strSQL As String

strSQL = "SELECT [tblArtikelen].[Leveranciers_ID], [tblArtikelen].[Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE Leveranciers_ID = " & CStr(Me![cboLeverancier]) & " "
strSQL = strSQL & "ORDER BY [cboArtikelen];"

Me.cboArtikelen.RowSource = strSQL
Me.cboArtikelen.Requery
End Sub

Maar volgens mij is hier het probleem dat ik het hoofdformulier niet met het subformulier koppel. Dus die link ligt er niet denk ik. Daarom krijg ik denk ook een foutmelding.

Moet ik dan een soortgelijke code als deze derbij stoppen?:

iBedrijf = Me.Parent.cboBedrijf.Column(0)


Alvast bedankt!
 
Laatst bewerkt:
Je hebt de extra variabele op zich niet nodig; ik gebruik 'm zelf omdat ik verder in mijn code nog meer doe met de keuzelijst, en dan is een variabele wat makkelijker in het gebruik. Bij jou zou dit al genoeg moeten zijn:

Code:
strSQL = strSQL & "WHERE Leveranciers_ID = " & CStr(Me.Parent!cboBedrijf.Column(0)) & " "
 
omdat ik niks met cbobedrijf te maken heb, hoor ik die te veranderen. Dus ik maak daar eerst dit van (cboLeverancier):

Formulier10.JPG
Maar dan krijg ik een foutmelding.

Daarna heb ik er cboartikelen van gemaakt. Maar dan krijg ik weer een zelfde foutmelding.
Formulier11.JPG

Dus daarna dacht ik dat ik cboartikelen (onderaan) moest aanpassen. Dus heb ik er dit van gemaakt:
Formulier12.JPG

Maar lukt weer niet.

Wat doe ik nou fout?
 
volgens mij moest ik er dit van maken:

Private Sub cboLeverancier_Click()
Dim strSQL As String



strSQL = "SELECT [tblArtikelen].[Leveranciers_ID], [tblArtikelen].[Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE Leveranciers_ID = " & CStr(Me.Parent!cboLeverancier.Column(0)) & " "
strSQL = strSQL & "ORDER BY [cboArtikelen];"

Me.cboArtikelen.RowSource = strSQL
Me.cboArtikelen.Requery
End Sub


Maar dan doet tie het weer niet.
 
Dat kan kloppen dat je code niet werkt; je probeert de sorteren op basis van de keuzelijst. En dat kan uiteraard niet. Probeer dit eens:

Code:
strSQL = "SELECT [Leveranciers_ID], [Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE [Leveranciers_ID] = " & CStr(Me.Parent!cboLeverancier.Column(0)) & " "
strSQL = strSQL & "ORDER BY [Artikelomschrijving];"
Me.cboArtikelen.RowSource = strSQL
Me.cboArtikelen.Requery

Probeer als je code kopieert te bedenken welke velden je moet vervangen; ik weet uiteraard niet hoe jij je keuzelijsten noemt. In bovenstaande code haal je de velden [Leveranciers_ID] en [Artikelomschrijving] op uit de tabel [tblArtikelen]. Ik ga er vanuit dat die veldnamen en tabelnaam kloppen. Op je hoofdformulier zou je keuzelijst met leveranciers <cboLeverancier> moeten heten, anders werkt de code niet. Wat <Me.Parent!cboLeverancier.Column(0)> doet, is eigenlijk vanuit het subformulier naar het hoofdformulier kijken (met Parent) en daar de eerste waarde uit de keuzelijst cboLeverancier halen. Als de keuzelijst anders heet, dan moet je die naam nog veranderen. Hetzelfde geldt voor de keuzelijst cboArtikelen op het subformulier.
 
ik wachtte maar op jou:$

BEDANKT voor je reactie!

omdat ik mijn keuzelijst in het hoofdformulier heb aangepast (dus nu heet het cboLeveranciers_ID) ziet de code als volgt eruit.

Private Sub cboLeveranciers_ID_Click()
Dim strSQL As String

strSQL = "SELECT [Leveranciers_ID], [Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE [Leveranciers_ID] = " & CStr(Me.Parent!cboLeveranciers_ID.Column(0)) & " "
strSQL = strSQL & "ORDER BY [Artikelomschrijving];"
Me.cboartikelen.RowSource = strSQL
Me.cboartikelen.Requery

End Sub

Maar ik krijg de hele tijd een foutmelding.
Kan het misschien iets zijn dat de leveranciers_ID in de keuzelijst artikelomschrijving pas in kolom 7 zit?
Bij cboLeveranciers_ID in het hoofdformulier staat de leveranciers_ID in de eerste kolom ingevoerd.
 
Gek genoeg heb ik ook nog een leven buiten HelpMij :D
De verwijzing naar de Column(#) moet uiteraard wel verwijzen naar de juiste kolom. Als je met Column(#) een veld uit een keuzelijst haalt, moet je in het achterhoofd houden dat Access telt vanaf 0. De code cboLeveranciers_ID.Column(0) haalt dus het veld op van de eerste kolom uit de Rijbron van de keuzelijst. Heb je in de keuzelijst het LeveranciersID op een andere plek staan, dan moet je de code aanpassen.
Kan het misschien iets zijn dat de leveranciers_ID in de keuzelijst artikelomschrijving pas in kolom 7 zit?
Nee, dat kan niet, want met de code die je gebruikt zet je maar twee velden in de keuzelijst cboArtikelen.
Ik zie nu, dat je eigenlijk de verkeerde velden ophaalt, ik vermoed dat je dit wilt hebben:

Code:
strSQL = "SELECT [[B][COLOR=red]Artikel_ID[/COLOR][/B]], [Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE [Leveranciers_ID] = " & CStr(Me.Parent!cboLeveranciers_ID.Column(0)) & " "
strSQL = strSQL & "ORDER BY [Artikelomschrijving];"
Me.cboartikelen.RowSource = strSQL
Me.cboartikelen.Requery

Je wilt immers in je subformulier een artikel selecteren, niet een leverancier. Die keuze maak je op je hoofdformulier.
 
met jou manier krijg ik een foutmelding:(

strSQL = "SELECT [Artikel_ID], [Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE [Leveranciers_ID] = " & CStr(Me.Parent!cboLeveranciers_ID.Column(0)) & " "
strSQL = strSQL & "ORDER BY [Artikelomschrijving];"
Me.cboartikelen.RowSource = strSQL
Me.cboartikelen.Requery


ik had nog ergens te horen gekregen dat het ook op de volgende manier kon:

Private Sub cboLeveranciers_ID_Click()
Dim strSQL As String

strSQL = "SELECT [Artikel_ID], [Artikelomschrijving] "
strSQL = strSQL & "FROM [tblArtikelen] "
strSQL = strSQL & "WHERE [Leveranciers_ID] = " & CStr(Me.Parent!cboLeveranciers_ID.Column(0)) & " "
strSQL = strSQL & "ORDER BY [Artikelomschrijving];"
Forms![tblBestellingen1]![tblBestelRegels Subformulier]!cboartikelen.RowSource = strSQL
Me.cboartikelen.Requery

End Sub

Maar het lukt maar niet:( als ik het op deze manieruitvoer, krijg ik ook een foutmelding.

Wil je anders eve naar me db kijken. Echt ik ben hier veelste lang mee bezig:(

Ik weet niet of het daarna ook andersom kan, dus wanneer ik een artikel kies, dat de leverancier in het hoofdformulier ook verandert.
 
Laatst bewerkt:
Stuur maar even op, dan kijk ik er wel even naar.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan