Autor Thema: [Views&Folder] Folder References - In welchem Ordner ist das jeweilige Dokument?  (Gelesen 27001 mal)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Autor(en):             TMC
Stand:                   02.04.2004
Version:                1.01
Notes-Versionen:    5.x, 6.x
Atnotes-Thread(s): Thread


Inhalt

1. Einleitung
2. Warum das ganze - Beispiele zum Einsatz
3. Erstkonfiguration
    3.1 Ansichten $FolderInfo und $FolderRefInfo
    3.2 FolderReferences aktivieren
4. Nachträgliches Setzen der Folder References
5. Praktisches Arbeiten mit den Folder References
   5.1 Ordner des aktuellen Dokumentes anzeigen
   5.2 Ansicht "Dokument" | "Folder"
         5.2.1 Beispiel für einen Agenten oder Aktionsschaltfläche
         5.2.2 Postsave Script für neue Dokumente
         5.2.3 View erstellen
         5.2.4 Refresh-Button für die View
   5.3 Wiederherstellung der Dokumente
   5.4 Weitere hilfreiche Scripts
         5.4.1 Alle Ordner einer Datenbank löschen
6. Umsetzung der Beispiel-Scripts
7. Festgestellte Probleme


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 Mailfile
In 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 zusammenfahren
Bisher 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 Wiederherstellbarkeit
Es 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:

Code
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 "Enabeled 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 der Datenbank zu platzieren bzw. folgende If-Abrage erstellen:

Code
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 Folder References

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:
Code
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 

Dadurch werden nachträglich alle Folder References erzeugt.

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


/EDIT koehlerbv 2011-01-06: Invaliden Image-Link entfernt//
« Letzte Änderung: 06.01.11 - 23:23:51 von koehlerbv »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
5. Praktisches Arbeiten mit den Folder References

5.1 Ordner des aktuellen Dokumentes anzeigen

Hier 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:

Code
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
Code
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
Code
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
Code
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 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.
Code
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:
Code
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 '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 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).

« Letzte Änderung: 29.01.04 - 23:07:28 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz