Invoer keuzeformulier met invoervak beperken

Status
Niet open voor verdere reacties.

Robbin R

Gebruiker
Lid geworden
14 jul 2010
Berichten
29
Ik heb onderstaande (deel van een formulier) waarin een Customer geselecteerd kan worden uit een lijst en vervolgens een Client uit een lijst.

e7m3ci.png

De lijst Customer is bijvoorbeeld:
Bedrijf A, Bedrijf B, Bedrijf C

Lijst Clients:
A. Aap - Bedrijf A
B. Beer - Bedrijf C
C. Cobra - Bedrijf C
D. Dog - Bedrijf B
E. Ezel - Bedrijf A
F. Fazant - Bedrijf A
G. Grutto - Bedrijf C
H. Haas - Bedrijf B

Ik zou nu graag hebben dat als ik bij Customer kies voor Bedrijf A,
dat de mogelijkheden voor Client dan alleen nog bestaan uit Aap, Ezel en Fazant

Heeft iemand een idee?
 
Ik nu zoiets als

Ontwerpweergave > Eigenschappenvenster (Client) > Rijbron:
Code:
SELECT qrySortContacts.FullName
FROM qrySortContacts
WHERE (((qrySortContacts.CompanyID)=[Me].[Customer]))
ORDER BY qrySortContacts.FullName;

Ik kan dan een Customer kiezen, bijvoorbeeld Bedrijf A.
Vervolgens verschijnt er een pop up met Parameter-waarde ingeven: Me.Customer

Als ik daar dan ook nog Bedrijf A intyp, dan kan ik inderdaad alleen maar kiezen uit Aap, Ezel of Fazant.

Er zijn dan echter nog twee problemen:
1. Als ik dan alsnog Bedrijf B kiezen, komt de pop up niet en blijft de keuze bestaan uit Aap, Ezel of Fazant, terwijl dit dan verandert zou moeten zijn naar Dog of Haas.

2. Ik wil die pop up natuurlijk helemaal niet hebben.
 
Je moet het helemaal anders aanpakken, en wel op de <Na bijwerken> gebeurtenis van de keuzelijst Customer. Je hebt op de keuzelijst Client vast een query of tabel als Recordbron staan. Deze recordbron moet je verwijderen, en laten opbouwen bij de keuzelijst Customer. Dat ziet er dan ongeveer zo uit:

Code:
Private Sub cboCustomer_AfterUpdate()
     strSQL="SELECT ClientID, ClientNaam, CustomerID FROM tblClients " _
          & "WHERE CustomerID=" & Me.cboCustomerID
     Me.cboClient.RowSource=strSQL
     Me.cboClient.Requery
End Sub
De keuzelijst cboClient kun je dan koppelen aan het besturingselement in de tabel.
 
Bon, ik heb het zo overgenomen:

Code:
Private Sub Customer_AfterUpdate()
    strSQL = "SELECT ContactID, FullName, CompanyID FROM qrySortContacts " _
        & "WHERE CompanyID = '" & Me.Customer & "'"
    Me.Client.RowSource = strSQL
    Me.Client.Requery
End Sub

en het werkt.
Maar wat moet ik dan nog doen met keuzelijkst cboClient? Die is nu nergens aan gekoppeld behalve dan:
Eigenschappenvenster > Gegevens > Type rijbron: Tabel/query
 
De keuzelijst cboClient kun je nu koppelen aan het veld dat je daarvoor in je tabel gebruikt. Je hebt niet aangegeven aan welke tabel je formulier is gekoppeld, dus ik ga er vanuit dat in je oorspronkelijke opzet het formulierveld ook gekoppeld was aan een tabelveld.
 
Ah zo, de waarde die ik kies moet nu worden opgeslagen in de tabel in het veld Client.
Wat nu gebeurt echter, is als ik Eigenschappenvenster > Gegevens > Besturingselementbron > Client kies,
dan wordt ClientID opgeslagen in de tabel.

Ik zou graag hebben dat de naam van de client wordt overgenomen.
In het keuzeformulier heb ik dit al afgevangen door
Eigenschappenvenster > Opmaak > Aantal kolommen: 2
Eigenschappenvenster > Opmaak > Kolombreedten: 0 cm; 4 cm

Dus stel ik kies in het keuzeformulier:
35 | Jan, Janssen

Dan zou ik willen dat Jan Janssen wordt opgeslagen in de tabel en niet 35.

Kan je dit ook nog ergens opgeven?
 
Ik denk eigenlijk niet dat je wilt dat je de naam van de client wilt opslaan; het is juist de bedoeling om de ClientID op te slaan! Althans: als je de db netjes wilt vullen...
De reden daarvoor is heel simpel: als je tabellen gaat koppelen, en ik neem aan dat je dat hebt gedaan voor de bron van je tabel, dan koppel je die tabellen op basis van het sleutelveld uit de hoofdtabel. In de tabel Clients heb je dus een ClientID, ClientNaam, ClientAdres etc. In de tabel Consults Koppel je dan ClientID uit de tabel Clients aan het veld cl_CLientID uit de tabel Consults d.m.v. een één-op-veel relatie. Het veld ClientID in Clients is dan een Sleutelveld, met een unieke waarde.
Je slaat dus in de tabel Consults niet de naam op, maar het ClientID veld. Als je dan een ClientID invult, weet je exact welke client dat is, omdat het nummer immers uniek is.
In het formulier Consults kun je vervolgens, als je een ClientID hebt geselecteerd, alle Clientgegevens laten zien die je wilt, omdat je via de keuzelijst een unieke client hebt geselecteerd, die is gekoppeld aan één client.
Kortom: helemaal top, zou ik zeggen..... Niks meer aan doen dus!
 
Okee, maar in dit geval heb ik
tblContacts
ClientID (autonum); FirstName; Preposition; LastName; CompanyID

en tblCompanies
CompanyID (geen autonum, maar lettercode); CompanyName; CompanyType; Country

Dus het veld CompanyID is een primaire sleutel, met een een-op-veel relatie.
Het autonummeringsgetal, zit dus aan een naam gekoppeld.

Deze naam zegt voor de database gebruiker meer dan het auto-getal, dus zou ik zeggen dat het beter is de naam op te slaan in de tabel. Maar goed, ik zit nu pas voor het eerst met Access te klooien.

Reuze bedankt voor de reacties in ieder geval, heeft weer goed geholpen:thumb:
 
Deze naam zegt voor de database gebruiker meer dan het auto-getal, dus zou ik zeggen dat het beter is de naam op te slaan in de tabel.
Voor de gebruiker is het handiger om de naam te laten zien, dat klopt. Voor de db is het echter beter om de sleutelwaarde op te slaan.

tblContacts
ClientID (autonum); FirstName; Preposition; LastName; CompanyID (Numeriek)

en tblCompanies
CompanyID
(Autonummer); CompanyName; CompanyType; Country

Dus het veld CompanyID is een primaire sleutel, met een een-op-veel relatie.
Ik heb je voorbeeldje dus even aangepast van hoe het zou moeten. CompanyID is in de hoofdtabel een autonummerveld, dus numeriek. Om die aan de tabel tblContacts te koppelen, heb je dus ook een numeriek veld van hetzelfde type (lange integer) nodig.
Op de keuzelijst cboCompany op je formulier gebruik je dan een <Rijbron> van de velden CompanyID en CompanyName, de keuzelijst krijgt dan 2 kolommen, met een breedte van 0cm en 4 cm. De <Lijstbreedte> maak je dan 4,6 cm (4 cm voor de kolom, en 0,6 cm voor het knopje). De <Afhankelijke kolom> is kolom 1, je CompanyID. De keuzelijst koppel je aan het veld CompanyID van de <Recordbron> van het formulier. Het resultaat is: je slaat het getal CompanyID op, en je ziet de CompanyName.
Een andere reden om het zo te doen, en niet de Naam op te slaan is dat een naam niet altijd uniek is. En dan heb je echt een probleem.... Kortom: altijd de sleutelwaarden refereren en opslaan!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan