Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: sja am 18.06.13 - 10:33:28
-
Hallo Zusammen,
eine Frage:
In Formula Language kann man mit @if(@MailSend.... ) prüfen ob mail gesendet ist.
Wie schreibt man das richtig in LotusScript?
Mit der Suche habe ich nichts gefunden, ewtl. kann ich nicht, maine Frage richtig für die Suche zu formulieren.
Vielen dank im Voraus
Sofia
-
Hallo,
Versendest Du das Dokument auch ueber Script und speicherst es nach dem Senden bzw. beim Senden?
Andreas
-
es ist so:
in einer DB in dem geöffnetem Dokument A gibt es ein Button, beim Klick auf den Batton, wird eine neue Mail in der Mail-DB aktuelles User geöffnet mit Übernahme von bestimmten Daten aus dem Dokument A (programmiert in LotusScript), dabei bleibt das Dokument A auch geöffnet. Wenn die Mail gesendet wird, dann in der Dokument A in dem Feld "history" sollte aktuelles Datum, aktueller user usw. gespeichert werden.
-
Da hast Du Dir aber was ziemlich kompliziertes vorgenommen...
Entweder Du musst die Mailschablone anpassen, dass Sie in einem entsprechenden Event (QuerySend o.ä.) schaut, ob es ein Dokument gibt, aus dem heraus das aktuelle Memo erstellt wurde, oder aber Du musst mit Remote Event Binding arbeiten... Das ist auf jeden Fall die hohe Kunst der Script- Programmierung (die sicherlich nicht viele schon ausprobiert haben, weil die Anwendungsfälle zu selten sind), aber wenn Du da ran willst, dann gib Bescheid...
-
Also, in einfache Version sieht der Script so aus:
Dim ws As NotesUIWorkspace
Dim s As NotesSession
Dim db As NotesDatabase
Dim dbMail As NotesDatabase
Dim uidb As NotesDatabase
Dim uiDocA As NotesUIDocument
Dim docA As NotesDocument
Dim uiDocM As NotesUIDocument
Dim docM As NotesDocument
Dim tmpSubject As String
Dim rtitemA As NotesRichTextItem
Dim object As NotesEmbeddedObject
Dim body As NotesRichTextItem
'Kaufmännischer Ansprechpartner
Dim tmpAPK_EMail As String 'Email
Dim tmpAPK_Salutation As String 'Anrede
Dim tmpAPK_LastName As String 'Nachname
Dim tmpAnrede As String
Dim tmpText As String
Dim tmpBody As Variant
Dim tmpSAPNr As String
Dim user As String 'aktueller User
Dim cName As String
Dim tmpDatum As String 'aktuelles Datum
Dim tmpZeit As String 'akeuelle Zeit (hh:mm)
Dim tmpDatumZeit As String 'aktuelles Datum undZeit
Dim tmpDatumZeitName As String
Dim tmpTextHistory As String
Dim tmpHistory As String
Sub Initialize
Set s = New NotesSession
Set ws = New NotesUIWorkspace
Set uidb = s.CurrentDatabase 'aktuelle Anwendung "Workflow Angebot"
Set uiDocA = ws.CurrentDocument 'aktuell geöffnete Anbebot-Dokument
uiDocA.Editmode = True
Call uiDocA.Refresh
Call uiDocA.Save
Set docA = uiDocA.Document
user = s.UserName
cName = s.CommonUserName
tmpDatum= Format(Now, "Short Date") 'Aktuelles Datum
tmpZeit = Format(Now, "Short Time") 'Aktuelle Zeit
tmpDatumZeit = tmpDatum & " " & tmpZeit 'Aktuelle TT.MM.JJJJ hh:mm
tmpDatumZeitName = tmpDatum & " " & tmpZeit & " " & cName & Chr(13)
tmpTextHistory = tmpDatumZeit & ": Mail-Angebot versendet von " & cName
tmpHistory = tmpTextHistory & Chr(13) & uiDocA.FieldGetText("history")
docA.history = tmpHistory
tmpAPK_EMail = uiDocA.FieldGetText("APK_EMail")
tmpAPK_Salutation = uiDocA.FieldGetText("APK_Salutation")
tmpAPK_LastName = uiDocA.FieldGetText("APK_LastName")
tmpSAPNr = uiDocA.FieldGetText("SAPNr")
If tmpAPK_Salutation = "Frau" Then
tmpAnrede = "Sehr geehrte Frau " & tmpAPK_LastName & ","
ElseIf tmpAPK_Salutation = "Herr" Then
tmpAnrede = "Sehr geehrter Herr " & tmpAPK_LastName & ","
End If
tmpText = "anbei finden Sie unser Angebot " & tmpSAPNr
tmpSubject = "Angebot " & tmpSAPNr
If docA.Hasembedded Then
Set rtitemA = docA.GetFirstItem("Kunde_Angebot")
End If
Call Erstellen()
End Sub
Function Erstellen()
Dim mailDb As NotesDatabase
Dim docM As NotesDocument
Dim uidoc As NotesUIDocument
Dim msgStr As String
Set mailDb = New NotesDatabase( "", "" )
Call mailDb.OpenMail
Set docM = New NotesDocument( mailDb )
docM.Form = "Memo"
docM.Subject = tmpSubject
docM.EnterSendTo = tmpAPK_EMail
If Not rtitemA Is Nothing Then
If (rtitemA.Type = RICHTEXT ) Then
If Not IsEmpty(rtitemA.EmbeddedObjects) Then
ForAll object In rtitemA.EmbeddedObjects
If ( object.Type = EMBED_ATTACHMENT ) Then
Call rtitemA.CopyItemToDocument( docM, "Body" )
Exit ForAll
End If
End ForAll
End If
End If
End If
If False Then
Call body.AppendText( tmpAnrede )
Call body.AddNewLine( 2 )
Call body.AppendText( tmpText )
End If
Set uidoc = ws.Editdocument(True, docM)
Call uidoc.GotoField( "Body" )
msgStr = tmpAnrede & Chr(10) & Chr(10)
msgStr = msgStr & tmpText & Chr(10) & Chr(10)
Call uidoc.InsertText( msgStr )
Call docA.Save(True, True)
End Function
In diesem Version wird Information in dem Feld „history“ auf jedem Fall gespeichert, unabhängig davon hat der User Mail versendet oder nicht.
Ich brauche, dass den Befehl
Call docA.Save(True, True)
wird nur dann ausgeführt, wenn der User Mail versendet hat. In Formula Language kann man mit @if(@MailSend.... ) das machen. Gibt es eine Analog auch in LotusScript?
irgenwas wie if uidoc.send…. ???
-
Und genau dass hat Dir Tode (Torsten) doch geschrieben.
Nein.
Es sei denn, dass Du Dich mit den bereits erwaehnten Moeglichkeiten auseinandersetzt.
NotesDocument.Send bzw. NotesUIDocument.Send haben keinen Rueckgabewert a la
TRUE=ich habe die Mail erfolgreich versendet oder FALSE=es ist zu einem Fehler gekommen.
Und bei @If(@MailSend(...)) hast Du genaugenommen auch nicht die Gewissheit, dass die Mail
erfolgreich versendet wurde. Da hast nur die die Aussage darueber, dass es bei der Funktion @MailSend
nicht zu einem Fehler gekommen ist.
Andreas
-
Wie Tode schon geschrieben hat, geht das nicht so einfach, wie Du das denkst. Du hast m.E. vier Möglichkeiten (die ersten beiden davon hat Tode bereits erwähnt)
1. Remote-Binding (mag funktionieren, habe ich selbst noch nie benutzt)
2. Ändern der Mailschablone (würde ich persönlich nie tun, schon garnicht, für solch einen Fall)
3. Du verschickst die Mail direkt im Script ohne Bearbeitungsmöglichkeit durch den User (falls das die Anforderung hergibt, kann ich nicht beurteilen)
4. Du erstellst die Mail nicht in der Maildatenbank des Benutzers, sondern z.B. in der Datenbank
Option 4 hat mehrere Vorteile
1. Die Dokumentation über versendete Mails ist in einer zentralen Datenbank und nicht zerfleddert in den Maildatenbanken der User
2. Bei der Gestaltung der eigenen Mailmaske bist Du frei und kannst solche Anforderungen einfach einbauen, z.B. so:
UniversalID des aufrufenden Dokuments in das Maildokument übernehmen
aufrufendes Dokument schließen
Beim Senden der Mail aufrufendes Dokument über UniversalID suchen und Versand protokollieren
bei Bedarf aufrufendes Dokument erneut öffnen (im Queryclose, dann passiert es auch, wenn nicht gesendet wurde).
Die ganze Aktion läuft dann auch, wenn das aufrufenden Dokument schon längst geschlossen wurde, z.B. beim Versand erst am nächsten Tag. Remote-Binding wird da sicherlich versagen (spätestens, wenn der Client zwischen Erstellen und Senden der Mail geschlossen wurde).
-
autsch ... da hast du ja was vor.
Mit dem Event-Handling wirst du vermutlich nicht glücklich, da due solange warten müsstest, bis das Mail versendet worden ist.
Solange muss du in deiner Routine bleiben und Schleifchen drehen, wie man dann gleichzeitig das Mail fertig machen soll, frag ich mich dann gerade.
Vielleicht geht auch folgender Ansatz ... du erstellst die Mail und gibts sie im Frontend dem User zur Verfügung ... fügst aber als BCC deine Datenbank an (die natürlich als Mail-In Datenbank konfiguriert werden muss).
Somit bekommst du mit, sobald die Mail versendet wurde. Den Rest (Historie schreiben), kannst du per Agent machen, der nach Eingang neuer Mail läuft oder beim Speichern von Dokument A, wenn du es speicherst oder schließt.
Das - denke ich - ist eher noch im Bereich des Möglichen.
-
Herzlich danke ich alle für so schnelle und reiche Information/Hilfe. Dabei habe ich vieles gelernt und hoffe noch einige andere auch :-). Für mich, denke ich, die beste Lösung wäre die 4. Variant von Peter:
die Mail nicht in der Maildatenbank des Benutzers, sondern in der Anwendung-Datenbank erstellen und vom aktuellen Benutzer versenden lassen, aber hier entsteht weiteres Problem (bzw. Aufgabe): die Mail soll mit der Signatur aktuelles Users versendet werden aber unsere Firma hat sehr komplizierte Signatur.
Sofia
-
Ist die Signatur beim Erstellen einer Mail in der Maildatenbank des Benutzers sofort korrekt dargestellt?
Dann könntest Du mittels Script dort ein Dokument erstellen, in das Body-Feld im Frontend gehen, alles markieren und in die Zwischenablage kopieren.
Eine andere Alternative wäre, die Mail in der Datenbank zu erstellen, vom Benutzer editieren zu lassen, und beim Senden eine Mail mit dem fertigen Text in der persönlichen Maildatenbank zu erstellen und direkt per Script zu versenden. Hängt davon ab, wo und wann die Signatur gerechnet wird.
Noch eine Möglichkeit wäre, die Signaturerstellung nachzubauen. Falls die fertige Signatur irgendwo in der Maildatenbank abgelegt ist, sollte das kein allzugroßes Problem sein. "Komplizierte Signatur" klingt allerdings nach etwas anderem ...
EDIT:
Oder vielleicht doch Marcos Ansatz mit dem bcc, finde ich auch nicht schlecht. Einziger Haken ist, dass der Benutzer dort manuell eingreifen und den Blindkopieempfänger löschen könnte.
-
Herzlichen Dank für die Vorschläge, alle finde ich interessant
1. Signatur
Mail-Datenbanken sind nicht meinen Bereich und ich habe da überhaupt keinen Einfluss.
Signatur wird beim Absenden berechnet, denke ich, und zwar anderes für interne und externe Mailing. Für externe Mail kommen auch verschiedene Bild-Links usw. Zu dieser Programmierung bin ich nicht zu gelassen und ich weiß nicht was da läuft. Also mit Signatur kann ich nicht manipulieren.
2. BCC auch keine schlechte Idee, aber die Anwendung ist bei und für jede Geschäftsstelle separate Datenbank und unsere Administratoren werden alles anderes als begeistern, so viele Datenbanken als Mail-In zu konfigurieren und betreuen.
3. Die geeignete finde ich der Vorschlag von Peter:
... die Mail in der Datenbank zu erstellen, vom Benutzer editieren zu lassen, und beim Senden eine Mail mit dem fertigen Text in der persönlichen Maildatenbank zu erstellen und direkt per Script zu versenden.
Für mich geeignete Lösun:
...
Call uidoc.Send()
Call uidoc.Close(True)
tmpTextHistory = tmpDatumZeit & ": Angebot versendet aus der Mail-Datenbank von " & cName & " an " & tmpAPK_EMail
tmpHistory = tmpTextHistory & Chr(13) & uiDocA.FieldGetText("history")
'tmpHistory = tmpTextHistory & Chr(13) & docA.history(0)
docA.history = tmpHistory
Dim textPrompt As String
textPrompt = "Angebot versendet aus der Mail-Datenbank von " & cName & " an " & tmpAPK_EMail
call ws.Prompt(PROMPT_OK, "Angebot", textPrompt)
Call docA.Save(True, True)
End Function
Die Mail wir auf jedem Fall versendet und in der Mail-Datenbank des Versenders gespeichert. In der history wird es bemerkt. Selbst Mail brauchen wir nicht in der Anwendung. Der Angebot ist sowieso in der Dokument A als Anhang, in history haben wir: wann, von wem und an wen wurde Angebot gesendet. Wenn es erwünscht wird, nicht nur Standart-Text, sondern zusätzliche Eingaben und zusätzliche Empfänger, dann kann ich einfach in der Maske von Dokument A noch zwei editierbaren Felder integrieren, sagen wir Text-Angebot und Empfänger-Angebot und in Script werden Werte aus diesen Felder übernommen.
Noch mal herzlichen Dank an alle! Ihr habt mir sehr geholfen!
Liebe Grüße
Sofia