Function DE Version 4.50

@PushAndReplace

Database NotesAdmin NotesSystem Replication

Syntax

@PushAndReplace(FROMDBHANDLE1;TODBHANDLE2;FORMULA3;FN4;NOTECLASSES5;FNREPLICATIONFLAGS6;FNLISTERROR7;TEXTLISTActKey;TEXTLISTKeyFieldName;TEXTLISTReplaceFieldName;TEXTLISTTargetFieldName;FNLISTTargetFieldFlags;FNLISTOperationFlags;TEXTLISTDefaultFieldName;TEXTLISTDefaultValue;TEXTRemoveFieldNamesFieldName;TEXTLISTRemoveFieldNames);

Beschreibung

Diese @Function stellt einen speziellen One-Way-Replikator mit zusätzlicher Replace-Logik bereit. Sie ist aus einer kundenprojektspezifischen Anforderung entstanden und ist nicht als Ersatz für die klassische Domino-Replikation gedacht. Sie dient Sonderfällen, in denen Dokumente kontrolliert von einer Quelldatenbank in eine Zieldatenbank übertragen und dabei bestimmte Feldinhalte im Zieldokument anhand von Key-/Replace-Listen angepasst werden müssen.

Repliziert Dokumente aus der durch FROMDBHANDLE1 referenzierten Datenbank in die durch TODBHANDLE2 referenzierte Datenbank.

Die Replikation erfolgt nur in Richtung FROMDBHANDLE1 nach TODBHANDLE2. Es werden nur die Dokumente berücksichtigt, die der Notes-kompatiblen Selection Formula FORMULA3 entsprechen und zu den in NOTECLASSES5 angegebenen Dokumentklassen gehören.

Die Datenbanken müssen keine Repliken voneinander sein.

Nach der Replikation eines Dokuments in die Zieldatenbank wird das dort erzeugte oder aktualisierte Dokument anhand der angegebenen Key-, Replace-, Target- und Default-Listen verändert.

Die Listen

TEXTLISTActKey,
TEXTLISTKeyFieldName,
TEXTLISTReplaceFieldName,
TEXTLISTTargetFieldName,
FNLISTTargetFieldFlags,
FNLISTOperationFlags,
TEXTLISTDefaultFieldName und
TEXTLISTDefaultValue

gehören positionsweise zusammen. Das bedeutet: Die jeweils gleich positionierten Elemente dieser Listen bilden zusammen eine Replace-Regel.

Für jede dieser Replace-Regeln wird im replizierten Zieldokument folgende Logik ausgeführt:
1. Aus TEXTLISTKeyFieldName wird der Name eines Feldes entnommen. Dieses Feld muss im aktuellen Zieldokument als TEXT oder TEXTLIST vorhanden sein. In diesem Feld wird nach dem zugehörigen Key aus TEXTLISTActKey gesucht.
2. Wird der Key gefunden, wird aus dem Feld, dessen Name aus TEXTLISTReplaceFieldName entnommen wird, das Element an derselben Listenposition gelesen.
3. Der so ermittelte Wert wird in das Feld geschrieben, dessen Name aus TEXTLISTTargetFieldName entnommen wird. Die Field Flags für dieses Zielfeld werden aus FNLISTTargetFieldFlags entnommen.

Wird der Key nicht gefunden, wird ein Default-Wert verwendet.
Dazu wird zunächst geprüft, ob im aktuellen Zieldokument ein Feld mit dem Namen aus TEXTLISTDefaultFieldName existiert. Falls dieses Feld vorhanden ist und den Datentyp TEXT oder TEXTLIST hat, wird dessen Inhalt als Ersatzwert verwendet.
Falls dieses Feld nicht existiert, wird der entsprechende Wert aus TEXTLISTDefaultValue verwendet.
Über FNLISTOperationFlags kann gesteuert werden, ob ausschließlich der Default-Text, ausschließlich das Default-Feld oder automatisch zuerst das Default-Feld und danach der Default-Text verwendet werden soll.

Nachdem alle Replace-Regeln erfolgreich angewendet wurden, werden Hilfsfelder aus dem Zieldokument entfernt.
Zunächst wird aus dem Feld mit dem Namen TEXTRemoveFieldNamesFieldName eine Liste von Feldnamen gelesen. Diese Felder werden aus dem aktuellen Zieldokument gelöscht.
Anschließend werden zusätzlich alle Felder gelöscht, deren Namen in TEXTLISTRemoveFieldNames angegeben sind.

Tritt während dieser Replace- und Bereinigungslogik ein Fehler auf, wird das betreffende Dokument nicht in die Datenbank TODBHANDLE2 repliziert. In diesem Fall wird das vierte Element der optionalen Fehlerliste FNLISTERROR7 um eins erhöht.

Im Fall eines Replizierkonflikts ist das Dokument in der Datenbank TODBHANDLE2 immer der Conflict Loser.

Die Funktion gibt eine FNLIST mit den Replikationsergebnissen zurück:
Element 1: Anzahl aktualisierter Dokumente in TODBHANDLE2
Element 2: Anzahl neu erstellter Dokumente in TODBHANDLE2
Element 3: Anzahl gelöschter Dokumente in TODBHANDLE2

FN4:
Bit   HEX   Bedeutung
01   0001   Lesen
02   0002   Schreiben
03   0004   Ändern
04   0008   Löschen

Hinweis:
Bei Replikationen mit asymmetrischer Rechtezuweisung kann es zu einem Verhalten kommen, das auf den ersten Blick widersprüchlich wirkt.
Beispiel: Datenbank A darf Dokumente nach Datenbank B replizieren. Datenbank B hat jedoch keine Löschrechte in Datenbank A.
Wird nun ein Dokument zunächst von A nach B repliziert und anschließend in B gelöscht, entsteht in B ein Deletion Stub. Dieser Deletion Stub bleibt bis zum CutOffTD der Datenbank erhalten; siehe hierzu auch @GetDBReplicaInfo.
Da B keine Löschrechte in A hat, wird die Löschung nicht von B nach A repliziert. Das ursprüngliche Dokument bleibt also in A weiterhin vorhanden.
Solange der Deletion Stub in B existiert, wird das in A noch vorhandene Dokument jedoch auch nicht erneut von A nach B repliziert. Für die Replikationslogik gilt das Dokument in B in diesem Zeitraum weiterhin als gelöscht.
Erst wenn der Deletion Stub in B nach Ablauf des CutOffTD entfernt wurde, kann das Dokument bei einer späteren Replikation wieder von A nach B übertragen werden. Dadurch kann es so wirken, als würde das Dokument plötzlich wieder in B erscheinen.
Dieses Verhalten entspricht dem Verhalten des Domino-Replicators bei asymmetrisch vergebenen Replikationsrechten.

NOTECLASSES5:
DEC   BIT   Bedeutung
00000   XX   No Notes   keine Dokumente
00001   01   Documents   Daten-Dokumente
00002   02   Policy-Note   Über-DB-Dokument
00004   03   Form-Note   Masken-Design-Dokumente
00008   04   View-Note   Ansicht-Design-Dokumente
00016   05   Icon-Note   Piktogramm-Dokument
00032   06   Design-Collection-Note   Ansicht-Dokumente
00064   07   ACL-Info-Note   ACL-Info-Dokument
00128   08   Help-Index-Note   
00256   09   Help-Note   Hilfe-DB-Dokument
00512   10   Filter-Note   Macro-Design-Dokumente
01024   11   Feld-Note   Feld-Design-Dokumente
02048   12   Replication-Note   Replikations-Dokumente
04096   13   Privat_Design   Privat-Design-Dokumente

32768   16   Default-Note of Each   Von jedem das Vorgabe-Dokument

32767   01-15   Notes   Alle Dokumente
32766   02-15   All Non-Document-Notes   Alle nicht Daten-Dokumente

Um mehrere Dokumentenklassen anzugeben werden die Werte der betreffenden Klassen addiert oder durch @BitVektor aufgebaut.

FNREPLICATIONFLAGS6:
Bit   HEX   Bedeutung
01   0001   Lokalisieren von Links (Doc;View;DB) in Datenbanken mit unterschiedlicher ReplicaID.

FNLISTERROR7:
Bei Verwendung des optionalen Return-Parameter FNLISTERROR7, wird in diesem eine Error-Statistik zurückgegeben.

Element   Bedeutung
1   Error UpdateCount TODBHANDLE2
2   Error CreateCount TODBHANDLE2
3   Error DeleteCount TODBHANDLE2
4   Error Replacer TODBHANDLE2

FNLISTOperationFlags:
DEC   BIT   Bedeutung
00001   01   Use only DefaultText *
00002   02   Use only DefaultField *

* Wenn keines dieser Bits gesetzt ist: wird, wenn möglich, das Default-Feld genutzt, anderenfalls der Default-Text.

FNLISTTargetFieldFlags:
DEC   BIT   Bedeutung
0001   01   SIGN
0002   02   SEAL
0004   03   SUMMARY
0008   04   
0016   05   SEALED
0032   06   READ/WRITE-ACCESS
0064   07   NAMES
0128   08   
0256   09   PLACEHOLDER
0512   10   PROTECTED
1024   11   READ-ACCESS

Um mehrere FieldFlags anzugeben werden die Werte addiert.

Beispiel: @PushAndReplace(FROMDBHANDLE1;TODBHANDLE2;FORMULA3;FN4;NOTECLASSES5;FNREPLICATIONFLAGS6;FNLISTERROR7;TEXTLISTActKey;TEXTLISTKeyFieldName;TEXTLISTReplaceFieldName;TEXTLISTTargetFieldName;FNLISTTargetFieldFlags;FNLISTOperationFlags;TEXTLISTDefaultFieldName;TEXTLISTDefaultValue;TEXTRemoveFieldNamesFieldName;TEXTLISTRemoveFieldNames)

FROMDBHANDLE1:=@OpenDB("REPL1.NSF");
TODBHANDLE2:=@OpenDB("REPL2.NSF");
FORMULA3:="SELECT @All";
FN4:=@BitVektor(1:2:3:4);
NOTECLASSES5:=1;
FNREPLICATIONFLAGS6:=1;
TEXTLISTActKey:="Key1":"Key3";
TEXTLISTKeyFieldName:="KeyList":"KeyList";
TEXTLISTReplaceFieldName:="ReplaceList":"ReplaceList";
TEXTLISTTargetFieldName:="Target1":"Target2";
FNLISTTargetFieldFlags:=1092:100;
FNLISTOperationFlags:=0:0;
TEXTLISTDefaultFieldName:="DefaultFieldName1":"DefaultFieldName2";
TEXTLISTDefaultValue:="DefaultValue Key1":"DefaultValue Key2";
TEXTRemoveFieldNamesFieldName:="RemoveFieldsList";
TEXTLISTRemoveFieldNames:="";
Ret:=@PushAndReplace(FROMDBHANDLE1;TODBHANDLE2;FORMULA3;FN4;NOTECLASSES5;FNREPLICATIONFLAGS6;FNLISTERROR7;TEXTLISTActKey;TEXTLISTKeyFieldName;TEXTLISTReplaceFieldName;TEXTLISTTargetFieldName;FNLISTTargetFieldFlags;FNLISTOperationFlags;TEXTLISTDefaultFieldName;TEXTLISTDefaultValue;TEXTRemoveFieldNamesFieldName;TEXTLISTRemoveFieldNames);
@LogReport(Ret;3);
@LogReport(FNLISTERROR7;3);

TODBHANDLE2:=@CloseDB(TODBHANDLE2);
FROMDBHANDLE1:=@CloseDB(FROMDBHANDLE1);

Die Dokumente aus der DB mit dem DBHANDLE FROMDBHANDLE1 werden in die DB mit dem DBHANDLE TODBHANDLE2 repliziert und verändert.

1.Beispiel für ein Dokument und dessen Änderung:

Dokument in DB1:
Feldname   Datentyp   FieldFlags   Inhalt (Listenseperator Semikolon)
KeyList   TEXTLIST   4   Key1;Key2;Key3
ReplaceList   TEXTLIST   4   User1;User2;User3
RemoveFieldsList   TEXTLIST   4   KeyList;ReplaceList;RemoveFieldsList
Form   TEXT   4   Test

repliziertes (und geändertes) Dokument in DB2:

Feldname   Datentyp   FieldFlags   Inhalt (Listenseperator Semikolon)
Target1   TEXT   1092   User1
Target2   TEXT   100   User3
Form   TEXT   4   Test

2.Beispiel für ein Dokument und dessen Änderung:

Dokument in DB1:
Feldname   Datentyp   FieldFlags   Inhalt (Listenseperator Semikolon)
KeyList   TEXTLIST   4   Key2;Key3;Key4
ReplaceList   TEXTLIST   4   User2;User3;User4
DefaultFieldName1   TEXT   4   DefaultUser1
RemoveFieldsList   TEXTLIST   4   KeyList;ReplaceList;RemoveFieldsList;DefaultFieldName1
Form   TEXT   4   Test

repliziertes (und geändertes) Dokument in DB2:

Feldname   Datentyp   FieldFlags   Inhalt (Listenseperator Semikolon)
Target1   TEXT   1092   DefaultUser1
Target2   TEXT   100   User3
Form   TEXT   4   Test

3.Beispiel für ein Dokument und dessen Änderung:

Dokument in DB1:
Feldname   Datentyp   FieldFlags   Inhalt (Listenseperator Semikolon)
KeyList   TEXTLIST   4   Key2;Key3;Key4
ReplaceList   TEXTLIST   4   User2;User3;User4
RemoveFieldsList   TEXTLIST   4   KeyList;ReplaceList;RemoveFieldsList
Form   TEXT   4   Test

repliziertes (und geändertes) Dokument in DB2:

Feldname   Datentyp   FieldFlags   Inhalt (Listenseperator Semikolon)
Target1   TEXT   1092   DefaultValue Key1
Target2   TEXT   100   User3
Form   TEXT   4   Test

Hinweis zu diesen Beispiel-Dokumenten:
Felder die für das Verständnis der Replace-Logik nicht erforderlich sind ($UpdatedBy, $Revisions …) wurden nicht aufgeführt.