Autor Thema: Agent um Erinnerungsmails als Aufgaben zu übernehmen  (Gelesen 8202 mal)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Moin,moin,

die Erinnerungen, die ich mir mache, lasse ich mir immer selbst per E-Mail schicken, die dann in einem Wiedervorlage-Ordner landen.

Jetzt hatte ich überlegt mir nen Agenten zu machen, der für Mails in dem Ordner jeweils eine Aufgabe erstellt.

Habe jetzt grob folgendes Codegerüst:

Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doccol As NotesDocumentCollection
Dim QuellDoc As NotesDocument
Dim AufgabenDoc As NotesDocument

   
Set db = s.CurrentDatabase
Set view = db.GetView("Wiedervorlage")
Set Quelldoc = view.GetFirstDocument
   
While Not (Quelldoc Is Nothing)
   Set AufgabenDoc = db.CreateDocument
   AufgabenDoc.form = "Task"
   AufgabenDoc.StartDate = Now
   AufgabenDoc.Subject = Mid(Quelldoc.Subject(0),8,Len(Quelldoc.Subject(0)))
      
   Call AufgabenDoc.Save(True,False)
      
   Set Quelldoc = view.GetNextDocument(Quelldoc)
wend



Er erstellt mir auch wunderbar, die Aufgaben. Wenn ich diese jedoch öffne, oder speichern möchte erscheint folgende Fehlermeldung:

"Element in Dokument nicht gefunden"

Also, Debugger an und nachgeschaut. Er hängt sich im Postopen der Maske Task bei der Zeile "if(source.InPreviewPane) then auf.

Bei normalen Aufgaben, ist der Wert = false, also habe ich meinen Code um die Zeile AufgabenDoc.InPreviewPane = False erweitert, jedoch leider mit demselben Ergebnis.

Was muss ich machen, damit der Fehler nicht mehr erscheint? Bin da etwas ratlos.

Gruß
Demian
« Letzte Änderung: 23.11.07 - 12:50:54 von Demian »
Gruß
Demian

Offline pete_bla

  • Senior Mitglied
  • ****
  • Beiträge: 455
  • Geschlecht: Männlich
  • dot net gitz net!
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #1 am: 23.11.07 - 17:38:29 »
Hi,

ich versteh hier auch was nicht,
...
if(source.InPreviewPane)
...
bezieht sich doch auf die Eigenschaft des NotesUIDocuments, das Du gerade öffnen möchtest,
ob dieses im "NotesPreview" oder normal geöffnet wird.

...
AufgabenDoc.InPreviewPane = False
...
bringt Dir dann hierfür garnichts, ausser dass das Feld "InPreviewPane" mit 0 befüllt wird.

Der Fehler muss wo anderst stecken (weiss es aber auch nicht auswendig)
Vergleich doch einfach mal eine "reguläre Aufgabe", welche Felder da exisiteren.
Irgendein relevantes muss da fehlen/falsch sein.

Eventuell reicht Dir auch, wenn Du vor dem
call AufgabenDoc.Save
deines "Tasks"
Code
Call AufgabenDoc.Computewithform(false,false)
einbaust.
bzw. zum testen:
Code
call AufgabenDoc.Computewithform(false, TRUE )

Gruss, Pete(r)
pete(r)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #2 am: 24.11.07 - 18:13:10 »
Moin Pete,

vielen Dank für den Tipp mit Computewithform. Daran lags.

Allerdings ist mir jetzt aufgefallen, dass bei den geöffneten Aufgaben die Aktion „Als abgeschlossen markieren“  nicht vorhanden ist. Diese ist nur aus der Ansicht heraus verfügbar, aber damit kann ich leben.

Nochmals Danke für die Hilfe.

Gruß
Demian
 
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #3 am: 25.11.07 - 11:29:10 »
Du brauchst doch hierfür nur der Hide-when-Formel für den Button zu folgen:
Code
 @If(@TextToNumber(@Version) < 174;@True;@False) |
@IsMember(NoticeType; "F" : "C") | DueState = 9 | (TaskType = "2" & tmpOwnerHW != "1") |
 ( @IsAvailable(OrgRepeat) & !@IsAvailable($Ref) & NoticeType != "I" )  | @LowerCase(@Name([CN]; Chair)) != @LowerCase(@Name([CN]; tmpOwner))
 | tmpRW = 0 | (TaskType = "2"  & 
!@IsAvailable(PostedDate))

Irgendeines der Items wird nicht belegt sein (weil es von ComputeWithForm nicht gefüllt werden kann). Ich tippe mal auf Chair  ;)

Bernhard
« Letzte Änderung: 25.11.07 - 21:00:08 von koehlerbv »

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #4 am: 25.11.07 - 20:57:30 »
Moin Bernhard,

es war das Chair. Wobei einmal aus Ansicht heraus die Aktion "als abgeschlossen mark." und wieder retour, dann ist das Feld gesetzt gewesen.

Aber so ist es natürlich schöner  ;) Danke für den Tipp.

Nachdem ich mir die Felder, der per Script und der "echt" erstellten Aufgaben angeschaut hab, tun sich da ganz viele Fragen auf, bezüglich den Feldern auf, denen ich besser nicht näher auf den Grund gehe.  ;D In  den per Script erstellten Aufgaben gibt es weeeiiiiit mehr Felder als in den echt erstellten Aufgaben.

Muss mir jetzt erst mal überlegen, wo ich das Erstellen der Aufgaben einbaue. Das mit dem Wiedervorlage Ordner ist insofern problematisch, weil bei der Erinnerungsmail die Kategorie der Erinnerung nicht mitübergeben wird.

Am besten direkt beim Erstellen einer Erinnerung. Aber was mach ich dann mit wiederholenden Erinnerungen? Naja, mal schauen.

Gruß
Demian
« Letzte Änderung: 25.11.07 - 21:07:32 von Demian »
Gruß
Demian

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #5 am: 26.11.07 - 16:57:28 »
Moin, moin,

ich habe mich entschlossen im Postsave der Erinnerung einen Agenten zu starten, der die erforderlichen Aufgaben erstellt.

Maske _Kalendereintrag

Code
Sub Postsave(Source As Notesuidocument)
	'**************************************************************************************
	'Dieser Code startet den Agenten "Aufgabe erstellen" und übergibt NoteID der erstellten Erinnerung
	'**************************************************************************************
	If AufgabeErstellen = True Then
	   Dim s As New NotesSession
	   Dim db As NotesDatabase
	   Dim doc As NotesDocument
	   Dim agent As NotesAgent
	
	   Set db = s.CurrentDatabase	
	   Set agent =  db.GetAgent("Aufgabe erstellen")		
	   Set doc = source.Document

	   Call agent.RunOnServer(doc.NoteID)	
	End If

If (source.InPreviewPane) Then Exit Sub

Call csEventObj.PostSave()	
End Sub


Doc ist zwar gesetzt, aber seltsamerweise ist doc.NoteID = ""  ???

Entspricht source nicht der eben gespeicherten Erinnerung?

Gruß
Demian
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #6 am: 26.11.07 - 17:19:48 »
Source ist das Frontend-Objekt Deines eben gespeicherten Dokuments - richtig. Und NoteID steht dort zur Verfügung. Auch Deine Syntax ist korrekt.
Wo stellst Du denn fest, dass NoteID ein Leerstring sein soll?

Bernhard

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #7 am: 26.11.07 - 17:34:43 »
im Debugger. Nachdem der Agent mehrmals scheinbar nicht gestartet ist, hab ich nen Log-Script mitlaufen lassen.

Sub Initialize
   '*******************************************************************************************************
   'Funktionen:
   'Aufgabe anhand der vom User erzeugten Erinnerung erstellen
   'Mailbenachrichtigung der Erinnerung hinzufügen
   
   'Beschreibung:
   'Wird im Postsave der  Maske _Kalendereintrag nach dem Originalcode ausgeführt.
   '
   'Parameter:
   'ParameterDocID = erstellte Erinnerung
   '*******************************************************************************************************
   'Allgemein   
   Dim agent As NotesAgent      
   '*******************************************************************************************************
   
   Set s = New NotesSession
   Set db = s.CurrentDatabase   
   Set agent = s.CurrentAgent   
   
   Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
   "Suche Erinnerung")   
   
   Set Erinnerung = db.GetDocumentByID(agent.ParameterDocID)
   
   If Not (Erinnerung Is Nothing) Then
      Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
      "Erinnerung gefunden")   
      
      Call MailBenachrichtigung(Erinnerung)
      Call AufgabeErstellen(Erinnerung)   
   Else
      Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
      "Erinnerung nicht gefunden")   
   End If
End Sub


Das 1. Log macht er noch. Er kommt also scheinbar bis Set Erinnerung = db.GetDocumentByID(agent.ParameterDocID) und schmiert dann ab.

Gruß
Demian


PS: Habe jetzt nochmal im Debugger geschaut. Es ist doch kein Leerstring sondern "0". Allerdings auch schon bei Source.
« Letzte Änderung: 09.12.07 - 10:05:19 von Demian »
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #8 am: 26.11.07 - 17:45:29 »
"Scheint abzuschmieren" ist nicht so hilfreich.
Lass Dir doch mal die NoteID loggen - und baue ein ErrorHandling ein.

Bernhard

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #9 am: 26.11.07 - 18:23:59 »
also, er wirft den Fehler 4270 Invalid NoteID im Agenten aus. Hab mal nen Screenshot aus dem Debugger bei.

« Letzte Änderung: 26.11.07 - 18:25:39 von Demian »
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #10 am: 26.11.07 - 19:02:57 »
Sehr merkwürdig. Die UniversalID ist da, die NoteID aber nicht ... Was drehst Du ggf. noch vorher? Schraubst Du am SaveOptions-Item?

Bernhard

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #11 am: 27.11.07 - 07:41:08 »
Moin Bernhard,

die einzigen Änderungen die ich in der Maske _Kalendereintrag gemacht habe, ist das oben gezeigte Postsave. Und im Queryopen habe ich vor dem Originalcode noch folgende Zeile eingebaut.   

'AufgabeErstellen wird postsave abgefragt
If source.IsNewDoc Then AufgabeErstellen = True

Ansonsten ist die Maske im Originalzustand. Was ist denn das Save-Options Item???

Gruß
Demian

EDIT: Und natürlich noch die Deklaration von AufgabeErstellen im globalen Deklarationsteil der Maske.
« Letzte Änderung: 27.11.07 - 09:18:39 von Demian »
Gruß
Demian

Offline pete_bla

  • Senior Mitglied
  • ****
  • Beiträge: 455
  • Geschlecht: Männlich
  • dot net gitz net!
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #12 am: 27.11.07 - 16:16:54 »
Hi,

dass die NotesID leer ist (bzw. nicht vorhanden)
ist eigentlich ein Hinweis dass du ein "neues" Dokument in Verwendung hast.
(die universalid gibts dann schon, die noteid meisst erst nach dem save)
source.IsNewDoc = True
ist nur dann war, wenn das Dokument tatsächlich UI mit z.B. @Command([Compose] ...) erstellt wurde,
hast Du es im Backend bereits "vorbereitet" und dann erst geöffnet, ist es schon nicht mehr .IsNewDoc.

Und zur agent.ParameterDocID würde ich diese erst einer Variablen zuweisen, da kannst du schauen ob auch einen mitgegeben wurde.
Zitat
ErrinnerungID = agent.ParameterDocID
if ErrinnerungID  = "" then
    print {mist keine ID}
    exit sub
Else
     Set Errinnerung = db.getdocumentByID(ErrinnerungID )
     
...
denn
Set Errinnerung = db.getdocumentByID(ErrinnerungID )
schmeisst einen Fehler, wenn das Doc nicht da ist (gespeichert wurde) ! -> On Error einbauen

Gruss, Pete(r)

nachtrag: sorry Bernhard - war wohl ein freudscher Vertipper
« Letzte Änderung: 27.11.07 - 16:41:35 von pete_bla »
pete(r)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #13 am: 27.11.07 - 16:21:06 »
... scheisst einen Fehler, wenn das Doc nicht da ist ...

Puh, wie vulgär  ;D

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #14 am: 27.11.07 - 16:50:54 »
Moin Pete,

das mit dem On Error hatte ich nach dem Hinweis von Bernhard schon gemacht  ;D Aber außer dem Fehler 4270 wirft er nichts aus.

Naja, ich hatte das extra im PostSave, weil ich davon ausgehe, dass dieses Ereignis erst nach dem Speichern eintritt ???

Gruß
Demian

PS: Im Querysave der Maske ist ja source as notesuidocument als Parameter. AufgabeErstellen war bisher auch immer true.
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #15 am: 27.11.07 - 17:01:27 »
Ich hatte mir das gestern mal nachgebaut (wenn auch ohne Agent) - und ich bekam bei neuen Dokumenten im PostSave sehr wohl eine NoteID. Habe ich das richtig verstanden: Du hattest gestern im Debugger im Appointment-Dokument NoteID im PostSave kontrolliert?

Bernhard

PS: Pete, das mit dem Vertipper hatte ich mir schon gedacht. Freudscher Vertipper würde ich aber nicht sagen (dass würde ja Abgründe Deiner Seele auftun  ;D), eher lustig ... und wie es jedem von uns passieren kann  ;)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #16 am: 27.11.07 - 17:29:54 »
Moin Bernhard,

ja. Habe es mir jetzt nochmal angeschaut und nen größeren (Inhalt) Screenshot gemacht.

Gruß
Demian

EDIT: Ich habe es mir jetzt auch mal mit dem Mailfile meines anderen Benutzers ausprobiert. Selbes Ergebnis.

EDIT2: Bin jetzt mal hin und habe ne lokale Maildb auf Grundlage der Mail(R7) erstellt und es dort probiert. Selbes Ergebnis.

« Letzte Änderung: 27.11.07 - 17:40:50 von Demian »
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #17 am: 27.11.07 - 18:46:18 »
Hm, ich habe mir das jetzt mal direkt im Mailfile (ich habe mal das 7er Template hergenommen) nachvollzogen: Während es in einer "nackernden" DB klappt (ein neu erstelltes Dokument hat nach dem Speichern im PostSave bereits eine NoteID) ist dies im Mailfile (Appointment Type 4) nicht der Fall. Ich habe mir das mal für "further investigations" notiert und werde mich dringend darum kümmern - ich sehe da eine üble Wissenslücke.

Was aber sofort funktioniert: Der PostOpen-Code beginnt mit
Call Source.Document.Save (True, False, True)
Setze dahinter spassenshalber ein
Messagebox Source.Document.NoteID
und Dir wir die NoteID angezeigt (und dann natürlich auch an den Agent übergeben).

Was mir aber bei der Sache (ich konnte das nun nicht sooo tiefschürfend verfolgen) noch auffällt: Warum machst Du das eigentlich überhaupt via Agent? RunOnServer funktioniert nun ja auch nicht überall ... Warum rufst Du zum Erzeugen eines Task-Documents nicht einfach eine entsprechende Function auf?

Bernhard

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #18 am: 27.11.07 - 20:33:12 »
also habe jetzt folgendes ins Postopen

If Not source.IsNewDoc Then Msgbox source.Document.NoteID

und er wirft mir die Note-ID aus. Allerdings finde ich kein

Call Source.Document.Save (True, False, True)

im Postopen?


Zitat
RunOnServer funktioniert nun ja auch nicht überall ...


Inwieweit? Wissenslücke in Bezug auf was?

Naja man liest ja immer wieder, dass in den Originamaildatenbanken usw. keine Änderungen vorgenommen werden sollen. Also beschränke ich mich auf die nur notwendigsten Zeilen in den Original-Masken und lagere alles in einen Agenten aus. Bei evtl. Updateschwierigkeiten brauch ich dann nur den Agenten rauskopieren, und ihn zu löschen (hoffentlich).


Gruß
Demian


PS: Und der Agent hat inzwischen so seine Zeilen...wobei ich wohl doch in ne Scriptbibliothek auslager und es mit db.GetDocumentByUNID versuche, die ich im Postopen von _Kalendereintrag  speicher und im Postsave der Scriptbibliothek übergebe.

Sub Initialize
   '*******************************************************************************************************
   'Funktionen:
   'Aufgabe anhand der vom User erzeugten Erinnerung erstellen
   'Mailbenachrichtigung der Erinnerung hinzufügen
   
   'Beschreibung:
   'Wird im Postsave der  Maske _Kalendereintrag nach dem Originalcode ausgeführt.
   '
   'Parameter:
   'ParameterDocID = erstellte Erinnerung
   '*******************************************************************************************************
   'Allgemein   
   Dim agent As NotesAgent      
   '*******************************************************************************************************
   On Error Goto Fehler
   
   Set s = New NotesSession
   Set db = s.CurrentDatabase   
   Set agent = s.CurrentAgent   
   
   Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
   "Suche Erinnerung")   
   
   Set Erinnerung = db.GetDocumentByID(agent.ParameterDocID)
   
   If Not (Erinnerung Is Nothing) Then
      Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
      "Erinnerung gefunden")   
      
      Call MailBenachrichtigung(Erinnerung)
      Call AufgabeErstellen(Erinnerung)   
   Else
      Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
      "Erinnerung nicht gefunden")   
   End If
   
Fehler:
   Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","Initialize",_
   Str(Err) & ": " & Error$)   
End Sub


 
Function MailBenachrichtigung(Erinnerung As NotesDocument)
   'Diese Funktion setzt die Benachrichtigungsrelevanten Felder
   
   Call Erinnerung.ReplaceItemValue("$Alarmdescription",Erinnerung.Subject(0))
   Call Erinnerung.ReplaceItemValue("$AlarmMemoOptions", "2")
   Call Erinnerung.ReplaceItemValue("$AlarmSendTo", s.CommonUserName)
   Call Erinnerung.ReplaceItemValue("$AlarmUnit", "M")
   
   Call Erinnerung.Save(True,False)   
   
   Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","MailBenachrichtigung",_
   "Alle Mail-relevanten Felder geändert")
End Function



Function AufgabeErstellen(Erinnerung As NotesDocument)
   'Aufgabe erstellen
   Set Aufgabe = db.CreateDocument
   
   Aufgabe.Form = "Task"
   
   Aufgabe.StartDate = Now
   Aufgabe.Subject = Erinnerung.Subject(0)
   Aufgabe.Categories = Erinnerung.Categories(0)
   Aufgabe.Chair = s.CommonUserName
   
   Call Aufgabe.ComputeWithForm(False,True)
   
   Call Aufgabe.Save(True,False)
   
   Call Logeintrag_Erstellen(db.Title,s.CommonUserName,"Agent: Aufgabe erstellen","AufgabeErstellen",_
   "Aufgabe entspr. Erinnerung erstellt")   
End Function

   
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Agent um Erinnerungsmails als Aufgaben zu übernehmen
« Antwort #19 am: 27.11.07 - 20:54:21 »
also habe jetzt folgendes ins Postopen

If Not source.IsNewDoc Then Msgbox source.Document.NoteID

und er wirft mir die Note-ID aus. Allerdings finde ich kein

Call Source.Document.Save (True, False, True)

Zu Punkt 1: Dann war das wohl kein neues Dokument ...
Zu Punkt 2: Diese Zeile sollst Du nicht finden, sondern einfügen. Das AppointmentDoc muss ja eh gespeichert werden, wenn daraufhin dann eine Task erstellt werden soll.

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz