Domino 9 und frühere Versionen > ND7: Entwicklung

NotesViewNavigator.GetNextCategory(cat) verliert den Index?

<< < (2/2)

Thomas Schulte:
Ein in einem Script erzeugtes Domino Objekt hat immer nur eine Bestimmte Reichweite, die unter anderem auch davon abhängt ob sein Erzeuger noch aktiv ist.
Wenn du zum Beispiel von einer Session auf einen View schließt und die Session beim Aufruf deiner Subroutine oder der Funktion in der Script Library nicht mehr zur Verfügung steht greift automatisch der "Garbage Collector" von Notes ein und schmeißt auch alles was unterhalb deiner Session war weg. Bob Balaban hat hier erst vor kurzem einen erstklassigen Artikel dazu geschrieben.

und wenn du dir diesen Artikel durchgelesen hast dann verstehst du auch, warum das hier ...

Set ViewNav = uiview.View.CreateViewNav

die Klippe sein MUSS an der du scheiterst.

Demian:

--- Zitat von: Thomas Schulte am 15.06.09 - 12:27:09 ---Wenn du zum Beispiel von einer Session auf einen View schließt und die Session beim Aufruf deiner Subroutine oder der Funktion in der Script Library nicht mehr zur Verfügung steht greift automatisch der "Garbage Collector" von Notes ein und schmeißt auch alles was unterhalb deiner Session war weg.
--- Ende Zitat ---

Aber laut Debugger sind ja alle Variablen noch aktiv nach dem Aufruf einer lib-Funktion (siehe Screenshot). Wenn der GC greifen würde, müssten mir die Variablen doch als "leer" angezeigt werden, oder nicht?


--- Zitat von: Thomas Schulte am 15.06.09 - 12:27:09 ---Set ViewNav = uiview.View.CreateViewNav.
--- Ende Zitat ---

Im meinem Testagenten wird nicht mehr mit ui gearbeitet. Das hatte ich nur der Einfachheit halber in der Ansicht so in eine Aktion gepackt. Die VErmutung, dass die Variablen nicht mehr gültig sind, hatte ich auch schon, und habe dann mal alles im Declarartion-Teil deklariert. Hatte aber auch keinen anderen Effekt.

Ich habe aber inzwischen eine andere Lösung gefunden (mit dem Workaround aus deinem Link mit dem 2. Nav kam ich nicht so klar). Und zwar durch den Einsatz eines weiteren Entry (LastEntry) und statt .getnextcategory(cat) dann .getnext(LastEntry). Hier nochmal der angepasste Ui-Code der so übertragen auch im Agenten läuft, der die lib-Funktionen aufruft. Die markierten Zeilen sind die hinzugefügten/geänderten.

Sub Click(Source As Button)
   'General
   Dim s As New NotesSession
   Dim db As NotesDatabase
   Dim work As New NotesUIWorkspace
   Dim doc As NotesDocument
   
   'View
   Dim uiview As notesuiview
   Dim ViewNav As NotesViewNavigator
   
   'Entries
   Dim ecol As NotesViewEntryCollection
   Dim cat As NotesViewEntry
   Dim entry As NotesViewEntry
   Dim LastEntry As NotesViewEntry 'needed because ViewNav.GetNextCategory(cat) don't work correctly
   
   'create viewnaw
   Set db = s.CurrentDatabase   
   Set uiview  = work.CurrentView
   Set ViewNav = uiview.View.CreateViewNav
   
   'get first person
   Set cat = ViewNav.GetFirst
   
   While Not (Cat Is Nothing)
      Msgbox Cat.ColumnValues(0) & " - " & cat.ChildCount
      
      'get all childs
      Set Ecol = uiview.View.GetAllEntriesByKey(Cat.ColumnValues(0),True)
      
      'get first child
      Set entry = ecol.GetFirstEntry      
      
      'run over all childs
      While Not (entry Is Nothing)
         Msgbox entry.Document.Car(0)
         'get next child         
         Set LastEntry = entry
         Set entry = ecol.GetNextEntry(entry)
         
      Wend
      
      'get next person
      Set cat = ViewNav.GetNext(LastEntry)
      Set LastEntry = Nothing
   Wend   
End Sub

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln