So als Idee zur Synchronisieren...
Eine Tabelle mit Adressdaten (Namen, Strasse, PLZ, Ort, Land, Tel, EMail) wird unabhängig voneinander
auf Notebooks im Aussendienst befüllt und soll auf die gemeinsame Tabelle auf'm Server synchronisiert werden.
Alle Felder werden zu einem String verkettet und darüber ein Hashwert (MD4, MD5, SHA-40) errechnet:
Delphi-Quellcode:
//
hashstring := Trim(name1)+'|'+Trim(name2)+'|'+Trim(strasse)+'|'+...'|'+Trim(EMail);
hashvalue := HexString(CalcMD4(hashstring));
Der Hashvalue wird zusätzlich zu den Adressdaten in einem eigenen, indizierten Feld gespeichert.
Der Hashvalue muss nicht zwingend der Primärschlüssel der Tabelle sein, sondern ist ggf. nur ein
Surrogatschlüssel.
Die einzelnen Felder werden vor dem Zusammenbau mit Trim() bearbeitet, damit Leerzeichen am Anfang oder Ende keine Rolle spielen.
Es hängt vom Einzelfall ab, ob man zusätzlich auch noch UpperCase() anwenden sollte.
Das Trennzeichen (hier '|') ist wichtig, damit die Position der Felder fixiert wird.
Ausserdem wichtig: das Design der Tabelle muss von Anfang an passen; nachträgliches Hinzufügen von Felder
ist schwierig, da eine Kollision der Hashwerte droht.
Mit dem Hashvalue Feld gibt es ein eindeutiges Kriterium auf Grund dessen Synchronisiert werden kann.
Löschen von Datensätzen:
Die Datensätze werden nicht wirklich gelöscht, sondern nur mit dem Boolean-Feld "Deleted" markiert.
Alle Datensätze bleiben daher quasi für immer erhalten.
Diese können irgendwann mit
DELETE FROM AdressTabelle WHERE Deleted<>0
endgültig gelöscht werden.
Die Tabelle sieht dann also so aus:
Code:
PKey int
HashValue varchar(32)
LastChange DateTime
Created DateTime
Deleted Bool (oder TinyInt oder Byte)
Nutzdaten1 ....
Nutzdaten2 ....