====== Synchronisation ====== ===== Einzelzeilen-Sync ===== Wählen Sie eine Zeile im Diff-Grid und verwenden Sie: * **Kontextmenu > Nach Outlook übertragen** — DB-Werte in den Outlook-Kontakt * **Kontextmenu > In Datenbank übertragen** — Outlook-Werte in die DB Beide Aktionen sind auch über das Menu ''Synchronisation'' erreichbar. ---- ===== Massen-Sync (Auswahl) ===== Die Sync-Aktionen arbeiten mit der **Checkbox-Auswahl** im Grid: * Wenn **Zeilen gecheckt** sind: Nur die ausgewählten Zeilen werden synchronisiert * Wenn **keine Zeile gecheckt** ist: Nur die aktuell fokussierte Zeile ^ Menu-Eintrag ^ Aktion ^ | **Auswahl nach Outlook** | Gecheckte Zeilen → Outlook | | **Auswahl in Datenbank** | Gecheckte Zeilen → DB | | **Bidirektional abgleichen** | Composite-Sync (siehe unten) | Alle Massen-Aktionen zeigen einen **Bestätigungsdialog** vor der Ausführung. Die Statusleiste zeigt nach der Aktion die Anzahl übertragener Zeilen. ---- ===== Bidirektional abgleichen ===== Der bidirektionale Sync verwendet einen **Composite-Algorithmus** mit per-Relation Timestamp-Vergleich: - Für jeden Kontakt wird **jede Relation separat** verglichen (Root, STAdr, STTK...) - Wenn eine Seite **klar neuer** ist (>2s Differenz): Neuere Seite gewinnt - Wenn **unklar** (<2s oder kein Timestamp): "Leer verliert" — nicht-leere Felder füllen leere Felder auf - Wenn **beide nicht-leer und unterschiedlich**: Feld wird übersprungen, Meldung im Protokoll **Voraussetzung:** ''TimestampColumn'' muss in der Mapping-Konfiguration für jede Relation gesetzt sein, damit der Timestamp-Vergleich funktioniert. ---- ===== FK-Resolver-Dialog ===== Beim **INSERT** neuer Kontakte in die Datenbank müssen Fremdschlüssel-Werte (z.B. Firmen-ID für ''CompanyName'') aufgelöst werden. ==== Ablauf ==== - Die Engine versucht zunächst eine **automatische Auflösung** (exakte Suche nach Firmenname in der Parent-Tabelle). - Bei Mehrdeutigkeit oder keinem Treffer erscheint der **FK-Resolver-Dialog**: * Suchfeld mit Live-Filter * Grid mit Parent-Records (nur relevante Spalten, PK versteckt) * Doppelklick oder "Übernehmen" wählt den korrekten Wert ==== Bulk-Optionen ==== ^ Button ^ Wirkung ^ | **Übernehmen** | Wert für diesen Kontakt verwenden | | **Für alle übernehmen** | Gleichen Wert für alle Kontakte mit demselben Hinweis-Wert cachen | | **Überspringen** | Diesen Kontakt ohne FK-Zuordnung überspringen | | **Alle überspringen** | Alle verbleibenden unaufgelösten FK überspringen | | **Abbrechen** | Gesamten Sync-Lauf abbrechen | Die Info-Zeile zeigt: ''"... (12 weitere ohne Zuordnung)"'' damit Sie die Gesamtmenge einschätzen können. ---- ===== PK-Retrieval und Fill-Back ===== Nach jedem **INSERT** (egal welche Richtung) geschieht automatisch: - **PK-Retrieval:** Das INSERT-Statement verwendet ''OUTPUT INSERTED.[PK]'', um den generierten Primärschlüssel zurückzuerhalten. - **Fill-Back:** Alle leeren Felder werden von der Gegenseite aufgefüllt: * INSERT in DB → Outlook bekommt alle DB-Werte (inkl. FK-Display-Werte) * CREATE in Outlook → DB bekommt alle Outlook-Werte **Ergebnis:** Beim nächsten Diff sind beide Seiten identisch — keine Endlosschleifen oder Phantom-Diffs mehr. ---- ===== Denormalisierte Spalten (CopyColumns) ===== Manche Datenbank-Schemata enthalten **denormalisierte NOT-NULL-Spalten** in Child-Tabellen — z.B. trägt ''STTK'' (Telekommunikation) sowohl den Kontakt-FK (''IDSTAP'') als auch einen Gruppen-FK (''IDST'') aus der Wurzeltabelle. Beim INSERT in solche Child-Tabellen kopiert Outlook Sync diese Spalten **automatisch** per Subquery aus der Wurzeltabelle. Sie müssen dafür im Mapping-Designer unter **Beziehungen → CopyColumns** die betroffenen Spaltennamen eintragen. **Woran erkennen Sie das Problem?** Wenn beim Sync der Fehler "Cannot insert NULL into column … does not allow NULLs" auftritt, fehlt wahrscheinlich eine CopyColumn-Konfiguration in der betroffenen Relation. ---- ===== Sync-Richtung ===== ^ Richtung ^ Verhalten ^ | **Manuell (Diff anzeigen)** | Zeigt Diff-Grid — Benutzer entscheidet pro Zeile/Auswahl | | **DB → Outlook** | Alle DB-Änderungen automatisch nach Outlook | | **Outlook → DB** | Alle Outlook-Änderungen automatisch in die DB | ---- ===== Konflikt-Regel ===== Konflikte entstehen, wenn sich beide Seiten seit dem letzten Sync geändert haben. ^ Regel ^ Verhalten ^ | **Benutzer fragen** | Zeile wird orange markiert — Benutzer wählt Gewinner | | **DB gewinnt** | DB-Wert wird automatisch übernommen | | **Outlook gewinnt** | Outlook-Wert wird automatisch übernommen | | **Neuerer gewinnt** | Timestamp-Vergleich (erfordert ''TimestampColumn'' in Mapping) | ---- ===== Löschverhalten ===== ^ Verhalten ^ Beschreibung ^ Empfehlung ^ | **Ignorieren** | Gelöschte Datensätze werden übersprungen | Sicherste Option, Standard | | **Als gelöscht markieren** | Datensatz bleibt erhalten, wird aber markiert | Für Audit-Anforderungen | | **Auf Gegenseite löschen** | Datensatz wird auch auf der anderen Seite gelöscht | Nur mit Vorsicht verwenden | ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. — Outlook Sync// {{tag>outlooksync benutzer synchronisation bidirektional fk-resolver}}