Hallo,
ich möchte per LS im Querysave einer Maske einen Agenten aufrufen, aber der Agent startet scheinbar nicht.
Woran kann es liegen?
Es geht um einen FormesSprache-Agenten, der einige Felder des Dokuments ändert bzw. ändern soll.
Als QuerySave noch in FS geschrieben war, ging es einwandfrei... :-:
Gruß
Leo
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase
'Agent zur Bearbeitung und Übertragung aller Änderungen und Senden der Mails
Dim agent As NotesAgent
Set agent = db.GetAgent("L_EnterChangesInHistory")
If agent.Run = 0 Then
Print "Agent ran - Success"
Else
Print "Agent did not run - Failure"
End If
Was sind die Einstellungen des Agents? Er zielt auf ...? Hantiert der Agent mit dem Frontend? Findet sich in der Statuszeile / im lokalen Log ein Hinweis?
Hi Bernhard,
1. Auslösen "Durch Ereignis", Auswahl im Menü 'Aktionen", Ziel "Keines"
2. Der Agent protokolliert im Dokument beim Speichern im Feld "History" und einigen anderen alles, was im Dokument geändert wurde.
Beispiel bzw. Auszug:
REM {Bearbeitung der Feldern falls Schalter zur CMDB Angaben changed};
newValue := @Text(cmdb) ;
oldValue := @Text(oldcmdb) ;
tmp1 := @If(oldcmdb =""; " setzte"; " änderte") ;
tmp2 := " den CMDB-Relevanz-Schalter auf " ;
newEntry := WannWer + tmp1 + tmp2 + "'" + newValue + "'";
@If( oldValue != newValue ; @Do (
@StatusBar(tmp1 + " ... " + tmp2);
@SetField("oldcmdb"; newValue) ;
@SetField("History"; @NewLine + newEntry + @Left(History; 30000 ) ) ;
@SetField("History_1"; @Left(History_1; 30000 ) + newEntry + @NewLine )
); @Success );
3. Beim Starten (aus FS QuerrySave) brachte der Agent den Hinweis in der Statusleiste.
Jetzt aber nicht mehr. Als ob er gar nicht startet.
Obwohl die Meldung "Agent ran - Success" aus LS QuerySave kommt. :(
@StatusBar("Aktualisierung gestartet...");
Also, ich hab gerade schnell probiert und stellte fest, dass ein LS Agent per Agent.Run einwandfrei aus QuerySave gestartet wird, seine Aufgabe richtig macht und keine Speicherkonflikte erzeugt.
z.B. dieser:
Sub Initialize
Dim item As NotesItem
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.currentdocument
Dim doc As NotesDocument
Set doc = uidoc.Document
Set item = doc.ReplaceItemValue ( "History", doc.NewProcess(0) & Chr(13) & doc.History(0) )
Set item = doc.ReplaceItemValue ( "NewProcess", "" )
End Sub
Die Frage ist also, ob bzw. wie ein FS Agent aufgerufen werden könnte, damit er auch läuft.
pack den Code in eine Methode in einer Scriptlibrary, der du das zu protokollierende Dokument übergibst. Das ist m.E. die sauberste Lösung.
Ich bin fast am Ende. :(
Ich hab in einer Scriptlibrary eine Funktion erstellt:
Function fTest As String
fTest = "Test"
Messagebox "Test"
Print "Test"
End Function
Wenn ich sie aus QuerySave aufrufe, passiert gar nichts.
Wenn ich sie in QuerySave ausgebe, wird alles nur leer (also ohne "Test") angezeigt.
Messagebox fTest
Print fTest
Wenn ich diese Funktion aus einem LS Agenten aufrufe, läuft alles.
Was mache ich falsch? :-:
Bernhard, da kann ich nicht ganz zustimmen, RunwithDocumentContext würde schon funktionieren:
FormulaAgent: (Target=none)
FIELD Test := "Hello World";
SELECT @All
LS-Agent (Taget=none, aber eigentlich egal)
Sub Initialize
Dim sess As New NotesSession
Dim doc As New NotesDocument(sess.currentDatabase)
Dim agent As NotesAgent
Set agent = sess.currentDatabase.Getagent("FormulaAgent")
Call agent.Runwithdocumentcontext(doc)
MsgBox doc.test(0)
End Sub
=> Gibt "Hello World" aus.
(ähnlcih müsste auch run(noteID) funktionieren, das Dokument muss dann aber gespeichert sein und wird durch den Agenten nochmals gespeichert, wenngleich ich es jetzt nicht ausprobiert habe.)
Gruß
Roland