Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: shizen am 12.11.03 - 14:22:07
-
Hallo
ich rufe für bestimmte Dokumente einen Agenten auf und dort läuft ein Script, wie greif ich das Dokument auf dem der Agent gerade läuft?
über Session krieg ich nur die Datenbank
vieleicht über UIWorkspace?
Grüße
-
... wenn ich dich richtig verstehhe, dann möchtest du auf das Dokument zugreifen können, daß der Agent gerade in der Mache hat - ist das so?
... wenn ja, dann gib ein Merkmal des Dokumentes, das gerade abgearbeitet wird in eine Notes.ini-Variable. Dort kannst du dann auslesen, welches Dokument gerade berbeitet wird. Am Ende des Agenten wird diese Ini-Variable dann auf leer gesetzt...
ata
-
Einfacher ...
Alle zur Bearbeitung bereitgestellten Dokumente stehen in UnprocessedDocuments der CurrentDatabase also:
Dim DC As NotesCollection
Dim S As New NotesSession
Set DC=S.CurrentDatabase.UnprocessedDocuments
-
... und wie erfährst du dann, welches der markierten Dokumente gerade in der Mache des Agenten ist?
ata
-
Im Script ist das erst in der Mache, wenn Dus bearbeitest, that's up to you, das Doc muss man sich ja eh holen.
Je nach Situation kann man auch mit NotesUIWorkspace.CurrentDocument.Document arbeiten.
-
@Semeaphoros
... ich glaube wir reden aneinander vorbei:
Ein Agent bearbeitet bestimmte Dokumente => von Frontend und markiert ist keine Sprache, es könnte auch ein geschedulter Agent sein, der sich bestimmte Dokumente per db.Search zieht. Und hier greift UnprocessedDocuments nicht...
ata
-
Neinnein, es geht um Lotusscript und Lotusscript hat mal überhaupt kein Dokument in der Mache, ausser Du grabscht es Dir selber. Und bei DBSearch kannst Du das Zumüllen der Notes.Ini ebenfalls vergessen.
-
... ich wollte dich nicht in Rage bringen...
Die Notes.ini wird nicht zugemüllt, wenn du die Variable zum Ende leerst. Beim nächsten Start von Notes ist die Variable in der INI wieder weg. man kann sich auch ein Setup-Doc für einen solchen Fall bauen, in dem das gehandelt wird. Da ist der Zugriff eben umständlicher...
... man startet einen Agenten, der per LS bestimmte Dokumente abarbeitet - egal wie sie initialisiert werden. Nun möchtest du herausfinden, welches Dokument da gerade im Durchlauf des Agenten bearbeitet wird. Er hat eventuell 1000 Dokumente, die er in einer Schlaufe durchläuft. Bei welchem ist er gerade?
... wenn es nur um die Info geht, dann reicht ein Print, möchte er aber gleichzeitig auf das Dokument zugreifen, dann benötigt bestimmte Informationen zu dem aktuellen Dokument - und da gibt es zum Beispiel die Notes.ini. Wenn man richtig damit umgeht wird nicht zugemüllt...
ata
-
Hallo
es geht so wie Semeaphoros es geschrieben hat, ob es sauber ist keine Ahnung, wie testen noch.
Jetzt hab ich aber ein anderes Problem, ich muss ein Richtextfeld aus einem Dokument nehmen, in eine Variable geben und dann in ein anderes einfügen.
Hab sowas immer umgangen, weil ich nie eine Lösung gefunden habe.
Wie kann ich sowas machen?
Grüße
-
Mach nur, war vielleicht etwas "laut" meine Antwort, aber nur im "Streitgespräch" lernen die Zuhörer .......... Sorry, wenn ich etwas heftig getönt habe, war nicht so gemeint.
Also, es stimmt, was Du sagst zur Notes.ini
Die Erfahrung zeigt: mehr als die Hälfte der Porgrammierer lassen den Mist in der Ini stehen !!
Schlussendlich war es eine Notlösung, um überhaupt eine Art der Kommunikation zwischen Prozessen zu ermöglichen. Seit es die Profil-Dokumente gibt, besteht in der Regel kein Grund mehr, sowas in die Notes.ini zu schreiben, ganz abgesehen davon, dass die Notes.ini ja nicht mitrepliziert, wenn die DB verteilt ist. Und der Umgang mit Profildokumenten ist weissgott nicht wirklich komplizierter als die .ini
Zum anderen: wenn das Programm in einem LS-Agenten nicht weiss, welches Doc es gerade bearbeitet, dann ist aber der Programmierer wirklich selber Schuld, schliesslich, wie ich schon gesagt habe, gibts in LS kein Doc automatisch, man muss es sich holen. Und so hab ich auch die Frage verstanden, wie komme ich überhaupt an das aktuelle Dokument heran ......
-
... man kann zwar den Inhalt eines Richtextfeldes an ein anderes Richtext-Feld anhängen, jedoch kann es da zu ziemlichen Problemen kommen, wenn du große Grafiken darin hast, oder etwa große Dateianhänge...
ata
-
Jo, die Datenmenge kann zum Problem werden, hier der Befehl, der es tut:
Call notesRichTextItem.AppendRTItem( notesRichTextItem2 )
-
@Semeaphoros
... nichts für ungut...
... deine Erfahrung zu Notes-Programmierern kann ich bestätigen, daher habe ich auch extra erwähnt, daß die Notes.ini-Variable wieder geleert werden soll...
ata
-
Ja, eben, deshalb auch immer wieder von mir der Hinweis auf Zumüllen, wenn jemand notes.ini erwähnt, leider braucht es manchmal deutliche Sprache ...... leider ..... :(
-
... übrigens ist die Arbeit mit dem Profildokument nicht unproblematisch, da sich das Dokument kontinuierlich im Cache befindet. Da hier mit einem Agenten gearbeitet wird könnte das auch schief gehen.
... ich arbeite sowohl mit Profildokumenten, als auch mit den INI-Variablen. Mit INI-Variablen aber immer, wenn Agenten im Spiel sind - alte Angewohnheit - gebranntes Kind scheut das Feuer ::)
ata
-
Mit dem Agenten ginge es auch so: Wenn Du den Agenten aufrufst, kannst Du die Doc-ID mitgeben. Diese kannst Du dann im Agenten abfragen: Dazu gibt es die Methode
agent.ParameterDocID
Übergabe der DocID an Agenten:
call agent.Run(doc.NoteID)
Beispiele aus der Hilfe:
This agent runs the agent named "Agent to be run parameter LotusScript," passing it the NoteID of a newly created document.
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim agent As NotesAgent
Set db = s.CurrentDatabase
REM Create document containing data to be passed
Set doc = New NotesDocument(db)
doc.TriggerUserName = s.UserName
Call doc.Save(True, False)
REM Start agent and pass NoteID of document
Set agent = db.GetAgent("Agent to be run parameter LotusScript")
If agent.Run(doc.NoteID) = 0 Then
Messagebox "Agent ran",, "Success"
Else
Messagebox "Agent did not run",, "Failure"
End If
End Sub
This is "Agent to be run parameter LotusScript." It accesses the passed NoteID through ParameterDocID, accesses the referenced document, and removes it.
Sub Initialize
Dim s As New NotesSession
Dim agent As NotesAgent
Set agent = s.CurrentAgent
Dim db As NotesDatabase
Dim doc As NotesDocument
Set db = s.CurrentDatabase
REM Get document used for passing data
Set doc = db.GetDocumentByID(agent.ParameterDocID)
REM Send mail containing passed data
Dim memo As New NotesDocument(db)
memo.Form = "Memo"
memo.SendTo = s.UserName
memo.Subject = "Message from LotusScript agent"
memo.Body = "The agent was started by " & doc.TriggerUserName(0)
Call memo.Send(False)
REM Delete document used for passing data
Call doc.Remove(True)
End Sub
Andreas
-
Die Hilfe ist allerdings da etwas ungenau. Wenn man unter ParameterDocID nachschaut, steht da folgendes:
Read-only. Returns the NoteID of a document passed to the agent by Run or RunOnServer.
..... würde eigentlich heissen, dass man das DOCUMENT und nicht die DocID als Parameter übergeben müsste .... Was ist da richtig? Das Beispiel oder die Beschreibung ???
Uebrigens erst ab 5.0.2
Ata: Profildokumente sind spätestens ab R4.6 sehr zuverlässig. Unter 4.1, als sie eingeführt wurden, waren sie tatsächlich sehr "flaky", replizierten nicht immer und haben auch sonst noch so ein paar Sprünge gemacht, aber unterdessen sind Deine Befürchtungen unbegründet.
-
Hallo
aus dem bisherigen hab ich mir folgendes zusammengebastelt:
es funzt sowiet fast, aber bei Call rtitem.AppendRTItem(doc.Body) kommt ein Mismatch und ich kann mir nicht vorstellen warum? :-[ :-[ :-[
Dim NotesColl As NotesDocumentCollection
Dim session As New NotesSession
Dim mailbox As New NotesDatabase("","")
Dim current As NotesDatabase
Dim maildoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim dummy As Variant
Dim i As Integer
Dim doc As NotesDocument
Dim sendto As String
Dim sendas As String
Dim subject As String
Set NotesColl=session.CurrentDatabase.UnprocessedDocuments
If NotesColl.count>0 Then
Set doc=notescoll.GetFirstDocument
For i = 1 To NotesColl.count
sendas="CN=Agent/O=lwb"
sendto=doc.subject(0)
subject=doc.From(0)
' get handle to mail.box on the users current mail server
Set current = session.CurrentDatabase
Call mailbox.Open( current.server, "mail.box" )
' Create a new document in the severs mail box
Set maildoc = mailbox.CreateDocument
maildoc.Form = "Memo"
maildoc.From = sendas
maildoc.SendFrom = sendas
maildoc.SendTo = sendto
maildoc.Recipients = sendto
maildoc.Subject = subject
Set rtitem = maildoc.CreateRichTextItem("Body")
Call rtitem.AppendRTItem(doc.Body)
maildoc.PostedDate = Now()
maildoc.ComposedDate = Now()
maildoc.DeliveredDate = Now()
maildoc.Principal = sendas
maildoc.EncryptOnSend = False
Call maildoc.Save( True, False )
Set doc=notescoll.GetNextDocument(doc)
Next i
End If
-
Das Call rtitem.AppendRTItem(...) verlangt ein RichTextItem als Parameter.
Also
dim bodyrtitem as NotesRichTextItem
Dim NotesColl As NotesDocumentCollection
Dim session As New NotesSession
Dim mailbox As New NotesDatabase("","")
Dim current As NotesDatabase
Dim maildoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim dummy As Variant
Dim i As Integer
Dim doc As NotesDocument
Dim sendto As String
Dim sendas As String
Dim subject As String
Set NotesColl=session.CurrentDatabase.UnprocessedDocuments
If NotesColl.count>0 Then
Set doc=notescoll.GetFirstDocument
set bodyrtitem = doc.GetFirstItem("Body")
For i = 1 To NotesColl.count
sendas="CN=Agent/O=lwb"
sendto=doc.subject(0)
subject=doc.From(0)
' get handle to mail.box on the users current mail server
Set current = session.CurrentDatabase
Call mailbox.Open( current.server, "mail.box" )
' Create a new document in the severs mail box
Set maildoc = mailbox.CreateDocument
maildoc.Form = "Memo"
maildoc.From = sendas
maildoc.SendFrom = sendas
maildoc.SendTo = sendto
maildoc.Recipients = sendto
maildoc.Subject = subject
Set rtitem = maildoc.CreateRichTextItem("Body")
Call rtitem.AppendRTItem(bodyrtitem)
maildoc.PostedDate = Now()
maildoc.ComposedDate = Now()
maildoc.DeliveredDate = Now()
maildoc.Principal = sendas
maildoc.EncryptOnSend = False
Call maildoc.Save( True, False )
Set doc=notescoll.GetNextDocument(doc)
Next i
End If
-
Die Hilfe ist allerdings da etwas ungenau. Wenn man unter ParameterDocID nachschaut, steht da folgendes:
Read-only. Returns the NoteID of a document passed to the agent by Run or RunOnServer.
..... würde eigentlich heissen, dass man das DOCUMENT und nicht die DocID als Parameter übergeben müsste .... Was ist da richtig? Das Beispiel oder die Beschreibung ???
So wie in den Beispielen.
Andreas
-
Danke Andreas, hoffentlich denken wir alle dran, wenn wirs brauchen.
-
Ich brauchte das bis dato nicht. Höchstens in Webagenten, aber da nehme ich eh immer
set doc =session.DocumentContext
Andreas