Autor Thema: NotesViewNavigator.GetNextCategory(cat) verliert den Index?  (Gelesen 3692 mal)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Moin,moin,

ich habe eine DB aus der an bestimmte Personen ohne Zugriff auf die DB eine E-Mail Aufstellung mit einzelnen Feldinhalten aus einzelnen Doks geschickt werden soll.

Ich bin jetzt auf folgendem Weg:

1.) Der entsprechenden Maske ein Feld vom Typ Namen eingefügt mit Mehrfachwerten zulassen (für die Mailaddresse(n)).

2.) Eine Ansicht erstellt, in der nach den einzelnen Namen kategorisiert wird.

Wenn ich jetzt mit folgendem Script, die einzelnen Personen mit den einzelnen Doks durchlaufe, funktioniert alles wunderbar. Er gibt mir die Mailadressen, sowie die Werte aus den einzelnen Doks zurück.

Zitat
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
   
   '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 entry = ecol.GetNextEntry(entry)
      Wend
      
      'get next person
      Set cat = ViewNav.GetNextCategory(cat)
   Wend   
End Sub

Rufe ich jedoch in dem Script Funktionen einer lib auf, erhalte ich in der Zeile Set cat = ViewNav.GetNextCategory(cat) folgende Meldung: Notes Error-Eintrag im Index nicht gefunden (Name der Ansicht).

Im Debugger ist zu sehen, dass das Objekt "cat" aber nach wie vor den Wert hat, der durch Set cat = ViewNav.GetFirst gesetzt wurde.

Alle Variablen aus der Lib haben eine andere Bezeichnung wie in o.g. Code. Meine Vermutung ist, dass er den Index im aufrufenden Script verliert, weil in der lib auch eine Ansicht (eine andere) geöffnet wird (jedoch unter anderem Variablennamen). Aber laut Debugger sind alle Variablen richtig gesetzt.

Hat einer ne Idee, woran das liegen könnte? Möchte nur ungern im aufrufenden Script erst alle Daten auslesen um danach nochmal durch alle Arrays rennen zu müssen.

Sollte der lib-Code benötigt werden, bitte Info. Da ich mich mit der Thematik NotesRichTextTable noch nicht beschäftigt habe, ist das Ganze halt noch auf Testbasis. Also auch noch nichts wirklich dokumentiert, oder so. Wenns erforderlich ist, würde ich die DB noch anhängen, aber vielleicht hat ja jemand auch so einen Workaround.


Änderung:
Mir fällt grad auf, dass ich statt NotesRichTextTable bzgl. lib-Code NotesViewNavigator geschrieben hatte  ;D
« Letzte Änderung: 16.06.09 - 19:33:14 von Demian »
Gruß
Demian

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: NotesViewNavigator.GetNextCategory(cat) verliert den Index?
« Antwort #1 am: 15.06.09 - 09:09:46 »
Es wundert mich ein wenig das das bei dir unter 7.0.x auftaucht ....

Irgendwann schreib ich da noch einen Artikel zu aber erst wenn IBM den PRIO 1 ESR wieder abwürgt ...

Sollte irgendeiner von euch beschließen auf Version 8.5 hochzugehen und er irgendwo mit NotesViewEintries und Kategorien arbeiten dann kann er sich schon mal darauf einstellen das es ohne Änderung in der Entwicklung nicht wirklich funktionieren wird.

PMR Nummer 77885 999 724 wurde vom IBM Support erfolgreich erstellt. Sie enthält die folgende Kurzbeschreibung:
Folgender Code innerhalb einer Anwendung führt dazu, das die View Entries nicht sauber abgearbeitet werden ...

Set category = nav.GetFirst
Do Until category Is Nothing
       Set nve = nav.GetNextDocument(category)
.
.
.
           Set category = nav.GetNextCategory(category)
Loop

Der Fehler, beziehungsweise die Serie von Fehlern die hinter den Viewentries stehen sind IBM bereits bekannt.

SPR # PRUN7NZRBR siehe hier ....
http://www-10.lotus.com/ldd/nd85forum.nsf/dba3ca7e515d55ff85256a0700727b35/6df1db53c2cd186885257555007322b3?OpenDocument
und
SPR # OIHZ7NAPDQ
siehe hier ...
http://www-10.lotus.com/ldd/nd85forum.nsf/DateAllThreadedWeb/d16da9512c53e7018525753e006f7d0f?OpenDocument

Bei uns hatte das Gottseidank den Effekt das gar nichts mehr ging. Eine winzig kleine Änderung am Code hätte dazu geführt, das der Agent problemlos gelaufen wäre, dummerweise aber immer nur das erste Dokument zurückgeliefert hätte. Der Schaden wäre dann erheblich größer geworden.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: NotesViewNavigator.GetNextCategory(cat) verliert den Index?
« Antwort #2 am: 15.06.09 - 09:40:33 »
achso, hatte ich vergessen zu erähnen: Version 7.01, wobei wir Ende des Jahres auf Version 8.X umsteigen.

Danke für die Links, die werde ich mir nachher nochmal in aller Ruhe ansehen. Wobei es auf den 1. Blick so aussieht, als würde das Problem da unabhängig vom drumherum auftreten. Bei mir funktioniert o.g. Code ja immer einwandfrei. Erst wenn ich lib-Funktionen aufrufe, steigt er aus.   :o

Ist ja wieder mal typisch. Da hab ich gedacht, ich hätt ne schön saubere Lösung ohne die Zugriffsrechte der DB anfassen zu müssen und dann sowas  ::)
« Letzte Änderung: 15.06.09 - 14:31:17 von Demian »
Gruß
Demian

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: NotesViewNavigator.GetNextCategory(cat) verliert den Index?
« Antwort #3 am: 15.06.09 - 09:57:30 »
Ach so ...
Kann es vielleicht sein das du am Range der erzeugten Objekte scheiterst?
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: NotesViewNavigator.GetNextCategory(cat) verliert den Index?
« Antwort #4 am: 15.06.09 - 10:02:03 »
Kann es vielleicht sein das du am Range der erzeugten Objekte scheiterst?

Was meinst du mit Range der erzeugten Objekte  ???
Gruß
Demian

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: NotesViewNavigator.GetNextCategory(cat) verliert den Index?
« Antwort #5 am: 15.06.09 - 12:27:09 »
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.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: NotesViewNavigator.GetNextCategory(cat) verliert den Index?
« Antwort #6 am: 15.06.09 - 13:05:36 »
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.

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?

Set ViewNav = uiview.View.CreateViewNav.

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
« Letzte Änderung: 02.10.12 - 09:26:42 von Demian »
Gruß
Demian

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz