Access niet-afhankelijke veld formulier ophalen bij gekoppelde keuzelijsten

Status
Niet open voor verdere reacties.

Matjes

Gebruiker
Lid geworden
21 jun 2016
Berichten
76
Via onderstaande link heb ik een beschrijving opgehaald en een voorbeelddatabase gedownload met daarin een voorbeeld van gekoppelde keuzelijsten. Dit werkt goed.

http://access.xps350.com/GekoppeldeKeuzelijsten.html

Wat echter niet goed werkt is het ophalen van de niet-afhankelijke velden op het formulier. Wanneer het formulier wordt geopend worden de niet-afhankelijke velden van de bestaande records niet getoond, ook niet bij het doorlopen van de records. Ook in het voorbeeld van de database werkt dit niet goed.

Iemand een suggestie wat hier mogelijk het probleem is en een eventuele oplossing om dit te verhelpen?

Hieronder de code:

Private Sub Form_Current()
Me.Leverancier = Me.Artikel.Column(2)
Me.Artikel.RowSource = "SELECT ArtikelID, Artikel, LeverancierID FROM Artikel" & _
" WHERE LeverancierID=" & Me.Leverancier & " ORDER BY Artikel"
Me.Artikel.Requery
End Sub

Private Sub Leverancier_AfterUpdate()
Me.Artikel.RowSource = "SELECT ArtikelID, Artikel, LeverancierID FROM Artikel" & _
" WHERE LeverancierID=" & Me.Leverancier & " ORDER BY Artikel"

Me.Artikel.SetFocus

Select Case Me.Artikel.ListCount
Case 0
Me.Artikel = Null
Case 1
Me.Artikel = Me.Artikel.ItemData(0)
Case Else
Me.Artikel = Null
Me.Artikel.Dropdown
End Select

End Sub
 
Ik zie wel iets heel vreemds: Ik neem aan dat je eerst een leverancier kiest, en dan pas een artikel. De rijbron van de keuzelijst Artikel (ongelukkige naam; ik vermoed dat je veld ook Artikel heet. Sowieso is het verstandig om objecten waar je iets mee wilt doen een unieke naam te geven, en dat liefst dan het voorvoegsel van het object. Dus een keuzelijst noem je dan lstArtikel, en een keuzelijst met invoervak cboArtikel. Maar dat veroorzaakt niet het probleem, is hooguit voor jezelf veel makkelijker.
Dus, om op het verhaal terug te komen, je keuzelijst is afhankelijk van de leverancier. Dan moet je bij het bladeren door de records die afhankelijkheid ook in tact laten; jij maakt de leverancier afhankelijk van de keuzelijst. Dit zou voldoende moeten zijn:

Code:
Private Sub Form_Current()
    Me.Artikel.RowSource = "SELECT ArtikelID, Artikel FROM Artikel WHERE LeverancierID = " & Me.Leverancier & " ORDER BY Artikel"
End Sub

Code:
Private Sub Leverancier_Click()
    Me.Artikel.RowSource = "SELECT ArtikelID, Artikel FROM Artikel WHERE LeverancierID = " & Me.Leverancier & " ORDER BY Artikel"
    Select Case Me.Artikel.ListCount
        Case 0
            Me.Artikel = Null
        Case 1
            Me.Artikel = Me.Artikel.ItemData(0)
        Case Else
            Me.Artikel = Null
            Me.Artikel.Dropdown
    End Select
End Sub
 
Dank voor de tip van de voorvoegsel van Objecten. Ga ik zeker wat mee doen.

Wat ik nog niet begrijp van de gewijzigde code is hoe de leverancier nu gepresenteerd wordt op het bestelformulier? Dit gezien deze niet in de tabel bestelling wordt opgeslagen. Deze moet toch vanuit het artikelveld erbij worden gezocht op het formulier?
 
Je hebt een keuzelijst (met invoervak, neem ik aan) met leveranciers. Daar zie je de leveranciersnaam, maar bewaar je de leveranciersID. Neem ik tenminste aan, want zo zou het horen. Dus in beginsel zie je de leverancier al. Daar heb je geen extra tekstvelden voor nodig. Mocht je toch meer willen zien van de leverancier (adres, etc.) dan koppel je de tekstvelden aan de leveranciers keuzelijst, niet de artikellijst. En dat doe je door in de besturingselementbron van het tekstvak dus de formule =cboLeverancier.Column(2) (als je de derde kolom wil zien) te zetten. Uiteraard kun je deze formules ook gebruiken om tekstvakken te vullen vanuit de Click event van de keuzelijst. Maakt niet zoveel uit. Bij prijzen bijvoorbeeld doe je het op de laatste manier omdat je de verkoopprijs, die variabel is, wil opslaan in de tabel zodat de prijs na het vastleggen van het record niet meer verandert.
 
Ok dank voor de uitleg.

Nog even een nadere toelichting. In de voorbeeld DB van bovenstaande link heeft form bestelling een keuzelijst met invoervak met leveranciers (niet-afhankelijk). LeverancierID wordt hierbij niet opgeslagen. Lijkt mij ook niet nodig omdat artikel een relatie met de leverancier heeft? Toch zou je voor bestaande records in het formulier wel de bij de artikel behorende leverancier willen zien. Dat is (niet geheel werkend) opgelost door op het formulier een gebeurtenis bij aanwijzen (current) te maken, die ervoor zorgt dat het niet-afhankelijke veld leverancier gevuld wordt met de leverancier die bij het artikel van het actuele record hoort.

Zou bovenstaande oplossing werkend te krijgen zijn of moet ik leverancierID ook opslaan in bestellingen? Maar dan sla ik een leverancier op in bestellingen en een artikel terwijl deze al een op veel relatie hebben?
 
Ik ken de voorbeeld db niet, maar logisch klinkt het allemaal niet. Een bestelling plaats je per definitie bij een leverancier. Wie anders gaat de spullen leveren? Dus in de tabel Bestellingen vind je, naast de bestelgegevens zoals bestelnummer en besteldatum, ook de leverancier gegevens die je nodig hebt. Daarnaast heb je een tabel Bestelgegevens. Doorgaans bestel je meer dan één artikel, en daarvoor heb je dus een gekoppelde tabel. Die tabel koppel je uiteraard aan de tabel Bestellingen op basis van het veld [Bestelnummer].
Het lijkt mij logisch dat je bij een leverancier alleen artikelen bestelt die de gekozen leverancier levert. Anders krijg je een lege doos met een briefje erbij: "sorry, maar dat leveren wij niet". Heb je niks aan.
Dus het subformulier Bestelgegevens bevat een keuzelijst artikelen die is gefilterd op leverancier. Als jij mij nu gaat vertellen dat deze aanpak niet logisch is, blijf ik nog even wakker :). Dat wil ik dan namelijk wel lezen :D.
 
Zoals je het schets klinkt mij volledig logisch. Voorbeeld DB is in dezen dan ook een minder goed voorbeeld wat ik heb gevonden :) Het gaat mij dan ook meer om het mechanisme van gekoppelde keuzelijsten met invoervakken waarbij de eerste keuzelijst 1 leidt tot een beperkte keuzelijst 2 en keuzelijst 2 leidt tot een beperkte keuzelijst 3. De keuze uit keuzelijst 3 wordt alleen opgeslagen in een tabel omdat de waarden uit keuzelijst 1 en 2 herleid kunnen worden uit keuzelijst 3 (relationeel uit drie tabellen).

Bij formulieren werkt dit echter niet geheel vlekkeloos omdat bij de waarden voor keuzelijst 1 en 2 bij bestaande records uit keuzelijst 3 via het betreffende mechanisme niet altijd gevonden worden.

Nou lang verhaal :) als je voor bovenstaand nog een idee hebt dan hoor ik het nog graag. Misschien had ik beter kunnen zeggen dat je verhaal niet logisch is want dan was je nog wel wakker gebleven ;)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan