AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenbanken abgleichen

Datenbanken abgleichen

Ein Thema von hsbc · begonnen am 22. Feb 2007 · letzter Beitrag vom 23. Feb 2007
Antwort Antwort
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#1

Datenbanken abgleichen

  Alt 22. Feb 2007, 09:42
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos
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
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: Datenbanken abgleichen

  Alt 22. Feb 2007, 09:55
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Datenbanken abgleichen

  Alt 22. Feb 2007, 10:01
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
Heiko
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#4

Re: Datenbanken abgleichen

  Alt 22. Feb 2007, 11:16
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Datenbanken abgleichen

  Alt 22. Feb 2007, 11:29
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
Heiko
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#6

Re: Datenbanken abgleichen

  Alt 22. Feb 2007, 15:27
Hi

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

womöglich von interesse
Shalom
Manfred
  Mit Zitat antworten Zitat
hsbc

Registriert seit: 28. Jan 2004
Ort: Krems/Donau
404 Beiträge
 
Delphi 7 Professional
 
#7

Re: Datenbanken abgleichen

  Alt 23. Feb 2007, 14:36
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:

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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:19 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