AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Tabellen vergleichen und Änderungen übernehmen
Thema durchsuchen
Ansicht
Themen-Optionen

Tabellen vergleichen und Änderungen übernehmen

Ein Thema von Ykcim · begonnen am 22. Jan 2013 · letzter Beitrag vom 22. Jan 2013
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#1

Tabellen vergleichen und Änderungen übernehmen

  Alt 22. Jan 2013, 10:40
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
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
Patrick

Geändert von Ykcim (22. Jan 2013 um 21:35 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Tabellen vergleichen und Änderungen übernehmen

  Alt 22. Jan 2013, 11:03
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Tabellen vergleichen und Änderungen übernehmen

  Alt 22. Jan 2013, 15:09
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
Patrick

Geändert von Ykcim (22. Jan 2013 um 15:41 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Tabellen vergleichen und Änderungen übernehmen

  Alt 22. Jan 2013, 18:37
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Tabellen vergleichen und Änderungen übernehmen

  Alt 22. Jan 2013, 21:28
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
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Tabellen vergleichen und Änderungen übernehmen

  Alt 22. Jan 2013, 21:32
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
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17: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