Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabellen vergleichen und Änderungen übernehmen (https://www.delphipraxis.net/172773-tabellen-vergleichen-und-aenderungen-uebernehmen.html)

Ykcim 22. Jan 2013 09:40

Datenbank: MySQL • Version: 5 • Zugriff über: UniDac

Tabellen vergleichen und Änderungen übernehmen
 
Hallo Zusammen,

zu dem Thema gibt es zwar viel, wenn man die Suche bemüht, aber ich habe leider trotzdem noch keineLösung gefunden und bitte EUch daher um Hilfe.
Ich habe zwei Tabellen, die von der Struktur exakt identisch sind. In diesen Tabellen sind Auftragsdaten von Produktionsaufträgen enthalten. Diese Daten kommen aus einer Abfrage aus unserem ERP-System.
Die eine Tabelle heißt Auftrag und das ist die Tabelle, mit der der User arbeitet. Die andere Tabelle heißt AuftragTEMP und wird nur während des Update-Prozesses verwendet. Nach dem Update-Prozess ersetzen die Daten von AuftragTEMP die Daten aus Auftrag. So viel zum Hintergrund - das klappt alles wunderbar.

Jetzt zu meinem Problem
Manche Daten können von den Usern geändert werden und müssen in die Tabelle AuftragTEMP übernommen werden. Dazu hätte ich gerne eine SQL-Anweisung, weiß aber leider nicht, wie ich diese aufbauen muss.

Hier mal ein Beispiel, wie die Daten aussehen können:
Tabelle Auftrag
AuftragsNr Arbeitsgang Rückmeldedatum
4711000 AG000000001 20130110
4711000 AG000000002 20130110
4711000 AG000000003 20130111
4711000 AG000000004 20130113
4711000 AG000000005 20130115
4711000 AG000000006
4711000 AG000000007
4711000 AG000000008

Tabelle AuftragTEMP
AuftragsNr Arbeitsgang Rückmeldedatum
4711000 AG000000001 20130110
4711000 AG000000002 20130110
4711000 AG000000003 20130111
4711000 AG000000004 20130113
4711000 AG000000005 HIER SOLL DAS ROTE DATUM EINGEFÜGT WERDEN
4711000 AG000000006
4711000 AG000000007
4711000 AG000000008

Das rote Rückmeldedatum soll aus Tabelle Auftrag in Tabelle AuftragTEMP übernommen werden. Die Tabellen enthalten ungefähr 60.000 Datensätz. Die Datensätze sind nicht 100% identisch, soll heißen, dass in der Tabelle AuftragTEMP die fertig gewordenen Aufträge nicht mehhr enthalten sind und das neue Aufträge mit aufgenommen sind, die in der Tabelle Auftrag noch nicht enthalten sind.

Ich hoffe, dass ich das Problem nachvollziehbar beschrieben habe und das Ihr mir helfen könnt.

Vielen Dank
Patrick

jobo 22. Jan 2013 10:03

AW: Tabellen vergleichen und Änderungen übernehmen
 
Die SQL Befehle dazu wären except, intersect, minus...
sollte innerhalb einer DB kein Problem sein.

Welche von den 3 oben bei MySQL dabei sind, weiß ich nicht genau / versionsabhängig.

Ykcim 22. Jan 2013 14:09

AW: Tabellen vergleichen und Änderungen übernehmen
 
Hallo jobo,

leider gibte es alle drei Befehle nicht in MySQL.

Ich hatte es selber mal versucht aufzubauen, aber ich ich kam schon mit dem Update-Part nicht zurecht...

Delphi-Quellcode:
Update AuftragTEMP set Rückmeldedatum=??? //Das ist ja für jeden Auftrag anders...
where (AuftragsNr, Arbeitsgang) in (
Select Auftrag, Arbeitsgang from Auftrag
where Rueckmeldedatum<>'0000-00-00 00:00:00')


Selbst wenn ich eine Möglichkeit hätte, alle vorhanden Rückmeldedatums (Rückmeldedaten kommt mir irgendwie nicht über die Finger), egal ob sie in AuftragTEMP schon vorhanden sind oder nicht, upzudaten, würde mir das helfen.

Hat jemand da eine Idee für mich?

Vielen Dank
Patrick

Ich habe zwischenzeitlich eine SQL-Anweisung gefunden, die vielversprechend aussieht, die ich aber nicht ans Laufen bekomme:

Delphi-Quellcode:
UPDATE
 Auftragtemp AS u
LEFT JOIN
 (SELECT AuftragsNr, Arbeitsgang, Rueckmeldedatum FROM Auftrag) AS o ON u.Primary = o.Primary
SET
 u.Rueckmeldedatum = o.Rueckmeldedatum

Ich habe noch nir mit einem Primary Key gearbeitet. Er setzt sich aus den Spalten Auftrag und Arbeitsgang zusammen.

Wenn ich das ganze ohne Primary versuche sieht das so aus:
Delphi-Quellcode:
UPDATE
 AuftragTEMP AS u
LEFT JOIN
 (SELECT AuftragsNr, Arbeitsgang, Rueckmeldedatum FROM Auftrag) AS o ON (u.AuftragsNr, u.Arbeitsgang) = (o.AuftragsNr, o.Arbeitsgang)
SET
 u.Rueckmeldedatum = o.Rueckmeldedatum
Hier bekomme ich die Fehlermedung: Data truncated for column 'Rueckmeldedatum' at row 1

Ist das etwas, was zur Lösung führen könnte?

Vielen Dank
Patrick

jobo 22. Jan 2013 17:37

AW: Tabellen vergleichen und Änderungen übernehmen
 
Zitat:

Zitat von Ykcim (Beitrag 1200094)
leider gibte es alle drei Befehle nicht in MySQL.

Tja, da war ich dann wohl etwas schlampig. Aber es gibt dutzende Anleitungen, wie man nachbaut, z.b. hier:
http://www.bitbybit.dk/carsten/blog/?p=71
Zitat:

Performing a MINUS

To transform the statement

Code:
SELECT member_id, name FROM a
MINUS
SELECT member_id, name FROM b
into something that MySQL can process, we can utilize subqueries (available from MySQL 4.1 onward). The easy-to-understand transformation is:

Code:
SELECT DISTINCT member_id, name
FROM a
WHERE (member_id, name) NOT IN
(SELECT member_id, name FROM table2);
Of course, to any long-time MySQL user, this is immediately obvious as the classical use-left-join-to-find-what-isn’t-in-the-other-table:

Code:
SELECT DISTINCT a.member_id, a.name
FROM a LEFT JOIN b USING (member_id, name)
WHERE b.member_id IS NULL
which tends to be a lot more efficient.
Ansonsten sehe ich in Deinen weiteren Versuchen nichts mehr von der urspünglichen Anforderung. Was brauchst Du denn nun?

Ykcim 22. Jan 2013 20:28

AW: Tabellen vergleichen und Änderungen übernehmen
 
Hallo Zusammen,

ich glaube ich habe es gelöst...

Hier meine Procedure:

Delphi-Quellcode:
Query.SQL.Clear;
   Query.SQL.Add('UPDATE as400temp SET as400temp.OARMDA = ');
   Query.SQL.Add('(SELECT OARMDA FROM as400 ');
   Query.SQL.Add('WHERE as400.WAAUNR=as400temp.WAAUNR AND '); //Primary Key
   Query.SQL.Add('as400.WAAUPO=as400temp.WAAUPO AND ');       //Primary Key
   Query.SQL.Add('as400.OAAGNR=as400temp.OAAGNR AND ');       //Primary Key
   Query.SQL.Add('as400.OARMDA<> :Datum) ');                  //0-Datum aus as400 nicht berücksichtigen
   Query.SQL.Add('where as400temp.OARMDA= :Datum ');          //Nur die 0-Datums aus as400temp updaten
   Query.ParamByName('Datum').AsString:='0000-00-00';        
   Query.Execute;
Gruß
Patrick

Ykcim 22. Jan 2013 20:32

AW: Tabellen vergleichen und Änderungen übernehmen
 
Hallo jobo,

vielen Dank für Deine Mühe.
Die Anforderung hat sich eigentlich nicht geändert:
Zitat:

Das rote Rückmeldedatum soll aus Tabelle Auftrag in Tabelle AuftragTEMP übernommen werden.
Ich glaube aber, dass ich es mit der oben beschrieben SQL-Anweisung erreiche.
Muss noch aber noch ein bißchen getestet werden, aber die ersten Tests sahen gut aus...

Vielen Dank
Patrick


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 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