Vergleich von Zeitstempeln
a) Einsatz von
NotesView
Die Idee: Man öffnet die Ansicht und hat Zeitstempel (Erstelldatum; letzte Änderung) des jeweiligen gemeinsamen Gestaltungselementes und der privaten Kopie.. Klingt gut, ist es aber nicht!
So erhält man mit
Dim view as NotesView
set view = db.getView ("Meine Ansicht")
jeweils die gemeinsame Ansichtsvorlage, wenn die private Kopie nicht existiert, jedoch die private Kopie des Ansicht, wenn diese exisiert. Somit kann man im Regelfall (wenn die private Kopie NICHT existiert) nicht auf die gemeinsame Vorlage zu Vergleichszwecken zugreifen.
Ergebnis: Nicht praktikabel !
b) Einsatz von
NotesDatabase.Views
Die Idee: Man arbeitet alle Ansichten (gemeinsame Vorlagen und private Kopien) einer Datenbank ab und muss die jeweiligen Exemplare (Vorlage / Kopie) einander zuordnen, um sie zu vergleichen.. Das muĂź doch gehen!
So durchsucht folgendes Skript die Datenbank nach Ordnern mit dem AliasNamen "F2-DE" und listet jeweils die Universal-ID der Gestaltungselemente auf:
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim vViewNames As Variant
Set db = s.Currentdatabase
ForAll v In db.Views
Set view = v
vViewNames = view.Aliases
If Not IsEmpty (vViewNames) then
If vViewNames(0) = "F2-DE" Then
If Not IsEmpty (view.Readers) Then
MessageBox |Private Kopie des Ordners "F2" gefunden: | & view.Universalid
Else
MessageBox |Gemeinsame Vorlage des Ordner "F2" gefunden: | & view.Universalid
End If
End If
End If
End ForAll
End Sub
Interessant und noch nicht vollständig erforscht: Dieses Skript findet sogar private Kopien von Ordnern (in Datenbank gespeichert), welche der Domino Designer nicht anzeigt! Nach anfänglicher Begeisterung über diesen Lösungsansatz, habe ich dieses Skript gegen eine große produktive Datenbank laufen lassen und musste feststellen, dass jeweils beim Zugriff auf ein Ansichtsobjekt die Ansichtsindizes aktualisiert werden, um nur auf unwesentliche Merkmale der Ansicht zuzugreifen. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Öffnen der Datenbank einsetzen. In meinen Testfällen habe ich teilweise 15 Sekunden warten müssen, bevor ich mein Ergebnis hatte.
Hinweis: Es ist darauf zu achten, NICHT auf die gemeinsame Vorlage der Ansicht/des Ordners zuzugreifen, da dieses einen Laufzeitfehler 4005 "Index is not to be generated on server" verursacht. Somit ist stets z.B. mit
isEmpty(view.Readers)
zu prüfen, dass auf eine private Kopie zugegriffen wird (die Prüfung anderer Attribute ist nicht möglich). Ergebnis: Zu langsam für den Produktionsbetrieb!
b) Einsatz von
NotesNoteCollection>
Die Idee: Man kann doch die Gestaltungselemente sammeln und auf diese als NotesDocument zugreifen!. So erhalte ich Informationen zum Gestaltungselement, ohne den Indexer zu triggern!
Schon häufig habe ich mit der
NotesNoteCollection
Klasse auf Gestaltungslemente (Ansichten, Felder, Agenten, Teilmasken) zugegriffen und hierfür u.A. auch eine Selektionsformel einsetzen können, nach Elementen mit speziellen Attributen zu suchen. So würde ich mit den Werten des "$Flags" Items auf bestimmte Ansichts-/Ordner-Typen zugreifen und mit Auswertung des "$Readers" Felders den Eigentümer einer privaten Kopie identifizieren können. siehe dieses Codebeispiel ...
Beim Einsatz dieses Skriptes gegen eine groĂźe produktive Datenbank ist dieses schneller als das zuvor, jedoch immer noch zu langsam, da eine Datenbanksuche angestoĂźen wird.. Ein echter Performance-Killer, wollte ich diese Logik in einem Datenbank-Script beim Ă–ffnen der Datenbank einsetzen.
Ergebnis: Besser, doch noch zu langsam für den Produktionsbetrieb! Vorteil: Ich kann die Namen der Ansichten/Ordner ermitteln, die ich behandeln möchte.
Einsatz eines Namensschemas
Nach intensiven Tests habe ich alle oben beschriebenen Lösungsansätze verworfen und mich für die Variante entschieden (welche in diesem Beitrag nicht näher beschrieben ist):
- Ich führe ein Namensschema (speziell für Ansichten, die lokal statt in der Datenbank gespeichert werden) ein und ändere die Namen der Gestaltungselemente, wenn ich diese aktualisiere
- Ich akzeptiere, durch Einführung eines Versionskennzeichens für die gesamte Anwendung, dass ich ggf. Elementen aktualisiere, deren Gestaltung sich zur Vorversion nicht geändert haben
Ergebnis: Sehr performant, da keinerlei PrĂĽfungen
Dieser Artikel ist Teil der Artikelserie: Gestaltungsaktualisierung privater Ansichten und Ordner stellt eine echte Herausforderung dar