Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: w3dev am 28.02.07 - 13:47:58
-
Hallo ihr lieben,
kurze Frage zum Verständnis:
Wie sollte sich ein Agent in bezug auf mit "UpdateProcessedDoc" gekennzeichnete dokumente verhalten, wenn er deaktiviert und wieder aktiviert bzw. durch ein Schablonenupdate erneuert wurde? Behällt er diese Dokumente im "Gedächtnis" oder bearbeitet er dann wieder alle Dokumente?
Thanks for your brain.
-
Genauso wie in der Doku ausführlich beschrieben: UpdateProcessedDocs sorgt dafür, dass eine NotesDocumentCollection auf Basis UnprocessedDocs nur aus bisher nicht bearbeiteten Dokumenten besteht. Auch wenn der Agent zwischendurch aus- und angeschaltet wird.
Bernhard
-
Das mit dem ein- und ausschalten war mir wichtig. Das wird in der Doku nämlich nicht explizit angesprochen. Und mit dem Agent nach einem Schablonen Update verhält es sich gleichermaßen, oder?
Merci
Ronny
-
Man hätte da besser den Text der 5er Version der DesignerHelp für R6 übernommen:
UpdateProcessedDoc ensures that a document gets processed by an agent only once. For example, when an agent runs a script to process all new and modified documents since last run, the script can use UnprocessedDocuments, UnprocessedFTSearch, or UnprocessedSearch (all in NotesDatabase) to get the newly-created and newly-modified documents. The script must use UpdateProcessedDoc to mark the documents that it has already processed.
Without UpdateProcessedDoc, the UnprocessedDocuments property returns all the documents in the database, and the UnprocessedFTSearch and UnprocessedSearch methods return all the documents in the database that meet their respective criteria, regardless of whether the documents have already been searched in a previous invocation of the agent.
Bernhard
-
Meine (leidvolle) Erfahrung:
Wenn ein Agent deaktiviert und neu aktiviert wird, hat er alles bis dahin gemachte vergessen. Er fängt ein neues Leben an und bearbeitet ALLE Dokumente, auch die er in seinem alten Leben bereits bearbeitet hat.
Also was tun: Ich lasse durch den Agenten immer ein Feld in die bearbeiteten Dokumente schreiben. Das frage ich im Code ab.
Nur so bist Du auf der sicheren Seite!
Andreas
-
@Bernhard: Klingt schon besser die Beschreibung. Auf Notes 5 hab ich nur zu meiner Anfangszeit gearbeitet und diese Funktion noch nicht benutzt.
Gibt's denn irgendeinen Grund warum das nicht funktionieren könnte? Ich habe immerwieder das Problem, dass ein Agent nach einem Schablonen Update wieder erst alle Dokumente bearbeitet, obwohl diese mit "UpdateProcessedDoc" gekennzeichnet sind. Man muss dass Dokument nicht erst nach dem Befehl speichern, oder? Wo ist denn die Information für gekennzeichnete Dokumente eigentlich hinterlegt?
@Glombi: Die Erfahrung mache ich eben auch immerwieder, wie oben beschrieben. Das problem ist nur: Wie prüfe ich dann neue und bearbeitete dokumente ab?
Gruß Ronny
-
Wie gesagt:
Also was tun: Ich lasse durch den Agenten immer ein Feld in die bearbeiteten Dokumente schreiben. Das frage ich im Code ab.
Nur so bist Du auf der sicheren Seite!
Sowas in der Art:
if doc.HasItem("doc.AgentXYZFlag") then
if doc.AgentXYZFlag(0) = "1" then goto NextDocument
end if
'hier dann der eigentliche Code...
doc.AgentXYZFlag = "1"
call doc.Save( false, false )
NextDocument:
set doc = dc.GetNextDocument(doc)
Andreas
-
So ungefähr läuft das bei mir auch bereits. Nach der bearbeitung erfüllt das Dokument nicht mehr die Kriterien einer Abfrage im Agenten und es wird zum nächsten Dokument gesprungen. Nur Durchlaufen bei jedem Update ne ganze Menge Dokumente (30.000-40.000) diese Abfrage und das dauert dann schon mal.
Gruß Ronny
-
Ausser in unkritischen Situationen verlasse ich mich auch nicht auf UpdateProcessedDocs.
Wo möglich, arbeite ich mit einem CutOffDate, oder ich schreibe einen Zeitstempel in das Dokument oder - wo das denn im Zusammenhang mit UnprocessedDocs machbar ist - ein simples Flag (wie Andreas) in das Dokument.
Variante 1 hat immer den Charme, dass man das Datum auch mal zurückdrehen kann ;)
Bernhard
-
Zeitstempel benutz ich auch extra noch, stimmt. Aber wie bereits erwähnt kostet die Abfrage aller Dokumente jedes mal beim Schablonen Update Zeit "ohne Ende".
Also dies zu umgehen scheint hier nicht möglich.
Gruß Ronny
-
Wie machst Du denn die Abfrage?
Bernhard
-
Agent durchläuft alle neuen und bearbeiteten Dokumente.
Im Agenten wird für jedes Dokument abgefragt, ob es in dieser DB schon bearbeitet wurde (Flag mit Name: "memoDBName"), da Das Dokument theoretisch aus einer Anderen DB (gleiche Applikation) kopiert worden sein könnte und hier nochmal bearbeitet werden muss. Grund: In dieser DB müssen evtl andere Anpassungen durch den Agenten getätigt werden.
If doc.HasItem("memoDBName") Then
If doc.memoDBName(0)=moduleNumber Then
If intPrint Then Goto nextDocument
End If
End If
-
Vorher kommt noch eine Abfrage ob Dokument gelöscht oder not valid ist und eine Maskenabfrage für nicht zu bearbeitende Dokumente und einige Veriablen werden bei jedem Dokument zurückgesetzt (Das könnte man noch ans Ende der Bearbeitung setzen).
-
Warum arbeitest Du dann nicht mit einem CutOffDate?
Bernhard
-
CutOffDate? Was genau meinst du damit? Das Bearbeitungsdatum? Ich könnte das direkt in die Agentenabfrage reinsetzen, das wäre evtl eine Möglichkeit, oder spricht etwas dagegen?
-
Du arbeitest einfach mit dbSearch. Dein Agent schreibt den Start seiner Aktion in ein Setup-Dokument ...
Bernhard
-
Wie sieht's denn da mit Performance aus, wenn jedes mal diese Suche getätigt wird?
Gruß Ronny
-
Besser als Deine Schleife ;)
Du kannst ja unterscheiden: Wenige UnprocessedDocuments -> OK. Viele -> dbSearch.
Bernhard
-
;D Das hört sich gut an.
Merci Ronny