Kopier record in bestaande tabel

Status
Niet open voor verdere reacties.

BasHD

Gebruiker
Lid geworden
2 dec 2008
Berichten
99
Hallo,

Ik heb een formulier gekoppeld aan een tabel. Via het formulier vul je de tabel dus. Nu komt het soms voor dat bij het invoeren bijna alles hetzelfde is als het vorige record op 2 velden na.

Nu had ik het volgende gemaakt:


Code:
Private Sub Knop51_Click()
On Error GoTo Err_Knop51_Click


    DoCmd.GoToRecord , , acLast
    
    DoCmd.RunSQL "INSERT INTO T_INVOER_2006  SELECT * FROM T_INVOER_2006 ORDER BY Id DESC LIMIT 1;"


Exit_Knop51_Click:
    Exit Sub

Err_Knop51_Click:
    MsgBox Err.Description
    Resume Exit_Knop51_Click
    
End Sub

Het gevolg is :

De component ORDER BY bevat een syntaxisfout

Wat ik wil is dat de laatste record in de tabel gekopieerd wordt.
Id is een veld wat een autovolgnummer bevat.

Ik zou kunnen verklaren dat ORDER BY niet werkt om dat je 1 enkele waarde niet kunt rangschikken. Misschien moet ik iets met een code LAst doen of iets dergelijks.

Wie kan mij tips geven?

Gr

Bas
 
Laatst bewerkt door een moderator:
Je moet de SQL beperken tot 1 record.

DoCmd.RunSQL "SELECT TOP 1 * FROM T_INVOER_2006 INSERT INTO T_INVOER_2006 ORDER BY Id DESC;"
 
Laatst bewerkt:
Hallo Octafish,

Had nu pas weer tijd deze week om te programeren. Als ik jou idee toepas krijg ik de melding dat de component FROM een syntaxisfout bevat.

Wat kan dat zijn?

OK heb het al gezien:

DoCmd.RunSQL "INSERT INTO T_INVOER_2006 SELECT TOP 1 * FROM T_INVOER_2006 ORDER BY Id DESC;"

Geeft meer beeld

Resulteert echter in de volgende melding:

Access heeft 0 veld(en) op Null ingesteld ten gevolge van een fout bij het converteren van het type en het volgende is niet toegevoegd: 1 record(s) aan de tabel ten gevolge van sleutelconflicten, 0 records ten gevolge van vergerendelingsconflicten, 0 record(s) ten gevolge van het strijdig zijn met de validatieregels. Wilt u actiequery toch uitvoeren?
Ja voor negeren en query uitvoeren en nee voor stoppen en help voor help.

Ik kies voor Ja en er wordt niets toegevoegd. Wat kan hier fout gaan. De autonummerng soms?





Vr gr

Bas
 
Laatst bewerkt:
Je zit in dezelfde tabel in te voegen waaruit je ook een selectie maakt. Ik vermoed dat de tabel gelockt is op het moment dat je een record probeert toe te voegen (vanwege de selectie). Je zou het commando dan ook beter kunnen vervangen door een recordset opdracht.
Is een beetje lastig uit te leggen, dus kun je een voorbeeldje maken?
 
Sorry dat ik wat laat reageer. Ik was een paar dagen ergens in Oost Europa waar de verbindingen met internet nou niet zo geweldig zijn.

Ik zal wat gegevens van de database geven. Mogelijk kun je me dan dat recordset gebeuren uitleggen.

De tabel waar het omgaat wordt geopend in een formulier. In het formulier zit de knop die de laatste record kopiert. De naam van de tabel is : T_INVOER_2006

C:\Documents and Settings\Hans\Mijn documenten\Bas\D & A Bassa\Acces\Bas 2005
is de locatie van de database op mijn PC. Wel erg lang maar goed.

Er zit inderdaad een primair sleutel veld in. De naam van het veld is Id en is een autonummering. Veldlengte lange integer. Schakel ik dit veld uit en maak er numeriek van dan wordt de opdracht

DoCmd.RunSQL "INSERT INTO T_INVOER_2006 SELECT * FROM T_INVOER_2006 ORDER BY Id DESC LIMIT 1;"

goed uitgevoerd. Het enige is dat hij het nieuwe record 5 records terug plaats in de tabel. Waarom dit is ben ik nog aan het bekijken.

Hoop dat je er wat mee kan. Zo niet laat weten welke info je nog meer nodig hebt.

gr

Bas
 
Op de website van Allen Brown zie je een voorbeeld van hoe je een record kunt kopieëren op een formulier. Hij doet dat in het voorbeeld zelfs met een subformulier, maar die code kun je er probleemloos uithalen. Ik zou zeggen: bestudeer het voorbeeld!

Andere tip: je wilt geloof ik het laatste record dupliceren. Dat kan dus wel, door een selectie te maken met de knop Totalen, en aflopend te sorteren op het Autonummerveld. Je beperkt de selectie tot één record, want je wilt er maar één toevoegen.
Waar het nu fout gaat, is dat je alle velden selecteert met het *-teken. Daarmee selecteer je ook het Autonummerveld, en dat kun je nu eenmaal niet dupliceren, want dat wordt automatisch aangemaakt. Je zult dus alle velden handmatig moeten toevoegen, behalve het ID veld. Dan gaat het goed, want daar kun je dan een Toevoegquery van maken. Tenzij er uiteraard een gecompliceerde sleutel in de tabel zit, met andere dubbele waarden, die een conflict opleveren.
 
Hallo OctaFish,

DoCmd.RunSQL "INSERT INTO T_INVOER_2006 (FACTNUMMER) SELECT TOP 1 FACTNUMMER FROM T_INVOER_2006 ORDER BY Id DESC;"

Dit werkt goed.

Code:
DoCmd.RunSQL "INSERT INTO T_INVOER_2006 (FACTNUMMER, BEDRAGFACTUURTOTAAL EX BTW) SELECT TOP 1 FACTNUMMER, BEDRAGFACTUURTOTAAL EX BTW FROM T_INVOER_2006  ORDER BY Id DESC;"
Deze niet. Syntaxisfout. Wat schrijf ik niet goed?

Een is tekst en ander is een nummeriek veld.

Gr

Bas
 
Laatst bewerkt door een moderator:
Code:
DoCmd.RunSQL "INSERT INTO T_INVOER_2006 (FACTNUMMER, [B][COLOR="blue"][[/COLOR][/B]BEDRAGFACTUURTOTAAL EX BTW[B][COLOR="blue"]][/COLOR][/B]) SELECT TOP 1 FACTNUMMER, [B][COLOR="blue"][[/COLOR][/B]BEDRAGFACTUURTOTAAL EX BTW[B][COLOR="Blue"]][/COLOR][/B] FROM T_INVOER_2006 ORDER BY Id DESC;"

schat ik...
En welke is er tekst? want daar moeten ' omheen.
 
Laatst bewerkt door een moderator:
@Tardis:
Zo'n opmerking slaat natuurlijk nergens op, want je mag best tekst tussen quootjes zetten bij een tabelmaakquery. Je geeft daarmee expliciet aan dat je een tekstveld wilt, ongeacht van de inhoud van het veld. Of weet je een betere methode om (bijvoorbeeld) telefoonnummers als tekst op te slaan?
 
@Tardis:
Zo'n opmerking slaat natuurlijk nergens op, want je mag best tekst tussen quootjes zetten bij een tabelmaakquery. Je geeft daarmee expliciet aan dat je een tekstveld wilt, ongeacht van de inhoud van het veld. Of weet je een betere methode om (bijvoorbeeld) telefoonnummers als tekst op te slaan?

@Michel

Als ik de query bekijk en de quootjes "[....]" dan geef je daar geen tekst mee aan maar maak de expliciet duidelijk dat je hier de naam van een rubriek bedoeld.
Je gebruikt deze "[ ]" als je in de naam van een rubriek spaties hebt gebruikt.

Wim
 
@Wim:
In de aanpassing die ik heb voorgesteld, heb ik rechte haken ([]) gezet om de veldnamen waar een spatie in zit. Zoals je weet, is dat een NoNo in databases, zeker als je via VBA queries maakt. Eigenlijk jammer dat Access veldnamen probleemloos accepteert met een spatie, want het is niet echt een standaard... Je moet dan ook naar veldnamen met spaties verwijzen door er rechte haken om te zetten.
De opmerking over tekstvelden heb ik geplaatst omdat de vraagsteller aangeeft dat hij met een tekstveld en een numeriek veld werkt. Wil je tekst of getal als tekst in een tabel zetten, dan moeten er quootjes omheen.
Ben trouwens nog wel benieuwd of het probleem inmiddels is opgelost...
 
OctaFish;3022759Ben trouwens nog wel benieuwd of het probleem inmiddels is opgelost...[/QUOTE zei:
Zal hem wel even een privémailtje sturen. Dat is het voordeel als je verenigignslid bent.

Groet Wim
 
@Tardis:
Zo'n opmerking slaat natuurlijk nergens op, want je mag best tekst tussen quootjes zetten bij een tabelmaakquery. Je geeft daarmee expliciet aan dat je een tekstveld wilt, ongeacht van de inhoud van het veld. Of weet je een betere methode om (bijvoorbeeld) telefoonnummers als tekst op te slaan?

Je zit er naast.
Waarom je op deze wijze meent te moeten reageren is mij een raadsel.
Enige dat je bereikt is dat je jezelf belachelijk maakt.

Tardis
 
@Tardis:
Er zit blijkbaar niks anders op dan mensen met een klein snappie met een praktjkvoorbeeld dingen duidelijk te maken:
Probeer dit maar eens uit:

SELECT 015 AS Expr1, '015' AS Expr2 INTO tmp;

En zeg dan nog eens met droge ogen dat het niet nodig is om quootjes om getallen te zetten als je tekst wilt...
 
@Tardis en @Michel

Ik ga me maar afmelden op deze post.
Ik vindt dit geen discussie om hier te voeren.
Wordt dan alle twee lid en stuur elkaar dan een mailtje.

Wim
 
Hallo Michel,

Je haken [rechte of blokhaken] werken wel in ieder geval. Hartsikke bedankt. Omdat de laatst ingevoegde record die via de RunSQL werd toegevoegd niet direct getoond wordt in het formulier laat ik het formulier sluiten, openen en de laatste rij opzoeken.

Of dit de meest nette manier van schrijven is weet ik niet maar de knop werkt precies zoals ik het hebben wil.

WimenBeer : het maakt mij niet uit ik ben eruit!


Private Sub Knop51_Click()
On Error GoTo Err_Knop51_Click

Dim stDocName As String
Dim stLinkCriteria As String

DoCmd.GoToRecord , , acLast

'DoCmd.RunSQL "INSERT INTO T_INVOER_2006 SELECT * FROM T_INVOER_2006 ORDER BY Id DESC LIMIT 1;"
'DoCmd.RunSQL "INSERT INTO T_INVOER_2006 SELECT TOP 1 * FROM T_INVOER_2006 ORDER BY Id DESC;"
DoCmd.RunSQL "INSERT INTO T_INVOER_2006 (FACTNUMMER, [BEDRAGFACTUURTOTAAL EX BTW], [NAAM LEV]) SELECT TOP 1 FACTNUMMER, [BEDRAGFACTUURTOTAAL EX BTW], [NAAM LEV] FROM T_INVOER_2006 ORDER BY Id DESC;"

DoCmd.Close


stDocName = "F_INVOER_2006"
DoCmd.OpenForm stDocName, , , stLinkCriteria

DoCmd.GoToRecord , , acLast

Exit_Knop51_Click:
Exit Sub

Err_Knop51_Click:
MsgBox Err.Description
Resume Exit_Knop51_Click

End Sub

Gr Bas
 
Je kunt vermoedelijk het formulier ook opnieuw laden met
Me.ReQuery
Me.Refresh

Dan hoef je het niet te sluiten en opnieuw te laden.
 
He Michel,

Dat doet ie sneller. Heb wel commando DoCmd.GoToRecord , , acLast
nog nodig om naar nieuwe en dus laatste record te gaan.

Werkt duidelijk sneller.

Gr Bas
 
Dat laatste komt door de Requery, omdat de recordset opnieuw wordt geladen. Maar je hebt het prima opgelost :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan