PDA

Vollständige Version anzeigen : Datensätze mit INSERT INTO in gleiche Tabelle kopiere möglich


Hark
22.03.2004, 14:54
Hallo zusammen,

ich habe eine Auftragsverwaltung in welchem die Aufträge auch kopiert werden sollen. Der Auftragskopf klappt soweit auch ganz gut.
Aber zu jedem Auftrag gehört eine unbestimmte Anzahl an Terminen(2 Tabellen: auftrage und auftraege_termine).
Ich habe mir jetzt überlegt, diese am einfachsten mit einem sql-Statement ala INSERT INTO zu kopieren.
Ist das evtl. möglich, ohne eine Schleife und INSERT INTO ... VALUES, sondern in einer Zeile mit INSERT INTO ... FROM ... WHERE, also z.B.:

DoCmd.RunSQL ("INSERT INTO auftraege_termine (au_nr, termin_datum, termin_info) SELECT au_nr, termin_datum, termin_info FROM auftraege_termine WHERE au_nr=" & Nz(hlp_au_nr ,0)& ";")

Die Termintabelle hat ein Schlüsselfeld mit Autowert ("au_termin_id") und das Auftragsnummer-Feld müsste ich hinterher noch anpassen (wenn das nicht währnd dessen schon machbar sein sollte ...)

mfG
Heiko

jmc
23.03.2004, 14:33
Hi

die Auftrags-Nummer "au_nr" des neuen Auftrags ist ja bekannt, wenn du diesen kopiert hast. Somit kannst du auch den Insert gleich mit der richtigen Nummer machen:

Dim strSQL As String
Dim lng_au_nr As Long
.
.
lng_au_nr = ??? (Nummer des neuen Auftrag-Kopfs)
strSQL = "INSERT INTO auftraege_termine ("
strSQL= strSQL & lng_au_nr & ", termin_datum, termin_info) "
strSQL= strSQL & "SELECT au_nr, termin_datum, termin_info "
strSQL= strSQL & "FROM auftraege_termine WHERE au_nr = " & hlp_au_nr
CurrentDb.Execute strSQL
Das "Nz" für die hlp_au_nr würde ich nicht so machen, denn wenn die hlp_au_nr tatsächlich NULL ist, dann hast du nachher den Vergleich mit "0" und das dürfte dann nichts ergeben!
Diese Prüfung würde ich also vorangehend machen und dann entsprechend reagieren, denn das dürfte ja eigentlich gar nicht vorkommen - muss ja die Nummer des kopierten Auftrags sein ...

Hark
24.03.2004, 15:30
Hallo jmc,

Danke für die Hilfe, auch die Anmerkungen bezüglich des Nz!

Klappt leider noch nicht ganz:
Hab mir das fertige sql-statement mal in das Direktfenster ausgeben lassen, für Kopie von Auftrag Nr 10, die neue Auftrags Nr ist 17, würde das so aussehen:

INSERT INTO auftraege_termine (17, termin_datum, termin_info) SELECT auftrag_nr, termin_datum, termin_info FROM auftraege_termine WHERE auftrag_nr = 10

Fehlermeldung 3127: Die Sql-Anweisung enthält folgenden unbekannten Feldnamen : 17 . :(

Habs auch mal mit "INSERT INTO auftraege_termine ([auftrag_nr]=17 , termin_datum ..." versucht, aber klappt leider nicht.

mfg
Heiko

jmc
24.03.2004, 16:40
Hi

Schande über mein Haupt - da habe ich irgendwie geschlampt ...

muss natürlich so heissen:
Dim strSQL As String
Dim lng_au_nr As Long
.
.
lng_au_nr = ??? (Nummer des neuen Auftrag-Kopfs)
strSQL = "INSERT INTO auftraege_termine ("
strSQL= strSQL & "au_nr , termin_datum, termin_info) "
strSQL= strSQL & "SELECT " & lng_au_nr & ", termin_datum, termin_info "
strSQL= strSQL & "FROM auftraege_termine WHERE au_nr = " & hlp_au_nr
CurrentDb.Execute strSQL
(Habe den variablen Wert und den Feldnamen verkehrt rum geschrieben ...)

Hark
26.03.2004, 13:19
Danke, klappt bestens !

:yelrotfl: