Komplettlösung Teil 2 / 2
5. Praktisches Arbeiten mit den Folder References5.1 Ordner des aktuellen Dokumentes anzeigenHier ein Beispiel-Script für eine Aktionsschaltfläche in einer Ansicht oder 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 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 erstellenEine 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 refreshed werden, was durchaus einige Minuten dauern kann!
5.3 Wiederherstellung der DokumenteFolgendes 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 Scripts5.4.1 Alle Ordner einer Datenbank löschenFolgendes 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-ScriptsJetzt 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 'zertsö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 ProblemeWenn 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).