Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Inhalt einer Firebird-Tabelle übernehmen (https://www.delphipraxis.net/193466-inhalt-einer-firebird-tabelle-uebernehmen.html)

Luckner 3. Aug 2017 15:29

Datenbank: Firebird • Version: 1.5 • Zugriff über: Dataset

Inhalt einer Firebird-Tabelle übernehmen
 
Hallo an Alle,
ich würde gerne aus einer temporären Firebird-Tabelle alle Daten in eine andere Tabelle der selben Datenbank kopieren. Mit
Delphi-Quellcode:
    DatamoduleAuftrag.IBDataSetPositionen.Open;
    DataModuleArtikelAngebot.IBDataSetArtikelTemp.Open;
    DataModuleArtikelAngebot.IBDataSetArtikelTemp.First;

    with DataModuleArtikelAngebot.IBDataSetArtikelTemp do
    for i := 0 to DataModuleArtikelAngebot.IBDataSetArtikelTemp.RecordCount - 1 do
    begin
      DatamoduleAuftrag.IBDataSetPositionen.Append;
      DatamoduleAuftrag.IBDataSetProvisionenAUFTRID.AsInteger := AuftragsId;
      DatamoduleAuftrag.IBDataSetPositionenPOSTIONSNUMMER.AsInteger := DataModuleArtikelAngebot.IBDataSetArtikelTempPOSTIONSNUMMER.AsInteger;
      DatamoduleAuftrag.IBDataSetPositionenKENNZIFFER.AsInteger := DataModuleArtikelAngebot.IBDataSetArtikelTempKENNZIFFER.AsInteger;
      DatamoduleAuftrag.IBDataSetPositionenARTIKELNUMMER.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempARTIKELNUMMER.AsString;
      DatamoduleAuftrag.IBDataSetPositionenIHREARTIKELNUMMER.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempIHREARTIKELNUMMER.AsString;
      DatamoduleAuftrag.IBDataSetPositionenBEZEICHNUNG.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempBEZEICHNUNG.AsString;
      DatamoduleAuftrag.IBDataSetPositionenHINWEIS.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempHINWEIS.AsString;
      DatamoduleAuftrag.IBDataSetPositionenKUNDENBEZEICHNUNG.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempKUNDENBEZEICHNUNG.AsString;
      DatamoduleAuftrag.IBDataSetPositionenAUFDRUCK.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempAUFDRUCK.AsString;
      DatamoduleAuftrag.IBDataSetPositionenFORMAT.AsInteger:= StrToInt(DataModuleArtikelAngebot.IBDataSetArtikelTempFORMAT.AsString);
      DatamoduleAuftrag.IBDataSetPositionenFORMATB.AsInteger:= StrToInt(DataModuleArtikelAngebot.IBDataSetArtikelTempFORMATB.AsString);
      DatamoduleAuftrag.IBDataSetPositionenEINHEIT.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempEINHEIT.AsString;
      DatamoduleAuftrag.IBDataSetPositionenBUTTONS.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempBUTTONS.AsString;
      DatamoduleAuftrag.IBDataSetPositionenBLATTWAREANMERKUNG.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempBLATTWAREANMERKUNG.AsString;
      DatamoduleAuftrag.IBDataSetPositionenBLATTWARECOMBO.AsInteger := DataModuleArtikelAngebot.IBDataSetArtikelTempBLATTWARECOMBO.AsInteger;
      DatamoduleAuftrag.IBDataSetPositionenAUFROLLELEGEANWEISUNG2.AsString := DataModuleArtikelAngebot.IBDataSetArtikelTempAUFROLLELEGEANWEISUNG2.AsString;
    end;

    DatamoduleAuftrag.IBDataSetPositionen.Post;

    if DatamoduleAuftrag.IBTransaction1.InTransaction then DatamoduleAuftrag.IBTransaction1.Commit;
    DatamoduleAuftrag.IBDataSetPositionen.Close;

Bekomme jedoch den Fehler: "Nicht im Bearbeitungsmodus" Prozess wurde angehalten.

Finde den Fehler nicht.
Bitte um Hilfe.
Danke, Luckner

mkinzler 3. Aug 2017 15:47

AW: Inhalt einer Firebird-Tabelle übernehmen
 
Warum das With?

es fehlt DataModuleArtikelAngebot.IBDataSetArtikelTemp.Next in der Schleife.

Beim wievielten DS kommt der Fehler?
Statt
Delphi-Quellcode:
for i := 0 to DataModuleArtikelAngebot.IBDataSetArtikelTemp.RecordCount - 1 do
besser
Delphi-Quellcode:
while not DataModuleArtikelAngebot.IBDataSetArtikelTemp.Eof do
Ich würde die Kopie durch ein SQL-Statement erledigen.

nahpets 3. Aug 2017 15:54

AW: Inhalt einer Firebird-Tabelle übernehmen
 
Grobes Vorgehen bei einer Schleife über eine Tabelle ...
Delphi-Quellcode:
while not DataModuleArtikelAngebot.IBDataSetArtikelTemp.EoF do begin
  DatamoduleAuftrag.IBDataSetPositionen.Append;

  ... Wertezuweisungen

  DatamoduleAuftrag.IBDataSetPositionen.Post;
  DataModuleArtikelAngebot.IBDataSetArtikelTemp.Next;
end;
In Deinem Quelltext befindet sich das Post ausserhalb der Schleife, es gehört aber zu jedem Append ein Post. Das ist in Deinem Quelltext nicht gegeben.

Am Ende fragst Du nach, ob eine Transaktion offen ist, wenn ja, wird ein Commit gemacht. Im Quelltext wird aber keine Transaktion gestartet, so dass auch das Commit nie ausgeführt wird.

Wenn die Tabellen strukturell identisch sind, dürfte ein
SQL-Code:
insert into NeueTabelle select * from AlteTabelle
ausreichen und deutlich schneller sein.

Stimmen die Strukturen nicht überein, müssen halt die Spalten aufgeführt werden, ist nur etwas Schreibarbeit, aber sicherlich deutlich weniger Aufwand, als das zu programmieren.

Fritzew 3. Aug 2017 16:02

AW: Inhalt einer Firebird-Tabelle übernehmen
 
Zu dem Hier schon gesagten noch:

Append auf Positionen und zuweisen an Provisionen?
Delphi-Quellcode:
DatamoduleAuftrag.IBDataSetPositionen.Append;
// Das ist doch die falsche Tabelle oder? 
DatamoduleAuftrag.IBDataSetProvisionenAUFTRID.AsInteger := AuftragsId;

Luckner 3. Aug 2017 16:13

AW: Inhalt einer Firebird-Tabelle übernehmen
 
Danke an Euch und Fritzew, klasse gesehen. Wäre ich so schnell nicht drauf gekommen. Jetzt läuft es.

Gruß, Luckner


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.

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