Autor Thema: Mailversand über Agent und Script Library klappt nicht  (Gelesen 5602 mal)

Offline ThomasHB

  • Aktives Mitglied
  • ***
  • Beiträge: 164
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:

Code
Option Public
Option Declare
Use "MailSend"

Use MailSend ruft demnach wenn ich hier nicht falsch liege die Scribt Library auf.

Im Initialize steht folgendes:

Code
	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...

Code
	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:

Code
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

Driri

  • Gast
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #1 am: 27.06.13 - 11:22:13 »
Warum machst Du das überhaupt über einen Agenten ? Du kannst doch direkt die Scriptfunktion aus der Library aufrufen, wenn Du sie in der Maske mit Use eingebunden hast.

Oder wie wird der Agent gestartet ?

Du prüftst im Agenten auch nicht ab, ob das Dokument überhaupt existiert. Das würde ich auf jeden Fall noch mit einbauen.

In der Sub NewCallMailSend fehlt mind. eine Deklaration für das Objekt "Body". Das ist mindestens unsauber. Man sollte sich auf jeden Fall angewöhnen, jedes Objekt auch zu deklararieren. Andernfalls sind die Objekte dann vom Typ Variant.

Außerdem würde ich empfehlen, generell mit Option Declare zu arbeiten. Dann wird man auf solche Dinge schon direkt beim Speichern hingewiesen.


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.


Schwer ist das Debugging an der Stelle aber auch nicht ;-)

Offline ThomasHB

  • Aktives Mitglied
  • ***
  • Beiträge: 164
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #2 am: 27.06.13 - 11:44:35 »
Zitat
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...

Zitat
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:

Code
	Dim db As NotesDatabase
	Dim firstdoc As NotesDocument
	Dim Maildoc As NotesDocument
	Dim Body As NotesRichTextItem

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #3 am: 27.06.13 - 11:51:49 »
Wie auch Driri schon geschrieben hat, ist mir das ganze viel zu kompliziert.

Ersetze das gepostete PostOpen durch

Code
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 ...

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #4 am: 27.06.13 - 12:14:34 »
Wenn Du einen Grund für einen Agenten hast, dann würde ich auf jeden Fall
Code
Set notesDocument = notesSession.DocumentContext
nutzen.

Wenn es keinen Grund hierfür gibt, dann natürlich so wie oben gesagt direkt in der ScriptLib.
Andy

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #5 am: 27.06.13 - 13:06:36 »
Sorry, aber "DocumentContext" ist an dieser Stelle schlicht FALSCH... Auszug aus der Designer- Hilfe:
Zitat
For scheduled agents, before mail arrives, after mail arrives, or any arent running on a Domino server and not invoked through a web browser, this property returns Nothing because there is no current document
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #6 am: 27.06.13 - 13:24:54 »
Sorry, hier muss ich Dich korrigieren:

Aus dem Eingangspost geht hervor, das der Agent aus dem PostSave Event der Forms aufgerufen wird.
Zitat
Aus dem Form heraus wird das Dokument an den Agenten übergeben...
« Letzte Änderung: 27.06.13 - 13:29:26 von Andrew Harder »
Andy

Offline ThomasHB

  • Aktives Mitglied
  • ***
  • Beiträge: 164
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #7 am: 27.06.13 - 13:26:38 »
Aus dem Eingangspost geht hervor, das der Agent aus dem PostSave Event der Forms aufgerufen wird.

Das stimmt...  :)

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.883
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #8 am: 27.06.13 - 13:42:49 »
gut... dann quoten wir halt um die Wette...
Zitat
      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:
Code
	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:
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:
Zitat
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
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #9 am: 27.06.13 - 13:58:33 »
Zitat von: Tode
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:
Code
@command[ToolsRunMacro];"("(SendMailCall)")")

Grund:
Zitat
You cannot debug a called agent
Nicht debuggbarer Code ist für mich ein NoGo.
« Letzte Änderung: 27.06.13 - 14:05:59 von Andrew Harder »
Andy

Driri

  • Gast
Re: Mailversand über Agent und Script Library klappt nicht
« Antwort #10 am: 27.06.13 - 16:07:25 »
In dem beschriebenen Kontext würde ich einfach mal auf den Agenten verzichten und die Sub im PostSave direkt aufrufen.

Das kürzt auch die Diskussion hier ab, die zwar sehr löblich ist, aber vielleicht für Thomas auch etwas unübersichtlich bzw. verwirrend.  ;)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz