Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO Daten in gleicher Tabelle kopieren (https://www.delphipraxis.net/109113-ado-daten-gleicher-tabelle-kopieren.html)

Smiley 24. Feb 2008 19:38

Datenbank: Access • Zugriff über: ADO

ADO Daten in gleicher Tabelle kopieren
 
Ich möchte in einer Tabelle den aktuellen Datensatz kopieren und am Ende als neuen Datensatz anhängen.
Dabei soll alles bis auf das Primärindexfeld kopiert werden.

1. Gibt es eine Funktion die das schon kann ?
2. Ist diese Funktion auch akzeptabel schnell ?
3. Wenn es nichts fertiges gibt, kann man dann wenigstens durch Iteration über die Felder die Daten zwischenspeichern und dann in einen leeren angehängten Datensatz wieder einkopieren. Ein Beispiel würde mir da sehr helfen.
Ich wollte den primitiven Weg über das lesen jedes Feldes und schreiben in einen Record und dann das schreiben aus dem Record in den leeren Datensatz zu Fuß vermeiden.
Wenigstens eine Schleife die Feld 1 bis n in den Record schreibt und dann aus dem Record wieder in die Tabelle.
Ich arbeite mit einem Query DM.QKat und stehe auf dem zu kopierenden Datensatz. Soweit die Voraussetzungen.

DeddyH 24. Feb 2008 19:42

Re: ADO Daten in gleicher Tabelle kopieren
 
SQL-Code:
INSERT INTO Tabelle([alle Felder außer PK])
  SELECT [alle Felder außer PK] FROM Tabelle
  WHERE PK = aktueller PK

Smiley 24. Feb 2008 19:45

Re: ADO Daten in gleicher Tabelle kopieren
 
Den InsertInto Befehl wollte ich ja nehmen, da sagte mir aber ein Kollege, dass man damit nur in eine andere Tabelle schreiben kann, daher habe ich das verworfen.
Kann ich den wirklich für die gleiche Tabelle benutzen ????

DeddyH 24. Feb 2008 19:46

Re: ADO Daten in gleicher Tabelle kopieren
 
Ich wüsste nichts, was dagegenspricht.

mkinzler 24. Feb 2008 19:50

Re: ADO Daten in gleicher Tabelle kopieren
 
Probieren geht über Kollegen :zwinker:

omata 24. Feb 2008 19:50

Re: ADO Daten in gleicher Tabelle kopieren
 
Zitat:

Zitat von Smiley
Den InsertInto Befehl wollte ich ja nehmen, da sagte mir aber ein Kollege, dass man damit nur in eine andere Tabelle schreiben kann, daher habe ich das verworfen.
Kann ich den wirklich für die gleiche Tabelle benutzen ????

Das geht bei MySQL nicht, alle anderen Datenbanksysteme sollten das aber können.

Gruss
Thorsten

DeddyH 24. Feb 2008 19:51

Re: ADO Daten in gleicher Tabelle kopieren
 
Unter Firebird geht' s (man muss nicht alles glauben, was einem die Kollegen so erzählen, aber vielleicht verhält sich Access da auch anders).

mkinzler 24. Feb 2008 19:53

Re: ADO Daten in gleicher Tabelle kopieren
 
Das sollte mit jedem (richtigen) DBMS gehen; sobald das DBMs mehrer Instanzen einer Tabelle verwalten kann

Smiley 24. Feb 2008 20:07

Re: ADO Daten in gleicher Tabelle kopieren
 
Ich habs mal probiert mit folgender Anweisung:
Delphi-Quellcode:
  DM.QKat.SQL.Text:='Insert Into Kataloge [Bildbeschreibung,alteNr,Hersteller]'+
  ' Select [Bildbeschreibung,alteNr,Hersteller]'+
  ' From Kataloge Where BestellNr='+QuotedStr(AktBestNr);
Da kommt nach ExecSQL ein Syntaxfehler in der InsertInto Anweisung.

Was ist hier falsch ?

omata 24. Feb 2008 20:10

Re: ADO Daten in gleicher Tabelle kopieren
 
Versuch mal...
Delphi-Quellcode:
  DM.QKat.SQL.Text:=
    'INSERT INTO Kataloge (Bildbeschreibung, alteNr, Hersteller) ' +
    'SELECT Bildbeschreibung, alteNr, Hersteller ' +
    'FROM Kataloge ' +
    'WHERE BestellNr = ' + QuotedStr(AktBestNr);
Ist die BestellNr eine Autofeld?

mkinzler 24. Feb 2008 20:15

Re: ADO Daten in gleicher Tabelle kopieren
 
Zitat:

Da kommt nach ExecSQL ein Syntaxfehler in der InsertInto Anweisung.
Und was wird angemahnt?

Smiley 24. Feb 2008 20:27

Re: ADO Daten in gleicher Tabelle kopieren
 
OK so gehts, hatte das mit der Eckigen Klammer von einer allgemeinen SQL-Seite oder hab das falsch interpretiert.
Das hinter dem Select war natürlich Blödsinn, wurde einfach mitkopiert von oben drüber.

Die BestellNr ist ein eindeutiger Index aber nicht der Primärindex das ist ID und die ist ein Autowert.

Jetzt ist das Problem, wie finde ich meinen Datensatz denn wieder.
Das geht doch eigentlich nur über die ID.
Muss ich mir also erst die letzte ID auslesen incrementieren und dann danach selektieren oder index auf ID setzen und DM.QKat.Last machen.
Oder gehts noch einfacher ?

Als nächstes soll der Anwender jetzt ja seine Daten ändern können und die neue BestellNr eingeben.

mkinzler 24. Feb 2008 20:29

Re: ADO Daten in gleicher Tabelle kopieren
 
Zitat:

Als nächstes soll der Anwender jetzt ja seine Daten ändern können und die neue BestellNr eingeben.
Dann würden sich ja (SQL-)Parameter anbieten

Smiley 24. Feb 2008 20:34

Re: ADO Daten in gleicher Tabelle kopieren
 
Der Anwender hat ein Formular mit DBEdit Feldern vor sich die auf diesen Datensatz zeigen.
Dort soll er seine Änderungen vornehmen und dann "Speichern" drücken ansonsten muss ich den Datensatz wieder löschen.

@mkinzler
Die Fehlermeldung hieß: "Syntax Fehler in Insert Into Anweisung"

omata 24. Feb 2008 20:51

Re: ADO Daten in gleicher Tabelle kopieren
 
In MSSQL kann man den letzten eingefügten Autowert so ermittelt...
SQL-Code:
SELECT @@Identity AS ID
Ob das auch mit Access geht weiss ich nicht.

Gruss
Thorsten

Smiley 24. Feb 2008 21:46

Re: ADO Daten in gleicher Tabelle kopieren
 
Ich habe es jetzt so gelöst, das läuft überall, denk ich mal.

Delphi-Quellcode:
  DM.QKat.SQL.text := 'Select * from Kataloge order by id';
  DM.QKat.Open;
  DM.QKat.Last;

  LBestellNr := InputBox('Bitte neue Bestellnummer eingeben', 'Bestellnummer:', '');

  if LBestellNr <> '' then
    begin
      DM.QKat.Edit;
      DM.QKat.FieldByName('BestellNr').AsString:=LBestellNr;
      AktBestNr := LBestellNr;
      DM.QKat.Post;
    end
  else
    begin
      DM.QKat.Delete;
    end;

  DM.QKat.SQL.text := 'Select * from Kataloge order by BestellNr';
  DM.QKat.Open;
  DM.QKat.Locate('BestellNr', AktBestNr, []);
So funktioniert es bisher bei mir, falls jemand etwas dagegen anzumerken hat, nur zu !!


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz