Cannot add records(s); join key of table 'tbl_To DO' not in recordset.

Status
Niet open voor verdere reacties.

Wonkjz

Gebruiker
Lid geworden
1 mrt 2012
Berichten
42
Dag,

Ik loop tegen een probleempje aan in mijn Access 2007 database.
Een tijd geleden heb ik een macro aangemaakt, die via 2 textboxen automatisch de datum en tijd neerzetten wanneer er iets gewijzigd wordt bij "Notes" in de database. Daarin kan men aantekeningen (notes) noteren, en zo zien wanneer deze voor het laatst is gewijzigd.

Nu is het zo dat als ik een nieuwe klant aanmaak in de database, en in het tekstvak bij "Notes" iets typ, dat er gelijk de melding verschijnt:

Cannot add records(s); join key of table 'tbl_To DO' not in recordset.

Als ik dan op OK klik, dan komt er een scherm te staan "Action Failed". Daaronder de macro naam (die ik toen heb aangemaakt), Condition: True, Action name: SetValue en Arguments: [Gewijzigd op]; Date(). Error number 2950.

Error .jpg

Ligt dit aan de relaties tussen de tabellen, of aan de macro zelf?

Mocht ik nog niet genoeg informatie hebben gegeven, dan doe ik dit graag alsnog.

Hopelijk kan iemand mij hiermee helpen.

Alvast bedankt!

Met vriendelijke groet,
 
Je macro wordt blijkbaar op het Notes veld uitgevoerd als je iets wijzigt. Maak je een nieuw record aan, dan bestaat dat pas als het is opgeslagen. Tot die tijd valt er dus ook niks te wijzigen. Ergo: je macro geeft een foutmelding.
Bouw een check in of je in een nieuw record staat of niet. In het eerste geval moet de macro uiteraard niet worden uitgevoerd.
 
Bedankt voor je reactie OctaFish.

Het is zo dat ik in records die al in de database staan, ik in het veld "Notes" wel dingen kan wijzigen, en de datum en tijd zich automatisch aanpast. Het probleem is alleen bij een nieuw record in het veld Notes.

Wat je schrijft over dat de macro wordt uitgevoerd als ik iets wijzig op het Notes veld, en dat bij een nieuw record dat pas bestaat als het is opgeslagen, dat snap ik nu.

Moet ik die check-in binnen de macro aanmaken? Zou je het misschien iets specifieker kunnen uitleggen wat je precies bedoeld?

Alvast ontzettend bedankt!

Met vriendelijke groet,
 
Je kunt in macro's voorwaarden vastleggen wanneer een macro moet worden uitgevoerd. In jouw geval is die check dus het controleren van de status van het huidige record. Ik loop zelf met een enorme boog om macro's heen, want ik vind het een waardeloze manier van werken. Ik zou de oplossing heel simpel kunnen maken in VBA, maar dan moet je dus van het macro principe afstappen. Wellicht dat de Help je kan uitleggen hoe je voorwaarden moet maken in macro's, of iemand anders.
 
Beste OctaFish,

Ik snap prima wat je bedoeld, alleen zou ik zo niet weten hoe ik dat moet instellen bij de voorwaarde (hetgeen wat ik moet invullen).
Is daar een standaard voor om de status van het record te checken?

Hoe zou het dan in VBA kunnen dan? Aangezien je de oplossing heel simpel zou kunnen maken met VBA.. ;)

Hier de afbeelding van de macro: macro.jpg

Alvast bedankt voor de hulp!

Met vriendelijke groet,
 
Laatst bewerkt:
Dat ziet er dan zo uit:
Code:
Private Sub Opmerking_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord = False Then
        Me.Datum_bijgewerkt = Now()
        Me.Tijd_Bijgewerkt = Now()
    End If
End Sub
Deze code staat bij de gebeurtenis <Voor bijwerken> van het memoveld. Of hij bij jou ook werkt weet ik uiteraard niet, maar ik kan zelfs in een nieuw record met een kortere variant uit de voeten:
Code:
Private Sub Opmerking_BeforeUpdate(Cancel As Integer)
        Me.Datum_bijgewerkt = Now()
        Me.Tijd_Bijgewerkt = Now()
        Me.KlantID.SetFocus
End Sub
Deze doet het ook al bij een nieuw record. Op zich natuurlijk wel een beetje logisch; als je een nieuw record aan het invoeren bent kun je nooit in één keer alles tegelijk invullen. Vermoedelijk heb je het Memoveld als laatste veld staan, en zodra je daar dan uitgaat, verplaatst Access de focus naar een volgend (i.c. nieuw) record. En omdat je nog niet alle verplichte velden hebt ingevuld in je huidige record, krijg je een foutmelding. Door de focus naar een vorig veld in het formulier te verplaatsen, voorkom je dat je weer een nieuw record aanmaakt.
Maar kijk eens hoe simpel VBA code eruit ziet in vergelijking met een macro... Bovendien ben ik van mening dat je vroeg of laat tegen de beperkingen van macro's gaat aanlopen, en dan kun je alsnog overstappen op VBA, met een heel leerproces voor de boeg. Mij lijkt me dat zonde van de tijd; je kunt beter de macro stap overslaan en je gelijk in VBA verdiepen.
 
Het is dus de bedoeling dat ik die macro verwijder? Moet ik de code die jij hebt geschreven bij de gebeurtenis van het "Notes" veld zetten?
Hoe zit het dan met de tekstboxen, moeten die geen "link" krijgen daarheen? Of gebeurd dat automatisch door dit stukje code:
Code:
 If Me.NewRecord = False Then
        Me.Datum_bijgewerkt = Now()
        Me.Tijd_Bijgewerkt = Now()
    End If
?

Nogmaals ontzettend bedankt!

Met vriendelijke groet,
 
De code heb ik gemaakt bij een opmerkingenveld met de naam [Opmerkingen]. Als je het memoveld selecteert, en je bekijkt de Eigenschappen, dan zie je op het tabblad Gebeurtenissen een aantal actiegebeurtenissen waarop je iets kunt laten plaatsvinden. Ik heb in dit voorbeeld de gebeurtenis <Voor bijwerken> genomen. Als je die regel selecteert, en op de knop met de drie puntjes klikt, kun je een Gebeurtenisprocedure maken. Je kunt, zoals je vermoedelijk al weet, daar dus ook macro's aan hangen. Kies Gebeurtenisprocedure :)
Vervolgens krijg je dan twee regels te zien:
Code:
Private Sub Opmerking_BeforeUpdate(Cancel As Integer)
End Sub
Daar tussen staan dan de regels die je wilt laten uitvoeren, zoals inderdaad het vullen van de twee tekstvelden met de huidige datum en tijd.
Overigens kun je daar net zo goed één veld voor nemen. Met Now() sla je zowel de datum als de tijd op. Scheelt weer een tekstvak.
Als je begint met If Me.NewRecord = False Then controleer je of het formulier bezig is met een nieuw record of niet. Is de status Me.NewRecord TRUE, dan zit je in een nieuw record. Met FALSE dus niet. En in dat geval voer je de volgende coderegels uit.

Bij jou heten de velden uiteraard anders, dus die namen kun je niet zomaar overnemen. Met het typen van ME. (let op de punt!) kun je met de eerstvolgende letter objecten uit je formulier opzoeken. In mijn voorbeeld heb ik twee tekstvakken gevuld: [Datum_bijgewerkt] en [Tijd_bijgewerkt]. Zelf zou ik er dus één gebruiken, want wat is het nut om in twee velden hetzelfde (de formule =NOW() ) te zetten?
Elke IF moet je afsluiten met END IF, anders werkt het niet. En dat is dus de voorlaatste regel in mijn eerste voorbeeld.
 
Ik heb nu de macro verwijderd en ben nu bezig met het toevoegen van de code jij hebt geschreven.

In tabel "Main" maak ik dus een veld aan met DATUM, om daar de datum in op te slaan. Moet ik deze dan als default value de functie NOW() geven?
Ik geef het tekstveld een naam, die ik daarna in de code aanroep met de ME.?

Sorry voor het ongemak, maar ik zie ff door de bomen het bos niet meer..

Krijg nu ook steeds een melding dat frm_main een compile error bevat.

Bedankt voor de hulp.

Met vriendelijke groet,
 
Een standaardwaarde gebruik je voor een veld dat bij het maken van een nieuw record gevuld moet worden met die waarde. Jij wilt wijzigingen bijhouden, en in mijn optiek vul je dan het veld Datum_Gewijzigd niet in. Je maakt een nieuw record, je wijzigt hem pas later. Dus een Default value heeft dan geen zin.
Om te zien wat je nu fout doet, zou ik de code moeten zien. Maar door ME. te typen, gevolgd door de letter(s) da, zou je het veld Datum moeten zien in de lijst, en die selecteer je met de pijltjestoetsen. Heb je 'm geselecteerd, dan kun je daarna = NOW() typen om de opdracht die je wilt maken af te maken. Access maakt de syntax netjes af, als het goed is.
 
De code die ik nu heb:

Code:
Private Sub Notes_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord = False Then
        Me.Datum_bijgewerkt = Now()
    End If
End Sub

Ik krijg hierbij een run-time error '438':
Object doesn't support this property or method.

Wat doe ik fout?

Met vriendelijke groet,
 
Heb je de macro nog ergens achter staan? Het kan zijn dat die ook nog afgevuurd wordt op een gebeurtenis. Aan de code mankeert verder niks. Op welke regel krijg je de foutmelding?
 
Op deze regel krijg ik de foutmelding:
Code:
Me.Datum_bijgewerkt = Now()

Ik heb de macro volgens mij helemaal verwijderd..
 
Is Datum_bijgewerkt ook de naam van jouw tekstveld? Want zo niet, dan loopt hij daar inderdaad wel fout op.
 
Ah, daar zat het probleempje van de foutmelding. Ik heb nu het event op "Before update" staan, maar komt de datum + tijd alleen in de tekstbox te staan als ik daarin klik. Dit zou moeten gebeuren als ik iets typ in het veld Notes of iets daarin verander. Moet dit event niet bij "On change" staan?

Met vriendelijke groet,

[EDIT]

Hmm, dat schijnt ook niet helemaal goed te werken als ik het event op "on change" zet.
Wel werkt het dat als ik iets typ in het veld Notes dat de datum en tijd verschijnen. Maar als ik daarna door de records (klanten) heen blader, dan staat diezelfde datum en tijd in elk record..
 
Laatst bewerkt:
Wanneer je het datum/tijd veld laat bijwerken moet je natuurlijk zelf weten. De vraag: wanneer wordt een record bewerkt? is redelijk arbitrair. Is dat als je begint te typen in een tekstveld, of is dat als je klaar bent met typen? Your guess is as good as mine... Ik zou mij kunnen voorstellen dat je het datumveld bijwerkt op het moment dat je het record sluit of opslaat, door het formulier te sluiten of door naar een ander record te gaan. Dus na de laatste handeling die je verricht. Of bij de eerste. Maar zeker niet halverwege :)

Je laatste probleem is vermoedelijk doordat je het datumveld niet hebt gekoppeld aan een tabelveld. In dat geval is het een niet-afhankelijk veld, dat bij alle records hetzelfde laat zien. Maar je slaat de datum/tijd dan ook niet op nu. En dat was toch de bedoeling?
 
Ik heb nu de code bij "After update" gezet, dus als ik dan naar een ander record ga, hetgeen de datum en tijd opslaat.

Het moet inderdaad zo zijn dat de datum per record verschillend is, en dus niet overal hetzelfde.. Komt dat doordat ik die koppeling niet heb gemaakt tussen het datumveld en tabelveld? Wat bedoel je precies met datum opslaan. Als ik wat wijzigingen aanbreng in de database (en dus de tijd verander per record), de database afsluit en morgen weer open, dan moeten de tijden van de wijzigingen nog aanwezig zijn..

Met vriendelijke groet,
 
Precies wat ik zeg: je hebt het datumveld nu niet gekoppeld aan een tabelveld. En dus wordt de waarde die je er netjes inzet, niet opgeslagen. Dat gebeurt uiteraard wel als je het tekstveld alsnog koppelt via <Besturingselementbron> aan een veld in je tabel. Dan ben je ook gelijk af van het feit dat alle records dezelfde datum/tijd lijken te hebben.
 
Dus als ik het goed begrijp moet ik bij de eigenschappen van mijn tekstveld (waar de datum en tijd komen te staan), bij "Control source" (besturingselementbron) uit de tabel "Main" dat tekstveld toevoegen?

Ontzettend bedankt voor de uitleg en informatie!!

Met vriendelijke groet,
 
Je zegt het precies verkeerd om, maar volgens mij snap je 'm wel :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan