Gegevens in textbox'en laten zien adhv combobox selectie

Status
Niet open voor verdere reacties.

VeerleVR

Gebruiker
Lid geworden
5 aug 2011
Berichten
38
Hoi,

Ik heb 3 aan elkaar gelinkte tabbellen : Grossiers, Klanten en Contractprijzen.
Ik zou een formulier moeten maken waarop je de grossier kan selecteren (cboGrossier) en daarna een klant die bij die Grossiergroep behoort (cboKlant). Dit heb ik al en werkt perfect (aantal records = 1).

Maar na de klant te hebben geselecteerd zouden de textvakken eronder moeten ingevuld worden met Contractprijsgegevens (zoals product, prijs/kg, prijs/zak, begindatum en eindatum) van de klant.

Er kunnen meerdere producten bij dezelfde klant contractprijzen hebben maar mijn aantal records blijft echter staan op 1 en de textvakken worden ook niet ingevuld ondanks dat ze toegewezen zijn aan de juiste tabel en veld.

Hoe los ik dit het beste op ?

Groetjes.
 
Leg eerst uit hoe je de situatie nu oplost. En ik snap ook nog niet of je per klant één record met Contractprijsgegevens hebt of niet....
 
Ik heb per klant MEER dan één record met Contractprijsgegevens.

In de tabel Contractprijzen zitten 530 records.
Als ik het formulier open staan er ook 530 records op én de textboxen met contractprijsgegevens zijn ingevuld.

Dan wil ik selecteren op Grossier en daarna klant (die bij die grossier hoort) en heb ik nog maar 1 record over en zie ik niet meer bij de textboxen.

cboGrossier werkt op de tabel Grossiers en heeft deze code :
Private Sub cboGrossier_AfterUpdate()
Me.Filter = "[Groepsnaam]= '" & Me.cboGrossier & "'"
Me.FilterOn = True
End Sub

cboKlanten werkt op de tabel Klanten maar is gelinkt met cboGrossiers door dit :
[Forms]![frmKlanten FS]![cboGrossier] in de RowSource en heeft deze code :
Private Sub cboKlantnaam_Enter()
Me.cboKlantnaam.Requery
End Sub
 
Code:
Private Sub cboGrossier_AfterUpdate()
    Me.Filter = "[Groepsnaam]= '" & Me.cboGrossier & "'"
    Me.FilterOn = True
End Sub
Deze keuzelijst gebruik je dus blijkbaar om het formulier te filteren. No problemo, moet kunnen.

cboKlanten werkt op de tabel Klanten maar is gelinkt met cboGrossiers door dit : [Forms]![frmKlanten FS]![cboGrossier] in de RowSource en heeft deze code :
Private Sub cboKlantnaam_Enter()
Me.cboKlantnaam.Requery
End Sub
En daar ben je me weer kwijt; waar staat de code [Forms]![frmKlanten FS]![cboGrossier] nu? En wat doe je met de keuzelijst cboKlantnaam bij <Na bijwerken>?
 
de code :[Forms]![frmKlanten FS]![cboGrossier] staat bij de Rijbron van cboKlanten

Bij de Rijbron heb ik een query met de Klant_ID en de Klantnaam erin van de tblKlanten.
Hier staat ook Grossier_ID in van de tblKlanten waaronder die code staat bij Criteria.
(Grossier_ID is gelinkt door een relatie met de tblGrossiers waaruit de eerst combobox cboGrossiers is met opgemaakt)


Na bijwerken doe ik niets met cboKlanten maar ik zou de code ook daar kunnen zetten ipv bij Enter. Ik denk dat dat hetzelfde zou zijn.
Private Sub cboKlanten_Enter()
Me.cboKlanten.Requery
End Sub
Deze code zorgt ervoor dat de cboKlanten telkens opnieuw geladen wordt met de juiste klanten die onder een bepaalde grossier komen van cboGrossiers. Als ik dit niet zou doen, blijven de klanten van de eerste grossier die ik heb geselecteerd staan en kan ik dus niet veranderen naar klanten van een andere grossier.
 
Ik snap het nog steeds niet; zet de volledige Rijbroncode eens neer, dan wordt het hopelijk wat duidelijker. En ik snap ook nog niet hoe je formulier precies werkt; ik vermoed dat je een doorlopend formulier hebt gemaakt op basis van Contractprijzen, en dat je in de koptekst daarvan twee keuzelijsten hebt gemaakt, die beide het formulier zouden moeten filteren. De eerste keuzelijst filtert op Grossier, en de tweede op klant. Gezien de opzet van je db neem ik aan dat als je op grossier filtert, je alle klanten/contractprijzen records ziet die bij die grossier horen. Filter je dan op Klant, wil je dan de records zien van die specifieke Grossier/Klant combinatie? Of wil je dan de records zien van die klant? En kunnen klanten bij meerdere grossiers staan? En wil je dan, als dat zo is, als je een klant kiest dan alle records van alle grossiers van die klant zien?
 
Rijbroncode comboboxen :
cboGrossier : SELECT [Groeperingen].[Id_Groep], [Groeperingen].[Naam Groep] FROM Groeperingen;
cboKlanten : SELECT Klanten.Id_Eindv, Klanten.Klantnaam, Klanten.Gros_Id FROM Groeperingen INNER JOIN Klanten ON Groeperingen.Id_Groep=Klanten.Gros_Id WHERE (((Klanten.Gros_Id)=[Forms]![Klanten FS]![cboGroepsnaam])) ORDER BY Klanten.Klantnaam;

Het formulier is inderdaad op basis van Contractprijzen. In de koptekst staan twee comboboxen, die beide het formulier zouden moeten filteren (maar dit dus niet doen). De eerste keuzelijst filtert op Grossier, en de tweede op klant.

De bedoeling is dat als je op grossier filtert, je alle klanten/contractprijzen records ziet die bij die grossier horen.
Als je dan op Klant filtert kan je de contractprijzen zien van die specifieke Grossier/Klant combinatie.
Elke klant is uniek en kan maar bij 1 bepaalde grossier voorkomen. Er kunnen wel meerdere contractprijzen zijn per klant.​
 
Feitenlijk is het dus zo, dat als je op Klant filtert, je niet meer op Grossier hoeft te filteren, omdat elke klant maar bij één grossier zit. Ergo: filter je op Klant, dan zie je automatisch de records van één grossier. Dus ik zou het heel simpel houden:

Code:
Private Sub cboGrossier_AfterUpdate()
    Me.Filter = "[Groepsnaam]= '" & Me.cboGrossier & "'"
    Me.FilterOn = True
    Me.cboKlanten.Requery
End Sub

Ik vind dat je de cboKlanten op de verkeerde plek vernieuwd; dat moet gebeuren op het moment dat je een grossier kiest. Dan moet de Klantenlijst worden aangepast. Met bovenstaande aanpassing gebeurt dat ook. Kies je vervolgens een klant, dan moet er een nieuw filter worden uitgevoerd op basis van KlantID. Zoals gezegd: door de opzet heb je dan automatisch altijd maar één grossier in de selectie, dus daar hoef je niet meer op te filteren.

Code:
Private Sub cboKlant_AfterUpdate()
    Me.Filter = "[KlantID]= " & Me.cboKlant 
    Me.FilterOn = True
    Me.Refresh
End Sub

Als laatste zou ik ook een knop maken die de volledige tabel laat zien, het filter dus leegmaakt en de keuzelijsten leeg maakt.

Code:
Private Sub cmdWissen_Click()
    Me.cboGrossier = ""
    Me.cboKlanten = ""
    Me.Filter = ""
    Me.FilterOn = false
    Me.Refresh
End Sub
 
Hij werkt bijna.. !! :)
ik krijg enkel nog een runtime error 3464.
Dit komt door deze code :

Private Sub cboKlant_AfterUpdate() Me.Filter = "[KlantID]= " & Me.cboKlant Me.FilterOn = True Me.RefreshEnd SubDe klantID is terug te vinden in meerdere tabellen.

Mss een heel stomme vraag maar : hoe kan je ervoor zorgen dat ze de KlantID van de tabel Klanten nemen ?
Ik heb al vanalles geprobeerd zoals : [Klanten].[KlantenID] OF [Klanten]![KlantenID]...
 
Een veldnaam kan in een query of tabel maar één keer gebruikt worden, dus als je dezelfde naam tegenkomt moet je aangeven uit welke tabel die komt. De techniek die je gebruikt is dan ook in beginsel niet fout: Klanten!KlantenID zou het KlantenID uit de tabel Klanten moeten vinden. Ik denk dat je fout dan ook ergens anders zit, want in de bron van je formulier kun je ook maar één veld hebben dat KlantID heet.
 
Ik heb alle dubbele velden er zo aangepast dat ze allemaal uniek zijn.
De fout blijft er echter opkomen en komt dus van iets anders zoals je zei...

Zou het misschien kunnen dat hij de error geeft omdat er niet bij alle klanten contractprijzen zijn ?
Of denk je dat het nog ergens anders zit ?
 
Je geeft niet aan in welke regel je de foutmelding krijgt; de code die je hebt geplakt is niet met de CODE tag opgemaakt, en leest zo dus niet geweldig. Waar loopt hij precies vast? En mag ik uit je laatste opmerkingen opmaken dat het wel goed gaat bij klanten met prijzen?
 
De fout komt hier voor :
Private Sub cboKlantnaam_AfterUpdate()
Me.Filter = "[Klantnaam]= " & Me.cboKlantnaam
Me.FilterOn = True
Me.Refresh
End Sub

Het werkt ook niet bij klanten die wel prijzen hebben... raar.
 
Dan kun je hier nog aan denken: in je keuzelijst is je eerst kolom (vermoed ik) numeriek:

Code:
cboKlanten : SELECT [B][COLOR="#0000CD"]Klanten.Id_Eindv[/COLOR][/B], Klanten.Klantnaam, Klanten.Gros_Id FROM Groeperingen INNER JOIN Klanten ON Groeperingen.Id_Groep=Klanten.Gros_Id WHERE (((Klanten.Gros_Id)=[Forms]![Klanten FS]![cboGroepsnaam])) ORDER BY Klanten.Klantnaam;

Je filter maak je echter op het veld Klantnaam. Zelf zou ik dat nooit doen, want een klantnaam is niet altijd uniek, maar je sleutelveld ([Id_Eindv]) is dat uiteraard wel.
Ik zou dus filteren op:
Code:
    Me.Filter = "[Id_Eindv]= " & Me.cboKlantnaam

Wil je toch op klantnaam, dan moet je die ook uit de keuzelijst trekken, en als tekst filteren.
Code:
    Me.Filter = "[Klantnaam]= '" Me.cboKlantnaam.Column(1) & "'"
 
Laatst bewerkt:
HET WERKT !
Echt super bedankt! De deadline voor dit was overmorgen ! :)

Fijne dag nog ! Werk ze.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan