Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Jürgen Schomann am 23.09.15 - 13:09:18
-
Ich habe folgenden Agenten, der für alle ausgewählten Dokumente läuft. Dazu existiert eine Ansicht sortiert nach dem Feld F1.
FIELD F1 := "neu";
_Values := @DbLookup("" : "NoCache"; ""; "vaTestDbLookUp"; "neu"; 2);
@Prompt([Ok];"";@Text(@Elements(_Values)));
SELECT @All
der Agent modifiziert die Dokumente, so dass mit dem @DbLookup jedes mal in der Ansicht ein Dokument mehr erscheint.
@DbLookUp liefert aber immer nur die zu Beginn vorhandene Anzahl Dokumente.
Wenn z. B. vor Start des Agenten 2 Dokumente mit Feld F1 = "neu" vorhanden waren, liefert mir @DbLookUp immer nur diese 2 Dokumente obwohl durch jeden Durchlauf ein Dokument mit dem Feld F1 = "neu" mehr entsteht, also müsste 3, 4 usw. Dokumente geliefert werden.
Irgendwie sind die geänderten Dokumente anscheinend noch nicht in der Ansicht oder der Cache funktioniert nicht. Auch die Angabe 'ReCache' statt 'NoCache' ändert nichts daran.
Wenn ich den gleichen Vorgang in LotusScript wie folgt nachstelle funktioniert es:
Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim db As NotesDatabase
Dim view As NotesView
Dim dc As NotesDocumentCollection
Dim dc2 As NotesDocumentCollection
Dim doc As NotesDocument
Set dbThis = session.CurrentDatabase
Set view = dbThis.GetView("vaTestDbLookUp")
Set dc = dbThis.UnprocessedDocuments
Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
If doc.IsValid And doc.UniversalID <> "" Then
Call doc.ReplaceItemValue("F1", "neu")
Call doc.Save(True, False)
Set dc2 = view.GetAllDocumentsByKey("neu", True)
MsgBox dc2.Count
End If
Set doc = dc.GetNextDocument(doc)
Wend
O. g. Agent ist nur ein stark abgerüstetes Beispiel.
Gibt es irgend eine Idee dazu?
-
Hi,
zwei Ideen ...
zum einen, wird deine Ansicht automatisch aktualisiert lt. Eigenschaften der Ansicht?
zum zweiten ... setze die Eigenschaft "AutoUpdate" deiner Ansicht vor der Schleife auf true, damit wird bei Änderungen die Ansicht aktualisiert.
Zusätzlich ein viwXXX.refresh vor jedem getallDocumentsByKey könnte auch was bringen.
Ich denke mal, er aktualisiert die Ansicht einfach nicht, wenn sich im Hintergrund was tut.
Deswegen der refresh nach jedem Aufruf und die anderen Maßnahmen.
LG
Marco
-
Wie gesagt in LotusScript funktioniert es ja. Die Ansicht wird automatisch aktualisiert,. Auch mit Index Verwerfen-Optionen habe ich schon probiert. AutoUpdate ist Standard = True und Refresh weiß ich auch, es ist ja nur ein stark abgerüstetes Beispiel.
Aber das Problem besteht weiter, da ich diesen Agent in der Formelsprache benötige. Das ist ein ziemlich umfangreicher Agent aus einer Fremdanwendung und ein Umstellen in LotusScript viel zu aufwendig.
-
Ja, sorry ... war zu schnell beim Lesen.
Hmmm ...
-
Hallo,
schon mal ein @UpdateFormulaContext getestet?
Viele Grüße
André
-
Wie soll das gehen?
Der Agent soll für alle ausgewählten Dokumente laufen. Die Funktion @UpdateFormulaContext ist aber nur möglich wenn als Ziel für den Agenten 'Keines' angegeben ist und der Nutzer direkt mit dem Dokument arbeitet.
-
Hallo,
diese Einschränkung der Funktion hatte ich nicht bedacht. Ich kenne diesen Effekt jedoch auch aus vergangenen Zeiten - wenn ein Formelagent auf viele Dokumente läuft und dabei Felder setzt und mit Lookups Daten liest, gab es immer mal wieder "Sprünge" in den Werten, weil zwischenzeitlich die Ansichten zu langsam waren.
Inzwischen haben wir die betroffenen Codeteile bei uns alle auf Script umgestellt und arbeiten verstärkt mit Listen, die die geänderten Dokumente vermerken, um die Anzahl der Ansichtszugriffe - vor allem bei ständigen Änderungen niedrig zu halten.
Dies ist zwar ein einmalig etwas größerer Aufwand, dies wird jedoch mit Stabilität und Geschwindigkeit belohnt - bei Fremdanwendungen sollte sich um so was natürlich der Hersteller kümmern.
Gruß
André
-
Ich würde mal behaupten, dass beim Formel Agenten das Dokument erst NACH dem Abschluss des Agenten gespeichert wird und somit vorher noch die alte Anzahl geliefert wird.
-Werner
-
Nein.
Vor der Anwendung auf die ausgewählten (oder auch alle!) Dokumente ermittelt die Formula-Engine, was der Agent zu tun hat. Dazu gehört das @dbLookup, das damit immer den initialen Zustand hat. Anschliessend werden die "gesammelten Erkenntnisse" auf die betroffenen Dokumente zur Anwendung gebracht. Keine Anweisung des Agents mit einem @dbLookup bezieht sich zudem auf eine Anweisung, die die Änderung der Dokumente betrifft.
Bernhard
-
Dass die Formela-Engine vorher das DbLookUp durchführt kann auch nicht sein. Bei mehreren Versuchen wurde manchmal doch der aktuelle Wert ermittelt. Außerdem könnten die Angaben für das DbLookUp ja auch erst dynamisch anhand des aktuellen Dokuments ermittelt werden. Z. B. welche Ansicht oder welches Feld/welche Spalte zurückgegeben werden sollen. Dann kann im Vorfeld ja auch nichts ermittelt werden. Ich glaube, dass es eher ein Zeitproblem ist.