Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi 2 Datenbanken abgleichen (https://www.delphipraxis.net/183906-2-datenbanken-abgleichen.html)

Walter Landwehr 12. Feb 2015 22:06

Datenbank: Firebird • Version: 2.5.2 • Zugriff über: IBO

2 Datenbanken abgleichen
 
Hallo,

gibt es eine Möglichkeit 2 Tabellen so abzugleichen das die Struktur einzelner Tabellen gleich sind. Die Felder der Tabellen sollen die gleichen Reihenfolge haben. So kann man per Schleife die Daten von Quelle in das Ziel schaufeln.

Vielen Dank für mögliche Lösungsvorschläge.

himitsu 12. Feb 2015 22:42

AW: 2 Datenbanken abgleichen
 
http://www.firebirdsql.org/refdocs/l...ter-table.html - ALTER COLUMN: POSITION now 1-based

Es gibt auch Tools für die Datenbank-Verwaltung/Synchronisation, welche unter Anderem auch den Abgleich der Struktur ermöglichen.



Wenn du aber die Struktur nicht sicherstellen kannst (was eigentlich nie der Fall ist), dann ist es besser immer mit Feldnamen zu arbeiten.

Alternativ gehst du über über zwei Query/Table-Komponenten.
Auf beiden Seiten
XML-Code:
SELECT * FROM ...
und dann über die DataSet.Fields laufen, in dem anderen Query FindField, Value übergeben und POST und fertig.

himitsu 12. Feb 2015 22:47

AW: 2 Datenbanken abgleichen
 
[gelöscht]

Walter Landwehr 12. Feb 2015 23:08

AW: 2 Datenbanken abgleichen
 
Hallo himitsu,

hört sich schon ganz gut an, hast Du eventuell einen Code-Schnipsel, um mir auf die Sprünge zu helfen.

p80286 12. Feb 2015 23:21

AW: 2 Datenbanken abgleichen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1289692)
Hallo,

gibt es eine Möglichkeit 2 Tabellen so abzugleichen das die Struktur einzelner Tabellen gleich sind. Die Felder der Tabellen sollen die gleichen Reihenfolge haben. So kann man per Schleife die Daten von Quelle in das Ziel schaufeln.

Vielen Dank für mögliche Lösungsvorschläge.

Ich vermute mal, daß in den zwei Tabellen (in unterschiedlichen Datenbanken) ähnliche Daten enthalten sind. Da würde es sich anbieten zwei Abfragen aufzusetzen deren Ergebnis Daten gleicher Struktur sind. Diese kannst Du miteinander vergleichen und ggf. Updates/Inserts durchführen.

Wie hier schon vor kurzem Ausgeführt wurde, Datenbanken enthalten Daten-Mengen, darum verbietet sich ein direkter Vergleich von Datenbanktabellen, da die Daten dort nicht sicher in einer Ordnung vorliegen.

Gruß
K-H

HolgerX 13. Feb 2015 05:50

AW: 2 Datenbanken abgleichen
 
Zitat:

Zitat von himitsu (Beitrag 1289693)
Alternativ gehst du über über zwei Query/Table-Komponenten.
Auf beiden Seiten
XML-Code:
SELECT * FROM ...
und dann über die DataSet.Fields laufen, in dem anderen Query FindField, Value übergeben und POST und fertig.

Hallo..

Wenn Du nur die Feldtypen/Größen/Position prüfen willst, dann nimm 2 Qerys mit Select * und dann kannst Du einen einfachen Vergleich über die Fields-Properties der beiden Querys machen..

Bei Ado habe ich dort neben FieldName noch Size, Precision und klar den FieldType..

Holger

jobo 13. Feb 2015 07:47

AW: 2 Datenbanken abgleichen
 
Die exakte Struktur gleichst Du am besten über die Tabellen Create Anweisungen ab, am besten gleich mit Indizes und Triggern und Constraints.
2x für jedes System auslesen und mit einem Diff Tool ansehen.
Die Reihenfolge der Spalten ist dabei eigentlich ziemlich uninteressant, zumindest für die Funktion der Tabellen.
Der Abgleich soll nach welchen Kriterien erfolgen? "Von der Quelle zum Ziel schaufeln" klingt so etwas nach, eigentlich soll Ziel eine Kopie von Quelle sein. Wenn das so ist, exportiere die Tabelle des Quellsystems und erstelle sie im Zielsystem über den Export neu. Damit fällt natürlich auch der Strukturabgleich weg.

waldforest 13. Feb 2015 08:25

AW: 2 Datenbanken abgleichen
 
Hallo,
auf der Suche bin ich auf anliegendes Tool Interbase Restructurer gestoßen.
http://sourceforge.net/projects/ibrest/

und hier zum Source
http://sourceforge.net/projects/ibre...d?source=files
denke die hilft dir weiter

Walter Landwehr 13. Feb 2015 08:45

AW: 2 Datenbanken abgleichen
 
Hallo,

also ich möchte Daten einer bestehenden Datenbank in eine neue Datenbank übernehmen. Es geht hier um ein Programmupdate wobei das Update ohne Einwirkung des Anwenders funktionieren sollte.

Zur Zeit versuche ich es so.

Delphi-Quellcode:
procedure TfrmUebernahme.Optionen;
var i, Saetze : Integer;
begin
  if cbxOptionen.Checked then
  begin
    Query_Quelle.Close;
    Query_Quelle.SQL.Clear;
    Query_Quelle.SQL.Add('select * from TBL_OPTIONEN');
    Query_Quelle.Open;
    Query_Ziel.Close;
    Query_Ziel.SQL.Clear;
    Query_Ziel.SQL.Add('select * from TBL_OPTIONEN');
    Query_Ziel.Open;
    Query_Ziel.Edit;
    for i := 0 to Query_Quelle.fieldcount -1 do
    begin
       Query_Ziel.Fields[i].asvariant := Query_Quelle.Fields[i].asvariant;
    end;
    Query_Ziel.post;
    dmMain.ibqryOptionen.Refresh;
  end;
end;
Bei diesen Code hat die Tabelle nur einen Datensatz.

Das funktioniert auch ganz gut. Nur wenn die Struktur unterschiedlich ist knallt es. Ich werde mich mal an
die Lösung von himitsu wagen. Der Ansatz sieht gut.

himitsu 13. Feb 2015 09:05

AW: 2 Datenbanken abgleichen
 
Ich hatte gedcht, daß die Teile mit "..." Punkten eventuell schon bekannt sind.

Delphi-Quellcode:
Query_Quelle.SQL.Add('select * from TBL_OPTIONEN'); // läd ALLES

Also z.B. mit
Delphi-Quellcode:
while not Query_Quelle.Eof do ...
drüberlaufen und alle Datensätze durchlaufen.

Und nun entweder
Delphi-Quellcode:
Query_Ziel.SQL.Add('select * from TBL_OPTIONEN'); // läd ALLES
und dann vor dem Bearbeiten mit
Delphi-Quellcode:
Query_Ziel.Locate
den zugehörigen Datensatz auswählen
oder über
Delphi-Quellcode:
Query_Ziel.SQL.Add('select * from TBL_OPTIONEN where EINE_ID = :ID'); Query_Ziel.ParamByName('ID').Value := Query_Quelle.FieldByName('EINE_ID').Value;
jeweils nur den passenden Zieldateisatz laden.

Sir Rufo 13. Feb 2015 09:15

AW: 2 Datenbanken abgleichen
 
Also, man ist sehr gut beraten, wenn die Datenbankstruktur ihren eigenen Versionsstand kennt, bzw. diesen irgendwie dort ablegt.

Für die Update-Orgie stellt man nun Skripts zusammen, die die Datenbankstruktur von Version X auf Version Y bringen können.

Jetzt wird auf einmal alles einfach:
  • Frage nach der Version
  • Suche Skript zu dieser Version
  • Kein Skript gefunden, dann raus hier
  • Führe Skript aus
  • Alles nochmal von vorne
Ganz zum Schluss wird einfach nochmal die Probe gemacht, ob die Struktur jetzt tatsächlich auf der benötigten Version ist.

Walter Landwehr 13. Feb 2015 09:19

AW: 2 Datenbanken abgleichen
 
Hallo himitsu,

bei dem Beispiel Code handelst es sich um eine Tabelle mit nur einen Datensatz. Das Problem ist das die Quell-Struktur unter Umständen anders ist wie die Ziel-Struktur, d.h. Felder können an anderer Position sein und dann funktioniert meine Schleife nicht.
Delphi-Quellcode:
 for i := 0 to Query_Quelle.fieldcount -1 do
     begin
        Query_Ziel.Fields[i].asvariant := Query_Quelle.Fields[i].asvariant; // hier ist das Problem.
     end;
     Query_Ziel.post;
Feld 10 könnte in Ziel an Position 11 sein und unterschiedliche Feldwerte wie Boolean und Integer sein.

Das ist mein Problem.

baumina 13. Feb 2015 09:23

AW: 2 Datenbanken abgleichen
 
Gehe doch lieber über den Feldnamen, die Reihenfolge der Felder innerhalb einer Tabelle ist dann egal.

Walter Landwehr 13. Feb 2015 09:27

AW: 2 Datenbanken abgleichen
 
Hallo baumina,

hast Du mal ein Beispiel?

Uwe Raabe 13. Feb 2015 09:33

AW: 2 Datenbanken abgleichen
 
Mach dir doch nicht so einen Stress und benutze CopyFields.

baumina 13. Feb 2015 09:38

AW: 2 Datenbanken abgleichen
 
Delphi-Quellcode:
for i := 0 to Query_Quelle.fieldcount -1 do
begin
  ZielFeld := Query_Ziel.FieldByName(Query_Quelle.Fields[i].FieldName);
  If Assigned(ZielFeld) then
  begin
    ZielFeld.asvariant := Query_Quelle.Fields[i].asvariant;
  end;
end;

Walter Landwehr 13. Feb 2015 10:46

AW: 2 Datenbanken abgleichen
 
Hallo Uwe,

CopyFields funktioniert bei mir nicht so richtig.

Delphi-Quellcode:
procedure TfrmUebernahme.Optionen;
//procedure CopyRecord(dsSource, dsTarget: TDataSet);
    var varCopyData: Variant;
     i: Integer;
   begin
    Query_Quelle.Close;
    Query_Quelle.SQL.Clear;
    Query_Quelle.SQL.Add('select * from TBL_OPTIONEN');
    Query_Quelle.Open;
    Query_Ziel.Close;
    Query_Ziel.SQL.Clear;
    Query_Ziel.SQL.Add('select * from TBL_OPTIONEN');
    Query_Ziel.Open;
    Query_Ziel.Edit;

   with Query_Quelle do
   begin
     varCopyData := VarArrayCreate([0, FieldCount-1], varVariant);
     for i := 0 to FieldCount-1 do
       varCopyData[i] := Fields[i].Value;
   end;

  with Query_Ziel do
   begin
//     Insert;
    for i := 0 to FieldCount-1 do
       Fields[i].Value := varCopyData[i]; // Hier Knalls bei Feld 90.
   end;
   Query_Ziel.Post;
 end;
was mache ich denn falsch. Irgendwie erkennt mein Code nicht die Feldreihenfolge.

Und was ist wenn das Ziel neue Felder hat. Es sollen natürlich nur die alten Einträge übernommen werden.

baumina 13. Feb 2015 10:55

AW: 2 Datenbanken abgleichen
 
Was genau funktioniert bei
Delphi-Quellcode:
AnzFelderKopiert := Query_Ziel.CopyFields(Query_Quelle);
nicht?

Uwe Raabe 13. Feb 2015 10:57

AW: 2 Datenbanken abgleichen
 
Zitat:

Zitat von Walter Landwehr (Beitrag 1289755)
CopyFields funktioniert bei mir nicht so richtig.

Was funktioniert denn nicht? Eigentlich iteriert CopyFields die Felder der Quelldatenbank, sucht das gleichnamige Feld in der Zieldatenbank und weist dann die Value-Werte zu (entspricht AsVariant).

Delphi-Quellcode:
procedure TfrmUebernahme.Optionen;
begin
  Query_Quelle.Close;
  Query_Quelle.SQL.Clear;
  Query_Quelle.SQL.Add('select * from TBL_OPTIONEN');
  Query_Quelle.Open;
  Query_Ziel.Close;
  Query_Ziel.SQL.Clear;
  Query_Ziel.SQL.Add('select * from TBL_OPTIONEN');
  Query_Ziel.Open;
  Query_Ziel.Edit; // oder Append/Insert, wenn noch kein Datensatz da ist
  Query_Ziel.CopyFields(Query_Quelle);
  Query_Ziel.Post;
end;

Walter Landwehr 13. Feb 2015 11:33

AW: 2 Datenbanken abgleichen
 
OK zunächst mal Danke für Eure Antworten, muss jetzt leider bis Sonntag außer Haus. Melde mich dann am Sonntag wieder und berichte über das Ergebnis.

Walter Landwehr 15. Feb 2015 14:07

AW: 2 Datenbanken abgleichen
 
Danke Uwe Dein Tipp war erfolgreich und hat mir viel Arbeit gespart. Kannte den Befehl CopyFields noch nicht. Nun hat alles bestens funktioniert.


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