Autor Beitrag
cyberax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Di 03.10.06 19:09 
Hallo,

also ich habe zwei Rechner die getrennt voneinander arbeiten (nur zeitweise vernetzt). Beide habe die gleiche Datenbank. Wenn nun der auf dem einen Rechner beispielsweise auf beiden Rechnern in der Tabelle "Kunden" ein neuer Kunde angelegt wird, wie kann ich dann einen "Datenausgleich" realisieren, sobald die PC's wieder beide vernetzt sind ??
Versteht ihr meine Frage ?
Die einzige Möglichkeit, die mir eingefallen ist, wäre bei jedem Neuanlegen von Daten (wie zum Beispiel einen Kunde in der Tabelle "Kunden") werden diese Informationen nochmal in eine Temp Tabelle geschrieben. WEnn ich dann einen Datenaustausch mache, werden alle Daten aus der Temp Tabelle in die DB des jeweils anderen Rechners übertragen. Doch diese Möglichkeit hat natürlich den Nachteil, dass Einträge (Kundennummer,...) doppelt vergeben werden können und es somit zu Verwechselungen kommen kann.
Gibt es vieleicht dafür eine Komponente, und wenn ja - wie funktioniert diese ?

Würde mich über Hilfe von euch freuen.

Mfg cyberax
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 03.10.06 21:24 
Ei ei ei. Du mußt viel konkreter werden. Das ganze ist relativ leicht mit Firebird realisierbar (von der Theorie her zumindest), aber da gehören gewisse und zwar umfangreiche Vorarbeiten dazu. War es nicht sogar DaimlerChrysler ? :gruebel: Habe jedenfalls mal gehört, daß irgendeine große deutsche Fa. die Daten des Außendienstes mit Firebird so behandelt. Datenabgleich usw. -> Suchen

Da fängts halt an. Das Thema ist schon interessant, aber von alleine geht so was nicht. Und dann noch mit Zeos ? 8) Oh je, verschone mich besser mit dem Kram. :lol: Es wird kaum ausbleiben, da wirklich alles aus der DB rauszukitzeln. Die MGA spielt da auch eine wichtige Rolle und die gibts nun mal nur bei IB/FB. Mit Zeos würde ich gar nicht erst anfangen. Doubletten sind dabei relativ leicht abzufangen und eher das geringste Problem. Da muß eben notfalls mit %LIKE% beim eintragen von Datensätzen mal danach geguckt werden. Und das Programm muß dann Warnug bringen oder eine tipfehlerbehaftete User-Eingabe akzeptieren. Also wäre Nacharbeit angesagt.

_________________
Gruß
Hansa
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 03.10.06 21:34 
Das wichtigste ist für jeden Datenbestand einen eigenen ID-Bereich zu deklarieren, so daß keine doppelten Primärschlüssel entstehen. Auf die Temp-Tabelle kannst du defintiv verzichten.

@hansa: Warum soll das mit Zeos nicht gehen? Und was hat das mit MGA zu tun?

_________________
Markus Kinzler.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 03.10.06 23:21 
user profile iconmkinzler hat folgendes geschrieben:
Das wichtigste ist für jeden Datenbestand einen eigenen ID-Bereich zu deklarieren, so daß keine doppelten Primärschlüssel entstehen. Auf die Temp-Tabelle kannst du defintiv verzichten.

@hansa: Warum soll das mit Zeos nicht gehen? Und was hat das mit MGA zu tun?


Zuerst zur zweiten Frage, die geht nämlich etwas tiefer : es ging mir dabei eher darum, ob Zeos (als Universal-Komponenten) für spezielle Zwecke, wie hier, benutzt werden können. SQL = SQL kann man so nicht einfach sagen. Beispiel Interbase/FB : die Transaktionen sind durchnummeriert. Je neuer umso höhere Nummer (über MGA). Es gibt verschiedene DB-Zustände und einen Haufen an Parametern, die man zur Transaktions-Steuerung je nach Fall setzen muß. Unterstützt Zeos das überhaupt ? Da habe ich erhebliche Bedenken, wie man so was mit anderen DBs unter einen Hut bringen kann. Der ADS local Server hat z.B. keinerlei Transaktionsunterstützung. MySQL < 5 (4 ?) hat keine Trigger oder SPs.

Gut, gut ist auch eher Theorie, wie gesagt die Frage ist etwas vage. Geht es um die Abgleichung der eigenen CD-Sammlung mit der von der Freundin, dann kann man ja ruhig rumfriemeln.

Macht mans richtig, dann aber nicht einfach über irgendwelche Nummernkreise oder aus zusammengesetzten Primärschlüsselfeldern. Eher geht man hin und überprüft, ob der DS schon da ist und bringt dem User eine dementsprechende Anzeige. Eine eindeutige ID erzeugt schließlich jeder richtige Trigger.

_________________
Gruß
Hansa
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Do 05.10.06 17:35 
Zitat:

Und dann noch mit Zeos ? Oh je, verschone mich besser mit dem Kram.
Also bin bis jetzt eigentlich sehr zufrieden mit ZEOS. Zumindest besser als die BDE Komponenten.
Also es geht nicht einfach um eine CD Sammlung sondern die DB einer (kleinen) Firma. Die Synchronisation würde zwei Tabellen umfassen -> eine Tabelle "kunden" und eine Tabelle "angebote".
Bei der Kundentabelle könnte ich ja Name, Ort, Vorname,....(halt so viel Daten wie möglich) vergleichen und wenn der Kunde in der jeweils anderen Tabelle schon existiert eine Meldung bringen, ob eine neue Kundennummer vergenen werden soll, oder wie's weiter gehen soll.
Das mit einer Meldung wäre auch ok. Wäre auch für die andere Tabelle i.O., aber da ist es schon bissel kritischer, da ja Angebotsnummern fortlaufent sein sollen....

Zitat:
Auf die Temp-Tabelle kannst du defintiv verzichten.
das bedeutet also, bei der Synchronisation "einfach" ALLE Daten zu vergleichen und sich so die Temp Tabelle zu sparen?

Zitat:

Das wichtigste ist für jeden Datenbestand einen eigenen ID-Bereich zu deklarieren, so daß keine doppelten Primärschlüssel entstehen.

Wie meinst du das ? Bin (noch) so konform mit Datenbanken. Also habe - um bei den Beispielen zu bleiben - in jeder Tabelle einen Primärschlüssel vergeben. Aber wie deklariere ich den ID Bereich ? Wie meinst du das ? Wo/wie könnten doppelte Primärschlüssel eintstehen?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 05.10.06 18:11 
Zitat:
Wie meinst du das ? Bin (noch) so konform mit Datenbanken. Also habe - um bei den Beispielen zu bleiben - in jeder Tabelle einen Primärschlüssel vergeben. Wie meinst du das ? Wo/wie könnten doppelte Primärschlüssel eintstehen?
Wenn du 2 Rechner gleichen Datenbestand hast, und auf den Rechnern jeweils einen Datensatz erzeugst, haben diese die gleiche ID, wenn du keine Vorsichtsmaßnahmen betreibst.
Zitat:
Aber wie deklariere ich den ID Bereich ?
Du mußt einfach auf den verschiedenenen Rechner ID in einem anderen Wertebereich erzeugen. dazu wählt man am Besten BIGINT( INT64: 64Bit) als Datentyp für das ID-Feld. Diese kannst du dann logisch aufteilen (z.B. die oberen 4-Bits (16-Rechner) oder 8 Bit(256 Rechner) als Clientabhängigen Bereich) den Rest als laufende Nummer.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Fr 06.10.06 17:57 
Zitat:

Du mußt einfach auf den verschiedenenen Rechner ID in einem anderen Wertebereich erzeugen. dazu wählt man am Besten BIGINT( INT64: 64Bit) als Datentyp für das ID-Feld. Diese kannst du dann logisch aufteilen (z.B. die oberen 4-Bits (16-Rechner) oder 8 Bit(256 Rechner) als Clientabhängigen Bereich) den Rest als laufende Nummer.


Teil ich das mit dem Trigger auf ? Also indem ich sozusagen den "Startwert" einstelle.. so...
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
AS
BEGIN
  IF ((NEW.KUNDENNR IS NULL) or (NEW.KUNDENNR = '')) THEN
    NEW.KUNDENNR = GEN_ID(GEN_KUNDEN_NR,64);
END


würde es beispielsweise für den x-ten Rechner aussehen. Wenn er einen neuen Kunde anlegt bekommt dieser die Kundennummer 64+x ! Richtig? Meintest du das so?

Und wie bzw. mit welcher Procedur übernehm ich die dann die Daten von einer DB in die andere ?
Bis jetzt habe ich immer die eine durchlaufen lassen, die Werte verglichen und nicht identische/neue Einträge in die andere DB eingetragen.

Würdest du das auch so machen, oder anders ?

Mfg cyberax
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 06.10.06 18:14 
Gib den Kunden eine weltweit eindeutige ID (GUID). Du kannst eine GUID auf jedem Windows-PC erstellen (wie, weiss ich nicht, googel mal oder such bei Microsoft).

Damit weisst Du dann, welche Kunden Du wo einfügen musst. Erstelle auf jeder DB außerdem eine Logdatei, in der steht, welche Datensätze verändert wurden. Die fässt Du dann auch im Rahmen des Synchronisationsvorganges auch an. Eigentlich simpel.

Alternativ kaufst Du für wenig Geld ein Synchronisatiostool (z.B. redgate Data compare) und lässt diese SW die Arbeit machen.

_________________
Na denn, dann. Bis dann, denn.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 06.10.06 18:19 
Dein Trigger erhöht einfach um 64 anstatt 1. Das würde trotzdem zu mehrfachen ID führen!

www.ibphoenix.com/ma...;page=ibp_repl_tools

_________________
Markus Kinzler.
delphiDeveloper
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Fr 06.10.06 20:19 
Titel: Synchronisation von Tabellen
Im vorletzen Entwickler Heft war ein Artikel von Holger Klemt zur Replikation.

Ich habe schon verschiedene Replikationen uni- und bidirektional programmiert.

Folgendes sollte man dabei berückichtigen:

1.) Wie schon erwähnt disjunkte Nummernkreise für die PKs
2.) Evtl. ebenso für die Kdnr
3.) Bei eindeutigen aufsteigenden lückenlosen Rechnungsnummersequenzen wirds noch kniffliger
4.) Konfliktmananagement:
-Was passiert wenn zwei Filialen einen Kundensatz gleichzeitig ändern
-FK Verletzungen z.B Filiale A löscht aus einer Lookuptabelle mit FK einen Datensatz, und Filiale B erzeugt einen
neuen Kundensatz der gerade diese Datensatz aus der Lookuptabelle verwendet und will diesen an Filiale a schicken
5.) Replikation auf Feld- oder Datensatzebene
6.) Du hast von temp. Tabellen gesprochen so was ähnliches brauchst du auch für das Logging der Änderungen.
7.) Replikationsengine als Dienst oder App
8.) Replikationsmodell: Filiale A <-> Filiale B <-> Filiale C oder eine Zentrale die alle Filialen bedient

Ein Ansatz wäre folgender:

In AI,AU und AD Triggern der zu replizierenden Tabellen werden die Aenderungen in der Log Tabelle protokoliiert und
diese Log Tabelle muss dann an die anderen Clients weitergereicht werden.
Damit beim Replizieren die Aenderungen nicht wieder durch die Trigger in die Log Tabelle kommen arbeitet der Replikationsdienst am besten mit einer eigenen Userkennung die man dann in den Triggern abfragen kann.
Ein typischer Firebird Trigger sähe etwa so aus:

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
CREATE TRIGGER IBE$ECC_CUSTOMER_AI FOR ECC_CUSTOMER
ACTIVE AFTER INSERT POSITION 32000
AS
BEGIN
  IF ((GEN_ID(REPLIKATION_ON, 0) = 1) AND (USER <> 'REPLICAT')) THEN
    INSERT INTO REP_LOG (RL_TABLE_NAME, RL_TABLE_ID, RL_EVENT_TYPE,RL_TIMESTAMP, RL_ID_FIELD)
      VALUES('ECC_CUSTOMER', NEW.ID, 'I',CURRENT_TIMESTAMP,'ID');
END


Der Trigger schlägt also nur zu wenn der Generator REPLIKATION_ON (Schalter an/aus der Replikation) 1 ist und der Insert nicht vom User REPLICAR stammt. Dann wird ein Eintrag in der RepLog Tabelle gemacht, die später dann durch den Replikationsdienst abgearbeitet wird.


Schau dir mal bei IBexpert den LogManager an, der kann einem beim Erstellen der Trigger helfen. Ebenso kann man die Schablonen bei IBExpert individuell gestalten.
Gruss
DD
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Sa 07.10.06 18:45 
Also vielen Dank für eure Hilfe!
Leider fehlt mir zu einigen Sachen noch das Wissen um alle zu verstehen oder anzuwenden.

Aber versuch mich mal mit Hilfe eurer Infos reinzufitzen.
Gruß cyberax