Delphi-PRAXiS

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

hsbc 22. Feb 2007 09:42

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

Datenbanken abgleichen
 
Hallo allerseits!

Folgende Situation:

Aussendienst arbeitet auf mehreren Notebooks mit einer Firebird-DB, welche lokal jeweils installiert ist, seine Angebote aus und speichert diese am Notebook lokal in der DB unter einer automatisch vorgegebenen Angebotsnummer (Serie ist unterschiedlich je Mitarbeiter).

Wenn der Aussendienstmitarbeiter in seine Firma kommt, steckt er sein Notebook in eine Dockingstation und jetzt sollen die beiden identischen Datenbanken (Notebook und jene in der Firma) abgeglichen werden, d.h. jeweils die neueste Version jedes Angebotes soll auf beiden Geräten gespeichert werden.

Gibt es hiezu überhaupt eine Möglichkeit, dies über SQL durchzuführen? Ich hoffe, ich konnte mich einigermassen verständlich ausdrücken.

mfg
Herbert

Jürgen Thomas 22. Feb 2007 09:55

Re: Datenbanken abgleichen
 
Unmittelbar geht es nicht, weil mit FB nicht aus einer DB heraus auf eine andere zugegriffen werden kann. Du musst es also per Programm lösen. Jürgen

hoika 22. Feb 2007 10:01

Re: Datenbanken abgleichen
 
Hallo,

das läuft normlerweise über Replikation,
es gibt für Firebird einen freien Replikator (google),
da muss man sich nur anmelden.

Die Replikation selber läuft nicht direkt per SQL,
sondern über ein eigenes Programm (diesen Replikator) (also c++, Delphi,
weiss nicht, ist kein open source).

Das Grundprinzip ist "einfach"
1. Sorge für eindeutige Nummernkreise bei den Primärschlüsseln
der einzelnen Datenbanken (geht bei Generatoren ja einfach)
1. DB beginnt z.B. bei 1, 2. DB bei 10 Mio, 3. DB bei 40 Mio.
2. Protokolliere alle Änderungen aller DB's
Trigger, Protokolldatei
3. Trage alle Änderungen aller DB's in die jeweils anderen ein

Probleme gibt es, wenn 1 Datensatz von zwei Nutzern "gleichzeitig"
geändert wurde. Ausserdem mit unique Key (Auftragsnummer),
dass hattest du aber über Serien ja schon gelöst.


Wenn es hier "nur" darum geht, neue Angebote einzutragen,
würde ich ein Synchronisationstool schreiben.
Das fragt in der Haupt-DB nach, ob das jeweilige Angebot
schon drinsteht, wenn nicht wird es eingetragen,
wenn es drinsteht, wird auf Änderungen geprüft (synchronisiert).

Positiv macht sich hier ebensfalls eine Protokolltabelle
bemerkbar, wo im einfachsten Fall Datum, Tabellenname, prim key
der Änderung drinsteht.


Heiko

hsbc 22. Feb 2007 11:16

Re: Datenbanken abgleichen
 
Ja, ok - für den Anfang wäre mir schon geholfen, wenn ich alle "neuen" Angebote einfach vom Notebook in die zentrale Firmendatenbank übertragen könnte. Wie gesagt, die beiden Datenbanken sind 1:1 aufgebaut und haben sowohl am Server als auch jeweils lokal den gleichen Namen.

Wie könnte so ein Synchronisationstool aussehen? Worauf muss ich hier achten?

mfg
Herbert

hoika 22. Feb 2007 11:29

Re: Datenbanken abgleichen
 
Hallo,

nun ja ;)
Du hast ja bestimmt in deinem Programm ein Routine "Neues Angebot speichern",
der du ein Datenklass (TOffer ?) übergeben kannst.
Die erzeugt einen neuen Primärschlüssel (Generator), und trägt das Eingabit ein.
Die Liste der Angebotspositionen (mit diesem neuen Primärschlüssel als Foreign key)
wird dann ebenfalls gespeichert.

Dein Programm muss jetzt in der Lage sein,
ein Angebot aus der Lappi-DB auszulesen und in die Firmen-DB
als neues Angebot zu speichern.
Du benutzt also 2 ZConnections, zwei Queries (oder besser 2 TOfferDBClass,
die mit je einer ZConnection verbunden sind).

Wichtig wäre auf jeden Fall ein Protokoll (in beiden DBs (?),
die das Insert-Protokollieren, auch denn du natürlich feststellen kannst,
ob das Angebot schon drinsteht.

Ausserdem würde ich ein Änderungsprotokoll mitführen, falls z.B. auf dem Lappi
ein Angebot geändert wurde. Dann muss die Änderung in die Firmen-DB mit rein.

Man kann es sich hier etwas einfacher, indem man die Firmen-DB als Master-DB betrachtet,
die immer auf dem aktuellen Stand sein soll.
Zuerst schiebt der Lappi die neuen Angebot in die Firmen-DB,
dann holt er sich alle bisherigen Änderungen, die er selber noch nicht hat,
aus der Firmen-DB (am einfachsten wäre ein Backup/Restore er Firmen-DB
und Überschreiben der Laptop-DB).


Auf der IBPhoenix-Homepage ist auch ein kleine Anleitung (für Replikation)

Heiko

manfred_h 22. Feb 2007 15:27

Re: Datenbanken abgleichen
 
Hi

hier findest Du noch ein Sync Tool
http://www.microtec.fr/copycat/

womöglich von interesse
Shalom
Manfred

hsbc 23. Feb 2007 14:36

Re: Datenbanken abgleichen
 
Ich werde das ganze jetzt mal auf die "einfache" versuchen, indem ich alle Angebote vom Notebook zum Server schicke, wobei bestehende Datensätze am Server einfach überschrieben werden sollen. Irgendwo habe ich da noch ein Problem. Folgendes habe ich bereits gemacht:

Ich verwende je 1 ZConnection, 1 ZQuery und 1 Datasource sowohl für die lokale DB als auch für die serverseitige DB und selektiere dann mal die zu übersendenden Angebote mit:

Delphi-Quellcode:
ZQueryLokal.SQL.Text := 'SELECT * FROM ANBOTE WHERE ANBOTNR > 0';
Danach versuche in einer Schleife Datensatz für Datensatz zu übertragen:

Delphi-Quellcode:
ZQueryLokal.First;
while not ZQueryLokal.EOF do begin
  DataSourceServer.Dataset := DataSourceLokal.Dataset; // geht das überhaupt so, oder muss ich jede Feld separat übergeben?

  // wie kann ich jetzt das Dataset in die Server-Datenbank einfügen ? 
  // ZQueryServer.SQL.Text := 'INSERT INTO ARTIKEL'  funktioniert nicht

  ZQueryLokal.Next;
end;
Irgendwo habe ich hier ein Blackout. Vielleicht kann mir hier nochmals jemand Tipps geben.

mfg
Herbert


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