Adres automatisch aanvullen

Status
Niet open voor verdere reacties.

dingesvandinges

Gebruiker
Lid geworden
20 apr 2006
Berichten
261
Beste Helpmij'ers,

Ik heb een tabel met opdrachtgevers.
Ook heb ik een Query met dezelfde gegevens.

Nu heb ik een formulier gemaakt en wil ik bij het invullen (keuzemenu) van de opdrachtgever het adres automatisch laten invullen. Dit is voor een deel gelukt. Ik heb rijbron ingevoerd (gelijk aan de Query) ik kan dan ook de opdrachtgever kiezen. De straatnaam vult hij netjes aan echter de postcode en plaats niet.

Via het bestand "Northwind" (voorbeeldbestand) kom ik er niet uit.

Wil een Access kenner eventjes meekijken bestandje?
 
Laatst bewerkt:
Ik heb even voor je meegekeken, en het probleem is simpel op te lossen:
je hebt in je keuzelijst het aantal kolommen te laag staan. Als je 4 velden in je query zet, moet je het aantal kolommen evenredig instellen, dus ook op 4.
 
Klopt, geweldig,

Volgende probleem of 2 problemen:
- Het adres wat uit de opdrachtgever komt voert hij door op alle records (alle formulieren).
- Het adres wat uit de opdrachtgever komt slaat hij niet op, het formulier wordt gewist bij het sluiten en openen van het formulier.

Ik wil graag dat het adres opgeslagen wordt en dat ik per record een nieuwe opdrachtgever kan kiezen.

Wie o Wie kan mij helpen.
 
Dat laatste moet je nog even uitleggen, want op je testdb kan ik zoiets niet echt reproduceren.
In je testdb heb je één tabel, en één formulier. Het formulier dat je hebt gemaakt, is niet gekoppeld aan de tabel of de query. Dat betekent, dat je de gegevens op het formulier die je m.b.v. de keuzelijst ophaalt, nergens in opslaat. Dat hoeft geen probleem te zijn, want dat kun je allemaal regelen, als je allerlei acties gaat automatiseren met opdrachtknoppen. Ik neem echter nu nog even aan, dat je het liever wat simpeler oplost ;)

Om te beginnen: kies een tabel als bron voor je formulier, en zorg ervoor, dat alle velden uit de tabel op het formulier terecht komen. Als je een formulier maakt met een wizard, kan dat bijna niet mislukken.
Doe je het handmatig, dan vind je, als je bij de Eigenschappen van het formulier een RecordBron hebt opgegeven op het tabblad Gegevens, een knop <Lijst met velden>, waarin je alle velden uit je tabel of query terugvindt.
Met slepen kun je vervolgens deze velden op het formulier plaatsen.
Heb je al tekstvakken staan, dan kun je deze koppelen aan de recordbron, door, ook weer via Eigenschappen, een <Besturingselementbron> te selecteren. Hiermee leg je een koppeling tussen wat je op het scherm in je formulier ziet, en de tabel die je als opslag gebruikt.
Daarmee zou het grootste deel van je probleem verholpen moeten zijn...
 
Ik vermoed dat je met het formulier dat je gepost hebt, iets anders wilt doen dan wat je in de tweede vraag stelt.
Je eerste vraag betrof een formulier waarin je een adres wilde opzoeken, met de aanvullende gegevens van de gekozen persoon.
Nu wil je, denk ik, een formulier hebben waarin je records wilt kunnen toevoegen aan een tabel. De misvatting nu is, dat je het formulier uit de eerste vraag wilt gebruiken om records toe te voegen aan dezelfde tabel als de tabel waaruit je de gegevens opvraagt in de keuzelijst. En dat gaat niet.

Waarschijnlijk heb je in je tabel nu minstens twee tabellen: een tabel met contactgegevens, en een tabel waarin je iets doet met die contactgegevens, bijvoorbeeld bestellingen plaatsen. Hierbij kun je twee formulieren gebruiken: een formulier om de klantgegevens toe te voegen/bij te werken, en een formulier om, om bij het voorbeeld van de bestellingen te blijven, bestellingen te maken.

In het formulier Klanten hoef je eigenlijk niet zoveel te doen: je hebt je tabel met gegevens, je maakt een formulier dat alle gegevens uit die tabel laat zien, en daana kun je met de bestaande formulierknoppen bladeren door de records, en nieuwe records aanmaken. Daar heb je geen keuzelijsten bij nodig, want elk veld op het formulier komt overeen met elk veld in je tabel, en elk record op je formulier laat één klant zien. Redelijk recht-toe-recht-aan dus.

Anders is het met het formulier Bestellingen. In de tabel Bestellingen dus) wil je alle gegevens van een bestelling opslaan, waaronder dus ook een Klantnummer. Voor dat klantnummer kun je een opzoeklijst maken, die is gebaseerd op de tabel Klanten. Je zoekt dus een klant op in de tabel Klanten, die een bestelling doet, waarvan je de gegevens opslaat in de tabel Bestellingen. Nu heeft een opzoeklijst dus wèl zin, want een klant kan meerdere bestellingen doen, en moet dus voor elke bestelling weer worden ingevuld. Dus: kijk goed naar wat het formulier doet, welke tabel of query er achter moet hangen, en welke gegevens je kunt ophalen met de keuzelijsten.
Kom je er niet uit, zet dan een iets uitgebreidere db neer, dan kijken we weer mee!
 
Ik zal het uitleggen wat het moet worden,

Ik heb zelf wel het bestand al uitgebreid staan wil dit alleen niet openbaar op internet plaatsen.

Wat het moet worden:
Een bestand voor een reintergratiebureau die opdrachten uitvoert voor opdrachtgevers.
Wij willen dus een formulier waar wij de werkbonnen invullen, dit formulier is gelijk aan het tabel beide dezelfde records (opdrachtgever, adres, postcode, plaats, soort werk, prijs). Bedoeling is dat als wij een werkbon invullen de opdrachtgever intypen (of kiezen met keuzemenu) de adresgegevens er automatisch inkomen.

Precies zoals je aangeef dus, enkel zoeken wij graag de klant op op naam en niet op nummer.
 
Laatst bewerkt:
Je zou zo te zien met twee tabellen kunnen beginnen:

tblOpdrachtgevers:
OpdrachtgeverID (sleutelveld)
opdrachtgever
adres
postcode
plaats

tblWerkorders
OpdrachtID (sleutelveld)
OpdrachtgeverID
Opdrachtlokatie (waar wordt het werk uitgevoerd?)
Begintijd
Eindtijd
(of aantal uren bijv)
soort werk
uurprijs

En zo voorts.
Je moet dus de gegevens van de Opdrachtgever scheiden van de tabel met Werkorders. In een mooi woord: normaliseren van de database. Als je in dit forum op <Normaliseren> zoekt, vind je een paar mooie links, waar je wat meer over dit onderwerp kunt opsteken. Het is de basis van elke goede db!
Zoals je in de opzet hierboven kunt zien, heb ik het veld [OpdrachtgeverID] twee keer gebruikt: één keer als sleutelveld in de tabel Opdrachtgevers, en een keer in de tabel [tblWerkorders]. In het formulier Werkorders maak je de keuzelijst voor de opdrachtgever, waarbij dus het OpdrachtgeverID uit de tabel Opdrachtgevers wordt opgeslagen in het veld [OpdrachtgeverID] in de tabel Werkorders.

De relatie tussen de tabel Opdrachtgevers en Werkorders is dus een één-op-véél relatie, waarbij één opdrachtgever meerdere werkorders kan geven.
 
Het gaat lukken denk ik :D

Ik heb een 1 op 1 relalatie gemaakt van OpdrachtgeverID en OpdrachtgeverID
eerder mocht ik geen formulier maken (aangezien ik uit beide tabellen gegevens haal).

Formulier heb ik gemaakt, hier staan dus alle velden in van alle 2 de tabellen.
Ik heb het tabel laten weergeven op tbl_werkbonnen, als ik voor tbl_opdrachtgevers had gekozen kreeg ik een subformulier. Nu heb ik ook ongeveer wat ik hebben wil.

Nu komt in het formulier 2x het kopje OpdrachtgeverID voor (uit beide tabellen, logisch).
Nu moet je nog beide OpdrachtID velden invullen, als je er later een verander, verander de 2e wel mee, de koppeling is er dus.
Maar moet ik beide velden OpdrachtgeverID (uit beide tabellen) gebruiken in het formulier?

Echter kom ik nu niet meer verder.

Bestand staat weer hier
 
Laatst bewerkt:
Om te beginnen: de link doet het niet.
Verder: een één-op-één relatie is denk ik niet juist, je zou een één op veel relatie moeten hebben, tenzij er maar 1 werkbon per opdrachtgever gemaakt mag worden. dat kan ik uiteraard van afstand niet beoordelen.

Kies, voor het invullen van werkbonnen, alleen voor de tabel Werkbonnen als bron voor je formulier. De aanvullende gegevens van de opdrachtgever kun je ophalen m.b.v. de keuzelijst die je zowiezo nodig hebt, want je moet ook een opdrachtgeverID opslaan in de tabel werkbonnen.
Met tekstvakken die je koppelt aan de keuzelijst cboOpdrachtgever kun je de gegevens tonen op het formulier:
txtAdres=cboOpdrachtgever.Column(1).Value
txtPostcode=cboOpdrachtgever.Column(2).Value
txtPlaats=cboOpdrachtgever.Column(3).Value

etc.
Onthoud: als je gegevens uit een tabel op een formulier zet, dan veranderen de gegevens ook in de tabel, als je ze op het formulier wijzigt. Meestal zul je dat niet willen, als je werkorders aan het invoeren bent; je wilt dan alleen de gegevens zien, niet wijzigen.
 
Oke,

Wat ik gedaan heb:
De 2 tabellen aangemaakt die je aan gaf.
Relatie 1 op veel gemaakt.

Vervolgens een formulier gemaakt met ALLE velden van tabel tbl_werkbonnen.
Hierbij het veel OpdrachtgeverID omgezet naar en keuzeveld met invulvak.
Onder het tabblad van gegevens van eigenschappen bij rijbron alle velden aangeklikt uit de tabel tbl_opdrachtgever (je maak een soort van Query).
Dit veld heten gewoon opdrachtgeverID dit veranderd naar cboOpdrachtgever, ik begrijp dat ik dit moet doen uit jou verhaal.
Aantal kolommen staat op 7.

Vervolgens zelf de velden opdrachtgever, adres, postcode, plaats, telefoonnummer en rekeningnummer toegevoegd en een bestuuringselementbron gegeven:
txtOpdrachtgever=cboOpdrachtgever.Column(1).Value
txtAdres=cboOpdrachtgever.Column(2).Value
txtPostcode=cboOpdrachtgever.Column(3).Value
txtPlaats=cboOpdrachtgever.Column(4).Value
etc.

Het keuzeveld laat wel alle ID's zien van opdrachtID (relatie is dus oke) maar niet de andere kolommen en de velden worden niet ingevuld.
(normaals keuzeveld is afkomstig van tabel tbl_werkbonnen en niet van tbl_opdrachtgevers, aangezien ik dan het zelfde probleem krijg denk ik).

Hierbij is hij als bijlage.
 

Bijlagen

Laatst bewerkt:
Er verschijnt licht aan de horizon... Maar je hebt nog geen zonnebril nodig :)
Kortom: er zitten nog wel wat foutjes in.

Om te beginnen: je hebt de relatie tussen de twee tabellen wel gelegd, maar hij is nog niet erg zinvol. Relaties werken pas goed, als je de optie <Referentiële integriteit afdwingen> aanzet. Hiermee voorkom je dat je in de afhankelijke tabel waarden kunt invoeren, die je niet hebt staan in de brontabel. Oftewel: geen werkbon maken voor opdrachtgevers die je nog niet hebt. Klinkt logisch, niet? In de afbeelding zie je hoe je die aanpassing kunt maken. Dubbelklikken op de relatielijn, en je ziet de opties.

De andere foutjes zitten in het formulier, en zijn ook in één plaatje weer te geven.
Om te beginnen: je hebt nog niet de Naam van de keuzelijst aangepast, en je hebt de eigenschap <Aantal kolommen> verwisseld met <Afhankelijke kolom>. Het aantal kolommen dat je aan een keuzelijst hangt, is afhankelijk van het aantal velden dat in de query zit. Heb je 7 velden in de query, dan heb je ook 7 kolommen nodig. De eigenschap <Afhankelijke kolom> gebruik je om aan te geven welke kolom de waarde bevat die je wilt opslaan of gebruiken. Meestal is dat de eerste kolom, dus daar moet in jouw geval de waarde 1 staan.

Je had deze formule als Besturingselementbron gemaakt voor het textvak Opdrachtgever:

txtOpdrachtgever=cboOpdrachtgever.Column(1).Value

Hierbij is cboOpdrachtgever de naam van de keuzelijst die je wilt gebruiken. Maar die heb je nog niet, want je keuzelijst heet OpdrachtgeverID Deze keuzelijst had je gekoppeld aan het veld [Opdrachtgever], een veld dat niet bestaat in de tabel. Dus dat kan ook niet. Een keuzelijst wordt, als je de waarde van die keuzelijst wilt opslaan, meestal anders genoemd dan het veld dat je er aan koppelt. Vandaar dat ik de naam cboOpdrachtgever voorstelde, i.p.v. de veldnaam OpdrachtgeverID. Als je later wilt verwijzen naar de waarde van de Keuzelijst, dan moet die anders heten dan het Veld waarop hij is gebaseerd. Het is overigens niet verplicht om dat te doen, maar het maakt alles wel makkelijker terug te vinden.
Dus: de naam van de keuzelijst heb ik aangepast, zoals je in de afbeelding kunt zien. De keuzelijst cboOpdrachtgever is dus gekoppeld aan het veld OpdrachtgeverID, bevat 7 kolommen waarvan kolom 1 wordt gebruikt om op te slaan.

De tekstvakken die gebruik maken van de keuzelijst, waren ook niet goed ingesteld.

Zoals gezegd, je formule txtOpdrachtgever=cboOpdrachtgever.Column(1).Value bevat ook een paar foutjes. Om te beginnen: je zet een formule in de Eigenschappen van een tekstveld. Je hoeft dus nooit te verwijzen naar een tekstveld. Verder hoef je alleen maar te verwijzen naar de kolom; de waarde wordt dan vanzelf opgehaald.
Op het teksvak txtOpdrachtgever zet je dus deze formule:

=cboOpdrachtgever.Column(1)

Zie ook weer het plaatje voor de overige instellingen.
Hopelijk kan je weer een stukkie verder...
 

Bijlagen

  • Relatie.jpg
    Relatie.jpg
    55,5 KB · Weergaven: 88
  • Instellingen Combobox.jpg
    Instellingen Combobox.jpg
    101,5 KB · Weergaven: 85
Ik heb alvast mijn zonnebril opgezet :cool:

Ik heb hem bijna enkel de keuzevelden worden nog niet opgepikt, Ik heb alles aangepast zoals je aangeef (of ik zie één klein dingentje over het hoofd).

Ik ben blij dat je het niet uitvoer maar uitleg.
Door het zelf uitvoeren zie ik ook wat er gebeurt, daar leer een mens van.
 

Bijlagen

Bestel je ticket maar vast: na deze kleine aanpassing ben je een heel eind!

cboOpdrachtgever.Column(2) vervangen in

=cboOpdrachtgever.Column(2)
 
Je klopt, logisch!

Maar weer krijg ik bij elke bon het zelfde adres als ik ga bladeren door het formulier, dit was bij de bestaande.

Deze bestaande formulieren heb ik eruit gegooit. Als ik een nieuw formulier invoeren en wil sluiten krijg ik de foutmelding "Kan geen record toevoegen of wijzigen omdat een gerelateerde record is vereist in de tabel tbl_opdrechtgevers.

Als dit opgelost is en ik kan bij elke bon een ander ander adres invoeren ben ik blij.
 

Bijlagen

Laatst bewerkt:
Ik heb er toch maar even een voorbeeldje bijgedaan.... Kun je zien hoe hij zou moeten!
(Is ook leerzaam ;) )
 

Bijlagen

Oke,

Ik ga alles verglijken heb eerst gekeken naar je mooie knop maar dat kan het niet zijn denk ik.

Vanavond ga ik eens kijken wat je anders heb gedaan :)
 
Tis niet de knop; die sluit alleen het formulier af. :D (kun je met een wizard maken, is niks bijzonders...)
 
Inmiddels heb ik een zonnebril opstaan:cool: en heb ik zonnebrandcrame op :D

Het is dus gelukt (zie bijlage).

Wat ik eruit gehaald heb bij jou (wat jij gedaan heb):
Je had het keuzelijstje teruggebracht naar een tekstvak.
Vervolgens heb je een nieuw keuzelijst gemaakt, waarbij je kan kiezen op naam (afhankelijke kolom 1). Een paar veldnamen en besturingselementen aanpassen bij deze 2. dat is alles.

Bedankt voor je hulp Octafish :cool::thumb:
Ik zal je niet de hemel in prijzen, maar je ben geweldig :o
 

Bijlagen

Laatst bewerkt:
Ondanks dat ik zei dat dit probleem was opgelost is hij deels terug gekomen.
Ik wil hier dus nog op reageren, het is nog niet zo lang geleden en een nieuw topic vindt ik dan zonden (anders is als deze topic maanden oud zou zijn).

In de bijlage vindt je mijn bestand, hij werkt nu wel alleen als je nu een werkbon wil invoeren geeft hij 2x het opdrachtgevers ID, via het keuze menu kun je kiezen maar ik wil dat hij dan de naam invult, opdrachtID staat er al naast.

Vreemd genoeg is dat als je gewoon doorwerk het rapport wel goed wordt afgedrukt.

Wie wil mij nog heel even hulp bieden..

(foutmelding over introductiescherm klopt, deze heb ik er even uitgehaald).
 

Bijlagen

Laatst bewerkt:
Zo vreemd is dat niet ;) Je keuzelijst bestaat uit een aantal velden, die allemaal zichtbaar zijn in de keuzelijst. Standaard gebruikt Access de eerste kolom als waarde om op te slaan, of verder te gebruiken in selecties. Deze afhankelijkheid stel je in op het tabblad <Gegevens> van Eigenschappen.
Met de kolominstellingen bepaal je hoe je keuzelijst er uit ziet, en wat als waarde uit je veldenlijst wordt getoond. Als je alle kolommen laat zien, zal de eerste kolom als gekozen waarde worden getoond.
Je zult dus bij <Kolombreedten> op het tabblad Opmaak de waarden moeten veranderen, bijvoorbeeld in: 0cm;3cm;4cm;2cm;0cm;0cm
Zoals je ziet, begint de reeks met 0cm. Dit betekent, dat de eerste kolom niet wordt getoond. Dat houdt dus automatisch in, dat de tweede kolom nu als eerste kolom zichtbaar is. En dat is precies wat je wilt.
Een andere mogelijkheid is, om de kolommen te verwisselen in de onderliggende query, dus de kolom Opdrachtgever vooraan te zetten, en de kolom OpdrachtgeverID bijvoorbeeld achteraan. In dat geval moet je ook de optie <Afhankelijke kolom> veranderen, want je wilt natuurlijk nog steeds het veld OpdrachtgeverID opslaan in de tabel.
Hoop dat het een beetje duidelijker is...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan