Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Demian am 15.06.09 - 09:00:27
-
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.
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
-
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.
-
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 ::)
-
Ach so ...
Kann es vielleicht sein das du am Range der erzeugten Objekte scheiterst?
-
Kann es vielleicht sein das du am Range der erzeugten Objekte scheiterst?
Was meinst du mit Range der erzeugten Objekte ???
-
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 (http://www.bobzblog.com/tuxedoguy.nsf/dx/geek-o-terica-3-taking-out-the-garbage-lotusscript) 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.
-
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