Formulier ontwerp vraagje

Status
Niet open voor verdere reacties.

rschaft

Gebruiker
Lid geworden
9 jul 2007
Berichten
10
Ik wil een planning formulier maken, die gegevens haalt uit 4 andere tabellen (projecten, klanten, contactpersonen en locaties). Het veld klant is een vast gegeven bij een project (1 op 1) en dien automatisch in het formulierveld te verschijnen.
Door een project te selecteren wil ik dat er in het veld locatie en contactpersonen alleen die gegevens worden aangeboden in de keuzelijst, die bij het project horen.
Hoe kan ik dat doen?
 
Als je het hebt over een 1 op 1 relatie, bedoel je waarschijnlijk een één-op-veel relatie, tenzij je per klant maar één project doet. Normaal lijkt mij dat je per klant meerdere projecten zult willen doen. Maar voor het principe maakt dat overigens niet uit. In de keuzelijst voor de klanten op je formulier moet je ook de extra velden opnemen die je straks als gegeven terug wilt zien op het formulier. De gegevens kun je met [cboKeuzelijst].[Column(#) dan weer opvragen.
 
Klopt, een klant kan meerdere projecten hebben.
Kan je misschien iets meer vertellen over de werkwijze, ik ben nl. een beginner:o
Is er misschien een tutorial op internet die ik kan raadplegen (ik kon zelf niets vinden op dit gebied).
 
Voor een specifiek antwoord zouden we eigenlijk een voorbeeldje moeten hebben met de tabellen en formulieren die je hebt, maar een algemeen antwoord kan ik uiteraard wel geven.
Je hebt dus een relatie gelegd tussen de tabellen Planning, Projecten en Klanten, met hopelijk Referentiële Integriteit afdwingen geselecteerd, om te voorkomen dat je verkeerde klanten en projecten aan je planning hangt. Dat zou dan in deze volgorde kunnen zijn:
[Klanten] 1 --> ∞ [Projecten] 1 --> ∞ [Planning]

Ik vermoed, dat je het formulier hebt gebaseerd op de tabel Planning? En dat je met een keuzelijst dan een project wilt selecteren? Je kunt voor de keuzelijst cboProjecten een Rijbron maken, waarbij je als tabellen [Klanten] en [Projecten] gebruikt. Behalve de ProjectID en ProjectNaam (die je wilt zien in de keuzelijst) neem je dan ook de klantgegevens op die je op wilt vragen op het formulier. Dus: Klantnaam, Adres etc. Omdat elk project maar één klant heeft gekoppeld, zou je, als je de query vervolgens uitvoert, voor elk project maar één record moeten zien, met uiteraard de bijbehorende klantgegevens.
Als je op de keuzelijst 6 velden hebt toegevoegd, moet je in de keuzelijst cboProject ook aangeven dat je 6 kolommen nodig hebt. Dat doe je bij de Eigenschappen van de keuzelijst, bij de optie <Aantal kolommen>. Om de Projectnaam te zien, zet je de breedte van de eerste kolom op 0 cm, en geef je voor de overige kolommen een passende waarde. Iets als: 0cm;4cm;3cm;3cm;0cm;0cm. Dat doe je bij de optie Kolombreedten. Het standaardaantal rijen kun je rustig verhogen naar 20, dat zoekt wat makkelijker. De optie Lijstbreedte maak je het totaal van de kolombreedten (in mijn voorbeeld 4+3+3) plus 0,6 cm, voor de breedte van het keuzelijstknopje. De Lijstbreedte is dus 10,6 cm.
Als je het ProjectID als waarde op wilt slaan, wat mij logisch lijkt, dan gebruik je het veld ProjectID in de tabel Planning als Besturingselementbron. Te vinden op het tabblad Gegevens. Omdat het ProjectID de eerste kolom is, is dat ook de Afhankelijke kolom.

Daarmee is je keuzelijst klaar voor gebruik. De volgende stap is nu, om de overige velden uit de keuzelijst op je formulier te zetten. Dat doe je met Tekstvakken.
Voor de klantnaam in txtKlantnaam, die in mijn fictieve voorbeeld in de derde kolom staat, zet je bij de regel Besturingselementbron de formule: =cboProject.Column(2) De opdracht Column begint namelijk te tellen bij 0, dus je moet de waarde altijd met één verminderen om de goede kolom te pakken. Het tekstvak txtKlantAdres krijgt de formule: =cboProject.column(3).
En zo ga je het hele rijtje af. Hoe meer velden je opneemt in de keuzelijst, hoe meer je kunt laten zien op het formulier. Ik heb regelmatig 25 velden op die manier op een formulier gezet, en dat werkt perfect!
Hopelijk kun je hier weer even mee verder?
 
Hallo Michel,

Ik heb vanalles geprobeerd, maar ik krijg steeds een #Naam? foutmelding.
Ik heb een keuzelijst Klant met als rijbron: SELECT [Klanten].[KlantId], [Klanten].[Klantnaam] FROM Klanten ORDER BY [Klantnaam]; Type rijbron: Tabel/Query
Kolom 1 is de afhankelijke kolom en ik wil graag Klantnaam in een veld in het formulier weergeven.
Ik maak een nieuw tekstvak aan en zet =[cboKlanten].[Column](1) als elementbron neer (de [ ] verschijnen na enter vanzelf.
De foutmelding blijft. Wat doe ik fout?
Overigens werk ik met Access 2007:o
 
Je hebt mijn sympathie :D
Aan de code zie ik eigenlijk niks verkeerds. Dus is de volgende vraag: waar heb je cboKlanten en tekstvak staan?
 
Hoi Michel,

De cbo staat op het formulier Projecten in een nieuw tekstvak. Heb ik ingevoerd via de opbouwfunctie voor expressies.
 
Eerst maar even de bloody obvious.... heeft de keuzelijst wel de naam cboKlanten?
 
Via het tabblad <Overige>
 
Ik heb het lek boven......
cbo is niets meer dan een afkorting en geen specifieke code, instructie of iets dergelijk.....
Is het ook nog mogelijk om de waarde uit een zoeklijst die in het formulier in een veld wordt weergegeven, op te slaan?
 
Dat doe je door op het tabblad Gegevens een Besturingselementbron aan te wijzen.
 
Ik was iets te snel met mijn reactie.... Ik dacht dat je de waarde van de keuzelijst wilde opslaan. Overigens, als je die opslaat, hoef je (normaal gesproken) de waarde uit het tekstveld niet op te slaan, want die is, neem ik aan, één-op-één gerelateerd aan de keuzelijst.
Maar het kan wel. De truc is dan, dat je het tekstveld vult vanuit de keuzelijst.
Het tekstvak kun je dan koppelen aan het veld in de tabel.
De code voor de keuzelijst ziet er dan ongeveer zo uit:

Code:
Private Sub LstPostcode_AfterUpdate()

    Me.txtProvincie.Value = LstPostcode.Column(2)
    Me.txtLand.Value = LstPostcode.Column(3)

End Sub
In dit voorbeeld gebruik ik een keuzelijst lstPostcode. Bij kiezen van een waarde worden er twee tekstvakken gevuld, met een waarde uit de keuzelijst.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan