waardes op invulformulier automatisch laten invullen

Status
Niet open voor verdere reacties.

Artemiss

Gebruiker
Lid geworden
13 feb 2009
Berichten
130
Beste Accessers,

Ik heb een database met een formulier waarin nieuwe orders kunnen worden vastgelegd, welke worden vastgelegd in de projectentabel(onderliggend object). In dit formulier wordt als eerste een klant gekozen en hierna worden nog een aantal klantgerelateerde gegevens ingevoerd (BTW, Bedrijf, Branche). Voor bestaande klanten zijn deze gegevens echter al bekend en in deze gevallen wil ik deze gegevens automatisch in laten vullen. In vorige versies van Access is heb ik hetzelfde wel eens voor elkaar gekregen en volgens mij moet dit vrij simpel te realiseren zijn, maar ik kom er maar niet uit. Het punt is dat de gegevens niet beschikbaar zijn in het formulier en het me ook maar niet lukt om ze op ��n of andere manier wel beschikbaar te krijgen. Ik ben aan het klooien geweest met WaardeInstellen, met standaardwaardes en dan SchermBijwerken/GegevensVernieuwen/RecordVernieuwen.

Ik zou ervoor kunnen kiezen om de velden gewoon weg te laten in het formulier en ze bij het afsluiten middels een bijwerkquery toe te voegen, maar in dat geval moet ik een hele nieuwe procedure maken indien een nieuwe klant wordt ingevoerd, terwijl ik de mensen die met mijn database werken niet blij maak als ze ook nog eens nieuwe klanten in moeten vullen(wat ze nu dus eigenlijk stiekum wel doen) en ik ze wel blij maak als ze in de meest voorkomende gevallen de waardes gewoon cadeau geef. Vandaar dus mijn voorkeur en ook omdat ik weet dat het gewoon moet kunnnen.

Kan iemand alsjeblieft helpen...
 
Hoi Frauke,

Wat ik meestal doe is een keuzelijst maken voor het KlantID, en in die keuzelijst de relevante klantgegevens toevoegen aan de rijbron. Vervolgens lees ik met tekstvakken de betreffende kolommen uit de keuzelijst uit, zodat de klantgegevens zichtbaar zijn op het formulier. Dit heeft wat mij betreft als voordeel dat de klantgegevens niuet kunnnen worden veranderd. Vul je een nieuwe klant in (één die dus niet in de keuzelijst staat) dan open je met de gebeurtenis <Bij niet in lijst> het klantenformulier, of voeg je de klant rechtstreeks toe met een toevoegquery. Via het formulier heb je meer mogelijkheden, omdat je dan ook de overige (noodzakelijke) klantgegevens kunt laten invullen. Bij sluiten van het klantenformulier staat de klant in de lijst, en wordt je order formulier weer netjes gevuld.
 
Ik zag dat je een vergelijkbare oplossing al had gevonden in een andere draad.... Die sluit inderdaad prima aan op mijn oplossing hierboven. Omdat die gesloten is, zal ik daar verder geen antwoord in geven. In de tekstvakken zet je bij het Besturingselementbron dan deze formule:

=Me.cboKlanten.Column(1)
=Me.cboKlanten.Column(2)

En zo door. De telling van Column begint bij 0 (is eerste kolom) dus je moet er 1 bij optellen om de feitenlijke kolom te vinden. Meestal is de eerste kolom (Column(0) dus) de kolom met het ID veld, dus die heb je toch al niet nodig.
 
Hoi Michel,

Het klopt inderdaad dat ik min of meer een oplossing had gevonden in de andere vraag, maar dat was meer omdat ik dat ergens anders zou kunnen gebruiken. Hier werkt de oplossing volgens mij toch niet helemaal, want als ik dit moet invullen in de Besturingselementbron dan word de waarde dus vervolgens niet opgenomen in de projectentabel, toch?
Kan ik de gegeven formules ook gebruiken als functie bij WaardeInstellen?

Volgens mij heb ik het eerder al eens gedaan door een standaardwaarde op te geven voor de velden en dan na het wijzigen van de klant het formulier bij te werken, maar dat was in een eerdere versie van Access en dat lukt me nu dus niet. Ik heb ook geen toegang meer tot de databases waar ik dat in gedaan heb, omdat ik ondertussen ergens anders werk.
 
Laatst bewerkt:
Het lijkt mij (ik zou dat althans niet willen) niet logisch om de opgehaalde gegevens ook nog eens op te gaan slaan, dat is dataverdubbeling waar je toch niet op zit te wachten. Dus het maakt niet uit dat je de tekstvelden niet kunt koppelen aan een tabelveld. Als je in je projectentabel het KlantID opslaat, heb je namelijk een verwijzing naar je klantgegevens.
 
Tja, ik had ook eigenlijk geen ander antwoord verwacht, maar waar ik eigenlijk de hele tijd mee worstel is dat ik bepaalde gegevens in een overzicht wil laten zien(waaronder dus die klantgegevens), maar ook wil dat de gebruikers in datzelfde overzicht dingen kunnen aanpassen en aanvullen.

Ik zou in sommige gevallen de Me.cbo kunnen gebruiken, denk ik, ik moet het nog proberen, dus dat ga ik maar eens doen...
 
Als je in de bron van je formulier (zal een query zijn, neem ik aan) de betreffende velden uit de tabel Klanten opneemt, en de keuzelijst gebruikt om de KlantID op te zoeken, dan ben je er volgens mij ook. In een query waarbij je het KlantID gebruikt van de tabel Orders, en de Klantgegevens uit de tabel Klanten, zoekt Access gelijk de juiste klantgegevens op. Die zijn dan ook, als je dat wilt, te muteren. Dit principe werkt niet als je het KlantID uit de tabel Klanten gebruikt. De query is dan namelijk niet bewerkbaar. Dus het kan ook heel simpel opgelost worden.
 
Dan doe ik toch duidelijk iets niet goed, want bij mij is een query nooit bewerkbaar. De bron van mijn formulier is dus ook geen query, maar een tabel. Maar als dit op één of andere manier wel mogelijk is, dan kan ik niet wachten te horen hoe...

Ik heb het net al even geprobeerd, maar als ik de bron van het formulier aanpas, data entry op yes zet en daarna een nieuw record probeer toe te voegen, krijg ik onderin de statusbalk verschillende meldingen, zoals "Form is read-only" of "Recordset is not updateable".
Ik heb ook geprobeerd of het hielp als ik de relatie tussen de twee tabellen vastleg in de relationships, maar ook dat maakt geen verschil.

Hoe krijg ik het wel voor elkaar?

Ik heb ook even de Me.cbo geprobeerd, maar zodra ik dat invoer, verandert hij dit naar =[Me].[cboKlant].[Column](1). Ik geloof niet dat hij daar nog iets mee kan anders dan #Name?
En als ik de = weglaat, haalt hij het stukje .Column(1) ervan af en dan resulteert het weer in #Name?
 
Laatst bewerkt:
Het principe van een "updateable Recordset" is eigenlijk heel simpel. Een tabel is, tenzij je het formulier anders instelt, altijd bewerkbaar; je kunt dus gegevens muteren, toevoegen, verwijderen etc. Hetzelfde geldt voor een formulier dat je op een tabel baseert: bij een formulier met normale instellingen, kun je alles doen met dat formulier. Met één tabel als bron voor je formulier zorg je er uiteraard voor dat op zijn minst alle verplichte velden uit die tabel worden ingevuld, anders kun je het formulier/record niet opslaan. In dit geval is de onderliggende tabel dus het doelobject van het formulier.

Als je extra adresgegevens wilt laten zien (of kunnen bewerken) dan moet je een query gebruiken als bron. In die query voeg je dan de extra tabel(len) toe, en haal je de extra velden uit die toegevoegde tabellen. Daarbij is het van belang dat de extra tabellen te koppelen zijn aan je brontabel. Dus als je Klantgegevens toevoegt aan een Orders query, dan koppel je het veld [Klanten].[KlantID] aan [Orders].[KlantID]. Heb je nog andere tabellen, dan geldt daar hetzelfde voor.

De crux van het verhaal zit 'm in een regeltje dat ik hierboven heb neergezet: de vraag namelijk wat het doelobject is van je formulier. Dat verandert niet als je extra tabellen toevoegt. Je wilt nog steeds records kunnen toevoegen aan de tabel [Orders]. Dat betekent dus ook dat de eisen voor het formulier niet veranderen: alle verplichte velden uit de tabel [Orders] moeten nog steeds gebruikt worden op het formulier. Dat betekent dus, dat het formulierveld [KlantID] nog steeds gekoppeld moet zijn aan het tabelveld [Orders].[KlantID]. En daar gaan de meeste mensen dus de fout in: ze pakken niet het veld [Orders].[KlantID], maar het veld [Klanten].[KlantID]. Of ze gebruiken het * om alle velden uit de twee tabellen te selecteren, met als resultaat dat je twee velden KlantID hebt. En met het idee dat het sleutelveld [KlantID] uit [Klanten] een veel beter veld is dan [KlantID] uit [Orders], wordt het veld uit de tabel [Klanten] gehaald.

Wat is echter het resultaat als je dat doet? Je slaat het [KlantID] niet meer op in [Orders], maar in de tabel [Klanten]! En dat is, behalve niet handig, want je hebt dan geen KlantID in Orders opgeslagen, ook nog eens verboden, omdat KlantID een sleutelveld is. Dus je gaat twee keer de fout in: het KlantID wordt niet meer opgeslagen in Orders, en je probeert het veld een tweede keer op te slaan in Klanten! En dat levert dus het bekende probleem op, dat je recordset niet meer updatable is.

Conclusie: als je een query wilt maken die je kan bijwerken, neem dan alle (verplichte) velden op uit de doeltabel, koppel vervolgens de extra tabellen, en voeg dan de extra velden toe die je wilt zien. De query zal dan altijd bewerkbaar zijn, en je formulier ook.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan