====== 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}}