Das Notes Forum

Lotus Notes / Domino Sonstiges => Tipps und Tricks => Thema gestartet von: TMC am 02.01.04 - 18:29:04

Titel: In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 18:29:04
** EDIT **

Komplette Lösung siehe hier unter Best Practices: Best Practices Folder References (http://www.atnotes.de/index.php?board=26;action=display;threadid=13503)



Hi,

ich hab mich zu dem Thema "Wie finde ich heraus, in welchem Ordner Dokument XY liegt" mal etwas schlau gemacht  und ein paar Scripts geschrieben.

Damit dies überhaupt klappt, müssen die folgenden Ordner der R5 Mailschablone in die jew. DB kopiert werden:
- $FolderRef
- $FolderRefInfo

Außerdem muss vorher ein db.FolderReferencesEnabled = True ausgeführt werden.
Per Default werden keinerleid Infos in den Dokumenten gespeichert!

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

Nachträglich Folder References erzeugen

Nun hat man ggf. das Problem, dass db.FolderReferencesEnabled nicht enabled wurde und eine DB (z.B. Mailfile) u.U. viele tausend Dokumente hat ohne jeder Referenz.

Da kann man dann folgenden Code nehmen, damit wird einfach jedes Dokument wieder in denselben Folder geschoben, und damit wird dann nachträglich eine Referenz erzeugt.

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

Ist erstmal ein erster Wurf, to be continued.....

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 18:30:13
das funzt dann aber nur für neu erstellt docs, oder ?

upps, erst lesen, dann posten Script 2 bringt die Lösung
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 18:31:01
lies mal Script 2 :-)

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 18:33:39
TMC ( The Master of Ceremony  ;D ) :

Gute Arbeit, das kann mir in der Fa. gute Dienste leisten..

Feedback folgt...
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 18:38:24
Freut mich Ulrich  ;D

Auf die Idee bezügl. dem Call vec.PutAllInFolder( v.Name ) brachte mir ein Spotlight.de - Thread......

Bin schon auf Dein Feedback gespannt, sollte auch mal mit einem größeren Mailfile oder so getestet werden - werd ich auch noch angehen....

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 18:40:37
Ich habe hie rmein privates Mailfile mit 240 Foldern und 182000 Docs. Das ist schon ordendlich Futter für dein Script, gell ?
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 18:43:15
Zitat
rmein privates Mailfile mit 240 Foldern und 182000 Docs.
:o :o :o

cool, da geht was  ;D
Und da sagt noch einer hier wird nicht richtig getestet  :D

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 18:47:43
ach ja, bevor das Fragen wieder losgeht, mache doch mal ne DB mit Code und den entsprechenden Ansichten fertig und lade die hier hoch. Merci...
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 18:59:26
hat gefunzt  :D Super.  Der Code hat 22 Minuten für meine paar docs gebraucht  ;D
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 19:01:02
gute Idee, Ulrich.

Hier noch ein Beispiel-Buhtong für eine Ansicht, um in einer Messagebox zu sehen, in welchem Folder das ausgewählte Dok steckt:

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
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 19:02:46
wow, jetzt drehst du aber auf... supi...
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 19:04:36
hat gefunzt  :D Super.  Der Code hat 22 Minuten für meine paar docs gebraucht  ;D

Super, das ist doch was  8)

Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 19:13:53
Interessant wäre jetzt noch eine View

Dokument | Folder

Mal schauen, ich befürchte ohne DBLookup geht das nicht, was wiederum bedeuten würde, man braucht ein weiteres Feld in den Dokumenten  :-\

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 19:45:58
ok, hast recht, aber deine Scripte sind schon mal ein guter Ansatz.
Script 3 in einen Agenten gepackt und dann das Feld $FolderName füllen ( einmal täglich ) wäre für manche FA. schon ein riesen Fortschritt.

Bei neuen Dokumenten müsste das doch auch im PostSave zu machen sein...
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 20:16:50
jip.

Hier das Script dazu, welches alle Doks der DB behandelt die FolderReferences haben:

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

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 22:32:10
und das packe ich dann in das postsave; krrrekt ?
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 22:35:40
Zitat
mache doch mal ne DB mit Code und den entsprechenden Ansichten fertig und lade die hier hoch.

Wollte ich eigentlich machen, aber
1) die Scripts sind eh hier verfügbar
2) warum es DAUs noch einfacher machen
3) hab ich jetzt keinen Bock nochmal alles zu dokumentieren in der DB :-)

Was mir hier wichtig war:
- Die vielfach behauptete Aussage, ein FolderReference lasse sich nachträglich nicht umsetzen, zu widerlegen
- praxistaugliche Scripts zu posten die man dazu einsetzen kann

Ich hoffe wir bekommen hier noch Rückmeldungen egal welcher Art und weitere Script-Beispiele, da dieses Thema schon immer im Notes-Bereich ein Problem war (Zuordnung Dokumente / Folder), und R5 brachte die Lösung, nur viele wußten bzw. wissen es nicht wie umzusetzen.

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 22:36:40
@Ulrich:
War für einen Buhtung ausgelegt.....

TMC

*Edit*
wenn Du das letzte Script meinst.
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 22:41:18
Zitat
Die vielfach behauptete Aussage, ein FolderReference lasse sich nachträglich nicht umsetzen, zu widerlegen

was dir gelungen ist...  :D
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 22:49:32
Danke Ulrich, solch eine Bestätigung von einem Experten wie Dir freut mich sehr :-)

Zumal ich wirklich (noch) kein Script Freak bin :-)
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 22:54:18
ok, was haben wir jetzt:

- eine Möglichkeit auch nachtraglich die Folderreference anzuzeigen

was fehlt:

- in einer Ansicht den Folder und seine Docs anzuzeigen.

aber dafür hat T he M aster of C eremony ja schon ein script gepostet; TMC.. good deal !!
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 22:55:26
Hier noch ungetestet aus'm Stegreif ein mögliches Postsave-Script:

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
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 22:59:48
OK, zur View:

Man bastle sich eine View:

1. Spalte: Subject (oder so), aufsteigend sortiert
2. Spalte: FOLDERNAME (multi-value-separator: New line), View-Eigenschaften: Lines per row: "9".

Das sollte es sein :-)

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 22:59:51
ja, soweit OK, jetzt mußt du nur noch berücksichtigen, daß manein doc auch von einem zum anderen Folder koperen oder verschieben kann..



Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:08:42
Zitat
jetzt mußt du nur noch berücksichtigen, daß manein doc auch von einem zum anderen Folder koperen oder verschieben kann..

Hmm, evtl: Einen "Refresh-Buhtung" in die View welche die Doks mit zugehörigen Foldern anzeigt. Evtl. ein Queryopen-Event in die View, aber davon würde ich jetzt abraten, siehe Mail-File von Eknori mit s.au-vielen Dokumenten.

TMC

Refresh-Buhtong-Code:
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
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 23:12:08
ich rede jetzt hier imme nur vom MehlPfeil... In einer eigenen gestricketen DeeBee kann das dann auch einfacher gestaltet werden. Im MehlPfeil sind die Positionen im Post.. BlaBla scho besetzt...
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:18:29
Ulrich, da bin ich bei Dir.

Hab das aber eigentlisch auch nur fürs Mehlpferd gemacht (da hat man eben die Ordnervielfalt, und wehe der Admin macht ein Update und die Mails sind nicht mehr in den Ordnern in den sie sein sollen :-)
Wobei es natürlich überall geht (hab ich grad getestet)
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 23:20:04
yoo, ist eine schwierige Kiste, aber dein Ansatz ist voll OK.  RESPEKT !!
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:27:51
jetzt wäre noch ein Script nett: Restore all Documents in Mailfile when Admin has destroyed your mailfile

- Collection über alle Docs in der DB
- Prüfen ob Reference da
- Prüfen ob Folder vorhanden, wenn nein dann lege ihn an
- lege Doc im jew. Folder ab
- Next

Mal schauen, ob ich heute noch dazu Bock hab ....

TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 23:30:44
Zitat
jetzt wäre noch ein Script nett: Restore all Documents in Mailfile when Admin has destroyed your mailfile

you got 30 minutes  ;D

"es gibt keine Probleme, nur Herausforderungen "

Ulrich
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:36:21
you got 30 minutes  ;D

Nun mal langsam, bekomm ich dann wenigstens 20 EUR ?

Ups, shit, ist ja dann 3Satz (20 EUR / 2 Std. ---> 5 EUR bei 1/2 Stunde).
Ist ja nicht mal eine Kiste Augustiner :-(

Na ja, mal schauen :-)
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 23:39:42
siehste, ist doch realistisch... jetzt hast du wertvolle Minuten verschenkt.  >:( Ich warte auf eine Lösung, brauche die sofort und du kriegst ja auch dein Flasch' Bier , keine  Sorge, aber her mit der Lösung und zwar zackichchchchchc !!!!
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:43:36
jetzt bin ich beleidigt.

Dim szEknori as String
szEknori = "Eknori ist doof, er will nur 5 Euronen für ein Script bezahlen"  & Chr(10) & "Soll er es doch selber machen, die faule S** :-)"
Msgbox szEknori


 ;D
TMC
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 23:45:16
ok, eat this ..........

man müßte ja nur eigentlich
  if not funktioniert
    sei beleidigt
  end if

end man

für die MAusliebhaber : " das war SpeudoCode"  ;D
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:50:36
Dim 20EURO As NotesItem
Set 20EURO = eknori.GetFirstItem( "Brieftasche" )
Call 20EURO.Remove
 ;D 8)
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 02.01.04 - 23:53:26
object Variable not set error !!

 du hast einigen Leuten schon k Euro erspart ( hatte ich dir in einer frühen PM schon geschrieben )
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 02.01.04 - 23:58:32
print "gut dass wir in 2004 ontopic und nie mehr offtic sind :-)"
end sub
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 03.01.04 - 00:00:58
Zitat
print "gut dass wir in 2004 ontopic und nie mehr offtic sind :-)"
end sub

ok, lasse ich als codefragemet einer SUB gelten.

Hast aber auch Recht , genug OffTopic

Ulrich
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 03.01.04 - 00:12:10
Zum erwähnten noch nötigen Script:
- Collection über alle Docs in der DB
- Prüfen ob Reference da
- Prüfen ob Folder vorhanden, wenn nein dann lege ihn an
- lege Doc im jew. Folder ab
- Next
Bezüglich "Restore all Documents in Mailfile when Admin has destroyed your mailfile":

Werde ich angehen sobald ich das brauche.
Außer aber ein Forum-Teilnehmer hat Lust.....

Ist nicht weiter schwierig, Abfrage ob Reference da siehe letzte Scripts, Rest ist eh bekannt.

TMC
Titel: Komplettlösung Teil 1
Beitrag von: TMC am 19.01.04 - 22:00:07
Komplettlösung Teil 1 / 2:


Inhalt

1. Einleitung
2. Warum das ganze - Beispiele zum Einsatz
3. Erstkonfiguration
    3.1 Order $FolderRef 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(http://www.iconarchive.com/flash/hot.gif)
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 Order $FolderRef und $FolderRefInfo

Grundsätzlich ist 'Folder References' in jeder Datenbank ab R5 möglich. Allerdings sind hierzu zwei Ordner der R5 - Mailschablone nötig:
$FolderRef
$FolderRefInfo
Diese Ordner 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

Titel: Komplettlösung Teil 2
Beitrag von: TMC am 19.01.04 - 22:01:00
Komplettlösung Teil 2 / 2

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).

Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: adminnaddel am 23.01.04 - 14:52:43
Hallo,

vielen Dank für diese Übersichtlichkeit!
ABER:
Habt Ihr berücksichtigt, daß die Dokumenteigenschaften verändert werden?! Nur ein kleiner Hinweis, vielleicht habe ich es ja auch überlesen, aber revisionsseitig nicht unbedingt sauber!  ::)
Anderseits gebe es natürlich hier die Möglichleit das ganze über den Server laufen zu lassen. so würde dieser dann auftauchen!

Gruß
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: Manfred Dillmann am 23.01.04 - 17:24:49
Hallo Matthias,

bin jetzt leider erst dazu gekommen, Deinen Artikel hier zu lesen...

Danke für Deinen tollen Beitrag. Sehr ausführlich und so viele Source-Code Beispiele.

Da hast Du ganze Arbeit geleistet! Klasse! :)

Gruss
Manfred
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 23.01.04 - 19:23:35
Hi Adminnaddel und Manfred,

Vielen Dank für Euer Feedback !

@Manfred
Zitat
Danke für Deinen tollen Beitrag. Sehr ausführlich und so viele Source-Code Beispiele.
Da hast Du ganze Arbeit geleistet! Klasse!

So ein Feedback von Dir freut mich natürlich besonders, und motiviert mich, auch zukünftig Beiträge in dieser Art hier zu schreiben  :D


@adminnaddel:
Zitat
Habt Ihr berücksichtigt, daß die Dokumenteigenschaften verändert werden?! Nur ein kleiner Hinweis, vielleicht habe ich es ja auch überlesen, aber revisionsseitig nicht unbedingt sauber!
Anderseits gebe es natürlich hier die Möglichleit das ganze über den Server laufen zu lassen. so würde dieser dann auftauchen!

Kannst Du das bitte noch weiter ausführen? Denn dann würde ich das in der Abhandlung gerne ergänzen. Bezüglich "revisionsseitig" bin ich nämlich nicht die Kenntnisse, um hier noch entsprechendes zu berücksichtigen.

Danke,
Matthias

P.S. Vielleicht sollte ich das ganze noch in Englisch übersetzen, denn bei meiner internationalen www-Recherche bin ich nur auf Fragen aber nicht wirklich auf Lösungen dazu gestossen.
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 23.01.04 - 19:29:39
habe das Ganze mal in ein pdf gepackt: http://www.eknori.de/cms/_data/folderreferences.pdf (http://www.eknori.de/_data/folderreferences.pdf)

Link gefixt
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: Heiggo am 25.01.04 - 19:26:21
Kleine Korrektur mit ohne /cms/ dafür aber mit ohne Fehler 404: Not Found :-)

Folder-References als PDF (http://www.eknori.de/_data/folderreferences.pdf)


habe das Ganze mal in ein pdf gepackt: http://www.eknori.de/cms/_data/folderreferences.pdf (http://www.eknori.de/cms/_data/folderreferences.pdf)
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 25.01.04 - 19:33:15
Die Doku wird eh in den demnächst erscheinenden Best Practices aufgenommen, da kann dann direkt gedruckt werden (ohne den restlichen Postings), daher ist die PDF dann eigentlich nicht mehr nötig (zumal diese immer aktualisiert werden müsste bei Änderungen).

Matthias
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 25.01.04 - 19:54:08
>>Kleine Korrektur mit ohne /cms/ dafür aber mit ohne Fehler 404: Not Found :-)

yoo, hast recht. Habe meine HP vor ca. 40min umgebaut; da ist wohl de eine oder andere Link auf der Strecke geblieben...

Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: Heiggo am 25.01.04 - 20:01:33
Hihi, da wird vermutlich auch noch in einiger Zeit die eine oder andere Leiche auftauchen. Zumindest bei mir war das bisher nach Umstrickungen immer so :-)
Aaaaaaber... es gibt Schlimmeres im Leben.

yoo, hast recht. Habe meine HP vor ca. 40min umgebaut; da ist wohl de eine oder andere Link auf der Strecke geblieben...
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: eknori am 25.01.04 - 20:07:14
schaun mer mal  :D
Titel: Re:In welchem Folder liegt das jew. Dokument - FolderReferences
Beitrag von: TMC am 26.01.04 - 20:22:13
 
Siehe ab sofort unter Best Practices: Best Practices - Folder References (http://www.atnotes.de/index.php?board=26;action=display;threadid=13503)


Die obige Abhandlung wird ab sofort hier nicht mehr aktualisiert, sondern nur noch unter Best Practices!

Zum Ausdrucken kann dort auf den Button (http://www.atnotes.de/YaBBImages/print.gif) geklickt werden.