Hallo Zusammen,
wenn ich eine Mail über einen Agenten versenden will, dann klappt das bei mir irgendwie nicht richtig...
Das der eigentliche Code zum versenden funktionierrt konnte ich schon über das PostSave Event eines Forms gegen testen...
Also ich hab den Code zum versenden in einer Script Library stehen...
Der Agent geht dann hin und macht folgendes:
In den Options steht:
Option Public
Option Declare
Use "MailSend"
Use MailSend ruft demnach wenn ich hier nicht falsch liege die Scribt Library auf.
Im Initialize steht folgendes:
Dim s As New NotesSession
Dim agent As NotesAgent
Dim doc As NotesDocument
Set agent = s.CurrentAgent
Set doc = db.Getdocumentbyid(agent.Parameterdocid)
Call NewCallMailSend(doc)
Aus dem Form heraus wird das Dokument an den Agenten übergeben...
Dim agent As NotesAgent
Set agent = db.GetAgent("(SendMailCall)")
If Not (agent Is Nothing) Then
If Not agent.Run(Source.Document.NoteID) = 0 Then
Messagebox "Agent did not run",48, "Failure"
End If
Else
Messagebox "Agent not found.",48,"Failure"
End If
Und scheinbar läuft der Agent auch, denn keine Fehlermeldung geht auf.
Und die Library hat dann folgendes:
Sub NewCallMailSend(doc As NotesDocument)
Dim s As New NotesSession
Set db = s.Currentdatabase
Set firstdoc = doc
Set Maildoc = New NotesDocument(db)
Set Body = New NotesRichTextItem(Maildoc, "Body")
Maildoc.SendTo = firstdoc.Getitemvalue("SendTo")
Maildoc.Subject = "Neuer Info wurde erzeugt"
Maildoc.Form = "Memo"
Call Body.Appendtext("Hallo " & firstdoc.Getitemvalue("n_call_creator")(0) & ",")
Call Body.Addnewline(2)
Call Body.Appendtext("Ihre Information wurde in der Datenbank aufgenommen und an das Info Team weitergeleitet.")
Call Body.Addnewline(3)
Call Body.Appendtext("Link zu Ihrem Informationsdokument: ")
Call Body.Appenddoclink(firstdoc, "Information")
Call Maildoc.Send(False)
Call firstdoc.Replaceitemvalue("n_MailStatus", 1)
Call firstdoc.Save(0,0)
End Sub
Da des Debugging hier unheimlich schwer ist und nicht ausschließen kann, das mir durchaus noch Know How fehlt trotz der Schulungen der letzten Zeit möchte ich gerne mal hier nachfragen...
Was mach ich denn falsch?
Im PostSave wird die Mail prima versendet. :)
LG,
Thomas
Schwer ist das Debugging an der Stelle aber auch nicht ;-)
Da kommt so ein bisschen dann fehlendes Know-How durch. Ist zwar blöd aber ich kann es auch nur durch probieren, machen und Schulungen versuchen auszugleichen. ;)
Mir ist nicht klar, wie ich das ganze debuggen soll...
Ich kann jetzt so auch nur vermuten, daß zum Zeitpunkt des Agentenaufrufes das NotesDocument (doc) noch nicht existiert und der Agent deswegen die Grätsche macht. Im PostSave hingegen wurde das Dokument ja bereits gespeichert und existiert.
Der Agent wird ja im PostSave aufgerufen... Also müsste das Dokument da auch schon existieren.
Das Item Body wird in den Declarations definiert:
Dim db As NotesDatabase
Dim firstdoc As NotesDocument
Dim Maildoc As NotesDocument
Dim Body As NotesRichTextItem
Wie auch Driri schon geschrieben hat, ist mir das ganze viel zu kompliziert.
Ersetze das gepostete PostOpen durch
Call NewCallMailSend(Source.Document)
Mehr brauchst Du nicht. Dann kommst Du auch definitiv mit dem Debugger ran, ein Agent.Run wird m.E. nicht (immer) debuggt.
Den Agent kannst Du dann in die Wüste schicken ...
Wenn Du einen Grund für einen Agenten hast, dann würde ich auf jeden Fall
Set notesDocument = notesSession.DocumentContext
nutzen.
Wenn es keinen Grund hierfür gibt, dann natürlich so wie oben gesagt direkt in der ScriptLib.
gut... dann quoten wir halt um die Wette... If Not agent.Run(Source.Document.NoteID) = 0 Then
Messagebox "Agent did not run",48, "Failure"
End If
Ein Agent, der mit "run" aufgerufen wird, hat kein Frontend... (bricht sogar ohne Meldung ab, wenn nur ein Dim ws as New NotesUIWorkspace drin ist)... Insofern ist der wie ein "ServerAgent" zu behandeln (der halt im Client- Background läuft)...
Beweis:
1. maske "TEST" mit folgendem code im Postsave:
Dim db As NotesDatabase
Set db = Source.Document.ParentDatabase
Set ag = db.GetAgent( "Test" )
Call ag.Run( Source.Document.NoteID )
Dann Agent "Test" mit folgendem Code: Dim ses As New NotesSession
Dim doc As NotesDocument
Dim ag As NotesAgent
Dim agLog As New NotesLog( "Test" )
Call agLog.Openagentlog()
Set ag = ses.Currentagent
Call agLog.Logaction("agentnoteid=" + ag.Parameterdocid)
Set doc = ses.Documentcontext
If Not doc Is Nothing Then
Print "noteid=" + doc.Noteid
Call agLog.Logaction("noteid=" + doc.Noteid)
Else
Call agLog.Logaction("no noteid")
End If
Call agLog.Close()
Und hier das AgentLog:Started running agent 'Test' on 27.06.2013 13:40:50
27.06.2013 13:40:50: agentnoteid=A9A
27.06.2013 13:40:50: no noteid
Ran LotusScript code
Done running agent 'Test' on 27.06.2013 13:40:50
gut... dann quoten wir halt um die Wette...
Lustig :D
Ich würde nicht auf die Idee kommen einen Agenten so aufzurufen, sondern wenn nichts dagegen spricht immer das folgende nutzen:
@command[ToolsRunMacro];"("(SendMailCall)")")
Grund:
You cannot debug a called agent
Nicht debuggbarer Code ist für mich ein NoGo.