Domino 9 und frühere Versionen > Entwicklung

db.Search & Shared, Private on 1st use

(1/2) > >>

TMC:
Ich habe schon öfter mal am Rande gehört/gelesen, dass es Probleme gibt, wenn man "Shared, Private on 1st use" - Ordner aktualisieren will als Developer.

Aktuell muss ich eine db.Search - Suchfunktion in eine DB einbauen. Die Ergebnisse zeige ich in solch einem Ordner an (ich glaube das macht Sinn).

Jetzt habe ich mir folgendes "Konstrukt" überlegt in dem Search-Code-Buhtong:

--- Code: ---   Set view = db.GetView(FOLDERNAME)  
   If Not (view Is Nothing) Then Call view.Remove
   Call uiws.SetTargetFrame("viewframe")
   Call uiws.CurrentDatabase.OpenView(FOLDERNAME)  
   Set view = db.GetView(FOLDERNAME)
--- Ende Code ---

Ich lösche also erstmal den Ordner, wenn der vorhanden ist.

Dann kommt das übliche (Suchmaske, Ergebnisse wandern in die db.search - Formel).

Danach soll die (via db.search) gefüllte DocCollection in den Folder:

--- Code: ---Call coll.PutAllInfolder(FOLDERNAME)
--- Ende Code ---

Und da kommt dann jetzt beim Testen meistens folgende Fehlermeldung:

--- Zitat ---Can't move document to shared Private On First Use folder (TestSearch01)
--- Ende Zitat ---
(in der Zeile: Call coll.PutAllInFolder...)

Ich gehe mal davon aus, weil ich '"ihm" den Folder wegziehe, irgendwas ist wohl nicht initialisiert (wobei dann die Fehlermeldung nicht ganz richtig wäre). **EDIT ** Lt. Debugger ist die "view"-Variable leer.

Ohne den o.g. Stunt (view.remove) funktioniert das ganze.

Mich würde interessieren: Wie realisiert Ihr das?

koehlerbv:
Den Folder würde ich dem User nun gerade nicht unter'm Hintern wegziehen, wenn die DB schon offen ist - diese Folder oder auch Views werden nur beim Öffnen der DB bzw. beim ersten (FrontEnd !)-Öffnen des Folders / der View neu erstellt.

HTH,
Bernhard

Semeaphoros:
Na ja, darüber hinaus gibt es in verschiedenen Versionen - vor allem in R5 - verschiedene Bugs, die zum Bleistift das Anlegen von SPOFU - Foldern/Views per Script oder auch das Löschen derselben verhindern (Stichwort: Fehlermeldung Index cannot be created .... oder so ähnlich). Eine Suche nach SPOFU hier im Forum dürfte die verschiedenen Hinweise auf die etwa 4 KB-Artikel zum Thema finden lassen.

Axel:
Hi,

diese Probleme hatte ich auch. Inzwischen habe ich aber die ganzen Fallstricke umschifft.

Der erste wichtige Punkt, ist der, dass der private Ordner in der Datenbank abgelegt sein muss und nicht auf dem Desktop. D.h. der (bzw. die) User müssen das Recht haben persönliche Ordner zu erstellen.

Als zweites muss der Ordner bereits existieren wenn er mit PutAllInfolder gefüllt werden soll. Er wird nicht automatisch angelegt!! Ich glaube in der Designer - Hilfe steht was anderes.

Meine Lösung sieht nun so aus:

Ich habe für die Suche einen SPOFU - Ordner angelegt, so zu sagen als Template.
Im PostOpen-Event des Datenbank-Scriptes habe ich folgende Formelzeilen eingefügt:

@Command([OpenView]; "Name des Ordners");
@Command([FileCloseWindow])

Damit wird der Ordner kurz geöffnet und wieder geschlossen. Hier wird er, wenn er nicht vorhanden ist, angelegt.

Aber Achtung!! Hier muss in 5 ein Bug drin sein.
Lege ich von einer DB, in der der User bereits einen pers. Ordner auf diese Weise angelegt hat, eine neue Replik oder Kopie an, wird der Ordner nochmal angelegt. In Version 4 war das nicht der Fall.

Workaround:
Ich hab mir mit Notes 4.6 eine DB erstellt die einen SPOFU-Ordner enthält. Diese DB nehme ich dann und baue sie in % so um wie ich es brauche.

Das Leeren des Ordners realisiere ich so ähnlich, wie in diesem Beispiel:

--- Zitat ---...
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim vc As NotesViewEntryCollection
Set db = session.CurrentDatabase
Set view = db.GetView("Christmas")
Set vc = view.AllEntries
Call vc.RemoveAllFromFolder("Christmas")
...

--- Ende Zitat ---

Damit habe ich bisher keine Probleme gehabt. Ich nutze das in zwei grösseren DBs auf denen ca. 250 User rumtoben.


Axel


TMC:
Danke für Eure Tipps !

Die DB soll übrigens auch in ND6 laufen. Da bin ich auch auf diesen Thread gestossen, der sehr hilfreich war: Index is not to be generated on server.

Für mich ist nach wie vor interessant: Wie werfe ich SPOFU-Folder wieder zeitnah raus (wegen Designänderung).

Da hab ich mir folgendes fürs DB-Script überlegt:


--- Code: ---Sub Queryclose(Source As Notesuidatabase, Continue As Variant)
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim viewSPOFU As NotesView
   Set db = session.CurrentDatabase
   
   '-------------------- Workaround due to a ND6-Bug, see KB #1108323
   If session.NotesBuildVersion<190 Then    'If running R5 then simply use GetView.
      Set viewSPOFU = db.GetView(S_FOLDERNAME)
   Else                                                       'If ND6: we need a loop workaround
      Forall v In db.Views
         If v.name = S_FOLDERNAME And Isarray(v.readers) Then
            If v.readers(0)=session.UserName Then
               Set viewSPOFU = v
               Exit Forall
            End If
         End If
      End Forall
   End If
   '---------------------------------------------------------------------------------------------------------------
   Call viewSPOFU.Remove   
   
End Sub
--- Ende Code ---

Das heißt bei jedem Schließen der DB wird der SPOFU gelöscht.

Im Postopen dann wie von Axel vorgeschlagen:

--- Code: ---@Command([OpenView]; "TestSearch01");
@Command([FileCloseWindow])
--- Ende Code ---

Beim ersten Test funktioniert es so wunderbar.

Wie handhabt Ihr es mit der Thematik SPOFU & Designänderung des Folders?

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln