FolderReferences – In welchem Ordner befindet sich ein Dokument?
Herzlich Willkommen!/Tipps & Tricks/FolderReferences – In welchem Ordner befindet sich ein Dokument?

FolderReferences – In welchem Ordner befindet sich ein Dokument?

 
Inhaltsverzeichnis
 

1. Einleitung


Werden Dokumente in Folder (Ordner) verschoben, so ist es erst einmal nicht möglich, im Dokument zu sehen in welchem Folder es liegt.
Seit R5 gibt es allerdings die FolderReferences property, mit dieser ist es z.B. möglich herauszufinden, in welchem Folder welches Dokument liegt. Dabei werden automatisch in Felder des Dokumentes die jew. Ordner-Referenzen geschrieben, sobald ein Dokument in einem Ordner abgelegt wird.
 

2. Warum das ganze? Beispiele zum Einsatz


  • Schablonenupdate oder sonstige Modifikationen am MailfileIn der Vergangenheit ist wohl leider schon vielen Administratoren bei einem Releasewechsel (und dadurch u.a. verbunden ein Schablonenwechsel des Mailfiles) passiert, dass vorher sauber in Ordner abgelegte Dokumente nun plötzlich „verschwunden“ sind und nur noch in der $All – Ansicht sichtbar.
  • Mehrere (Mail-)Datenbanken zu einer zusammenführenBisher war es sehr aufwändig, z.B. die Dokumente von Mailfile A strukturiert in Mailfile B zu übernehmen. Auch hier kann FolderReferences wertvolle Dienste erweisen.
  • Sicherheit durch WiederherstellbarkeitEs können beispielsweise nicht reproduzierbare Fehler auftreten, bei denen z.B. Dokumente plötzlich nicht mehr in den Ordnern erscheinen. Auch hier besteht dann die Möglichkeit, per Mausklick alles wieder herzustellen.
 

3. Erstkonfiguration


3.1 Ansichten $FolderInfo und $FolderRefInfo

Grundsätzlich ist 'Folder References' in jeder Datenbank ab R5 möglich. Allerdings sind hierzu zwei versteckte Ansichten der R5 oder R6 – Mailschablone nötig:
$FolderInfo $FolderRefInfo
Diese Ansichten müssen in die Datenbank, in der ‚Folder References‘ verwendet werden soll, kopiert werden.

3.2 FolderReferences aktivieren

Die FolderReferences sind grundsätzlich deaktiviert. Eine Aktivierung in einer Datenbank muss per Lotus Script erfolgen; eine Datenbank-Option, in der man per Mausklick die FolderReferences aktivieren kann, gibt es nicht!
Hier ein Beispiel-Script, welches man z.B. in eine Aktionsschaltfläche aufnehmen kann:
Sub Click(Source As Button) Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase If db.FolderReferencesEnabled Then If Messagebox ("Folder References are enabled." & Chr(10) & Chr(10) _ & "Do you want to disable the Folder References?" ,1 + 32,db.title) = 1 Then db.FolderReferencesEnabled = False Messagebox "Disabled Folder References now.....", 64, db.title Else Exit Sub End If Else If Messagebox ("Folder References are disabled." & Chr(10) & Chr(10) _ & "Do you want to enable the Folder References?" ,1 + 32,db.title) = 1 Then db.FolderReferencesEnabled = True Messagebox "Enabled Folder References now.....", 64, db.title End If End If End Sub
Eine weitere Möglichkeit wäre es, "db.FolderReferencesEnabled = True" generell im Postopen-Ereignis der Datenbank zu platzieren bzw. folgende If-Abfrage zu erstellen:
Sub Click(Source As Button) Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase If db.FolderReferencesEnabled Then Exit Sub db.FolderReferencesEnabled = True End If End Sub
 

4. Nachträgliches Setzen der FolderReferences


Im Internet wird oftmals fälschlicherweise die Meinung vertreten, es wäre nicht möglich, die Folder References nachträglich zu setzen.
Hier ein Beispiel-Script, welches man z.B. in eine Aktionsschaltfläche aufnehmen kann:
Sub Click(Source As Button) Dim session As New NotesSession Dim db As NotesDatabase Dim vec As NotesViewEntryCollection Set db = session.CurrentDatabase If Not Messagebox ("Do you really want to create references of all docs in all folders?",1+32, db.title) = 1 Then Exit Sub End If If Not db.FolderReferencesEnabled Then db.FolderReferencesEnabled = True End If Forall v In db.Views If v.isFolder Then Set vec = v.AllEntries Call vec.PutAllInFolder( v.Name ) End If End Forall Messagebox „Folder References are created…“, 64, db.title End Sub
Geschwindigkeit:
Mit einem Mailfile mit 240 Ordnern und 182.000 Dokumenten: 22 Minuten.
Der Test wurde durch Eknori auf einem Server durchgeführt:
– Client 6.5 de auf einem Laptop mit P4 3.2GHz / 768 MB Ram
– Server 6.5 en auf P4 3.2 GHz / 2 GB Ram
– Netzwerk Glasfaser 1GBit
 

5. Praktisches Arbeiten mit den FolderReferences


5.1 Ordner des aktuellen Dokumentes anzeigen

Hier ein Beispiel-Script für eine Aktionsschaltfläche in einer Ansicht oder einem Ordner. Damit wird in einer Messagebox angezeigt, in welchen Ordnern sich das ausgewählte Dokument befindet:
Sub Click(Source As Button) Dim session As New NotesSession Dim db As NotesDatabase Dim collection As NotesDocumentCollection Dim doc As NotesDocument Dim szReference As String Set db = session.CurrentDatabase Set collection = db.UnprocessedDocuments Set doc = collection.GetFirstDocument Forall r In doc.FolderReferences If r = "" Then Goto Empty szReference = r & Chr(10) & szReference End Forall While Not (doc Is Nothing) Msgbox "Folder References: " & Chr(10) & Chr(10) & szReference, 64, db.title Set doc = collection.GetNextDocument(doc) 'Nächstes Dokument Wend Exit Sub Empty: Msgbox „No References in this document….“, 64, db.title End Sub

5.2 Ansicht "Dokument" | "Folder"

In einer Ansicht die FolderReferences darzustellen ist leider nicht ohne Vorarbeit möglich, da @DBLookups etc. in Ansichten nicht erlaubt sind.
Daher müssen im Vorfeld in den jew. Dokumenten in ein separates Feld (im Beispiel unten wurde das Feld „FolderName“ gewählt) die Foldernamen geschrieben werden.

5.2.1 Beispiel für einen Agenten oder eine Aktionsschaltfläche

Dim session As New notessession Dim db As NotesDatabase Dim dc As NotesDocumentCollection Dim doc As NotesDocument Set db = session.CurrentDatabase Set dc = db.allDocuments Set doc = dc.GetFirstDocument Do While Not doc Is Nothing If Not doc.FolderReferences(0) = "" Then doc.FolderName = doc.FolderReferences Call doc.save (False,False) End If Set doc = dc.GetNextDocument(doc) Loop

5.2.2 Postsave Script für neue Dokumente

Dim session As New notessession Dim db As NotesDatabase Dim uiws As New NotesUIWorkspace Dim uidoc As NotesUIDocument Dim newuidoc As NotesUIDocument Dim session As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Set db = session.CurrentDatabase Set uidoc = uiws.CurrentDocument Set doc = uidoc.Document If Not doc.FolderReferences(0) = "" Then doc.FolderName = doc.FolderReferences Call doc.save (False,False) End if

5.2.3 View erstellen

Eine neue View erstellen mit 2 Spalten:
1. Spalte
z.B. Subject, aufsteigend sortiert
2. Spalte
FOLDERNAME (multi-value-separator: New line),
View-Eigenschaften: Lines per row: 9

5.2.4 Refresh-Button für die View

Sub Click(Source As Button) Dim uiws As New NotesUIWorkspace Dim session As New notessession Set db = session.CurrentDatabase Set dc = db.allDocuments Set doc = dc.GetFirstDocument Do While Not doc Is Nothing If Not doc.FolderReferences(0) = „“ Then doc.FolderName = doc.FolderReferences Call doc.save (False,False) End If Set doc = dc.GetNextDocument(doc) Loop Call uiws.ViewRefresh End Sub
ACHTUNG: Dieser Refresh-Button ist keine Traum-Lösung, da alle Dokumente aktualisiert werden, was durchaus einige Minuten dauern kann!

5.3 Wiederherstellung der Dokumente

Folgendes Script-Beispiel stellt sämtliche Dokumente wieder in die entsprechenden Ordner. Ist der Ordner nicht vorhanden, so wird er erstellt. Bedingung vor der Ausführung des Scripts ist aber, dass im Array-Feld "FolderName" die ursprünglichen Folder stehen.
Sub Click(Source As Button) Dim session As New NotesSession Dim db As NotesDatabase Dim collection As NotesDocumentCollection Dim doc As NotesDocument Dim item As NotesItem Set db = session.CurrentDatabase Set collection = db.AllDocuments If Not Messagebox ("Do you really want to restore all documents?", 1+32, db.title) = 1 Then Exit Sub Set doc = collection.GetFirstDocument() While Not (doc Is Nothing) If Not doc.FolderName(0) = "" Then Set item = doc.GetFirstItem( "FolderName" ) Forall v In item.Values Call doc.PutInFolder (v, True) End Forall End If Set doc = collection.GetNextDocument(doc) Wend Messagebox "Documents have been restored", 64, db.title End Sub

5.4 Weitere hilfreiche Scripts

5.4.1 Alle Ordner einer Datenbank löschen

Folgendes Beispiel-Script, welches man z.B. in eine Aktionsschaltfläche aufnehmen kann, löscht alle Ordner in einer Datenbank:
Sub Click(Source As Button) Dim session As New NotesSession Dim db As NotesDatabase Dim view As NotesView Set db = session.CurrentDatabase If Not Messagebox ("Do you really want to delete all folders in this database?", 1+32, db.title) = 1 Then Exit Sub Forall v In db.Views If v.isFolder Then Set view = v Call view.Remove End If End Forall Messagebox "Folders have been deleted now.", 64, db.title End Sub
ACHTUNG: Hier werden wirklich ALLE Ordner gelöscht, also z.B. auch die $Inbox im Mailfile!
 

6. Umsetzung der Beispiel-Scripts


Jetzt kommen wir wohl zum interessantensten Teil dieser Abhandlung.
 
Ich nehme ein Beispiel, das wohl öfter vorkommen wird:
Aufgrund eines Releasewechsel werden die Mailschablonen upgedatet. Der Administator möchte jedoch alle Vorkehrungen treffen – sollte beim Schablonenupdate etwas schief laufen, wären ja u.U. sämtliche Ordner 'zerstört' bzw. die Dokumente nicht mehr in den Ordnern vorhanden.
Zur Vorbereitung kann also der Admin folgende Scripts ausführen:
1. Nachträgliches Setzen der Folder References (siehe Pkt. 4)
2. Folder-Namen in das Feld „FolderName“ schreiben (siehe 5.2.1)
3. Folder References deaktivieren und die Items „$FolderRef“, „$FolderRefFlags“ und „$FolderRefID“ löschen
Jetzt kann das Schablonenupdate ohne Gefahr erfolgen. Sämtliche Ordner-Namen stehen im Feld „FolderName“ der einzelnen Dokumente.
Letzter Schritt:
4. Wiederherstellung der Dokumente (siehe 5.3)
 

7. Festgestellte Probleme


Wenn FolderReferences aktiviert ist, Dokumente in Ordnern abgelegt werden, und diese Ordner gelöscht werden, bleiben die FolderReferences (sind ID’s) in den Dokumenten erhalten – will man allerdings die Folder abfragen über doc.FolderReferences, dann kommt die Fehlermeldung „Document has been deleted“. Ich erkläre mir das so, dass der Ordner nicht mehr vorhanden ist.
Daher sind m.E. gerade im Mailfile, wo viel mit Ordnern gearbeitet wird, hier entsprechende Vorkehrungen zu treffen. Ich persönlich empfehle es nicht, die Folder References per Default zu aktivieren. Vielmehr würde ich diese als Backup- und Wiederherstellungsfunktion nutzen (siehe Kap. 6).
 
Vielen Dank für diesen Tipp an:
Matthias (TMC)
eMail: atnotes@gmx.de