Hallo zusammen. Ich habe ein auf den erstem Blick sehr einfaches Problem, konnte es aber dennoch bisher nicht lösen.
Situation:
Ich habe ein Hauptdokument aus dem heraus ich ein Tochterdokument (Typ: Antwort) erzeuge. Das Antwortdokument soll eine E-Mail werden und enthält sie klassichen Felder Subject, Body, CopyTo etc. und noch ein paar weitere, die aus dem Mutterdoc übernommen werden bei der Neuanlage. Deshalb trägt es auch das Kennzeichen "...übernimmt Werte des gewählten Doc ...". Im Body des Mails möchte ich nun aber einen DocLink zum Mutterdoc mitsenden und diesen bei der Neuanlage des Antwortdokumentes auch schon mal eintragen. Das Ganze funktioniert mit:
@Command([EditMakeDocLink]) ;
@Command([Compose]; ""; "(Mail)");
@Command([EditGotoField] ; "Body" );
@Command([EditInsertText]; @NewLine + @NewLine );
@Command([EditInsertText]; "DocLink zum Dokument => " );
@Command([EditPaste]) ;
@Command([EditGotoField] ; "SendTo" )
auch einwandfrei.
Wenn das Mutterdoc aber noch nicht gespeichert (und reöffnet) wurde, bekomme ich den sinngemäßen Fehler: "... kein Dokument gewählt ...". Es reicht dann auch nicht aus, dass Mutterdoc zu speichern und es nochmal zu versuchen. Ich muss es speichern, schließen, öffnen und dann klappt es.
Hab es jetzt schon mit
If uidoc.EditMode = True Then
Call uidoc.Refresh
Call uidoc.Save
Call uidoc.Close(True)
Set newuidoc=workspace.editdocument(True,doc)
Call workspace.ComposeDocument( "", "", "(Mail)" )
Else
Call workspace.ComposeDocument( "", "", "(Mail)" )
End If
gemacht; klappt! Habe aber da das riesen Problem, dass ich den DocLink nicht in den Body hineinbekomme, wie bei der Formel ... Sowas wie @Command([EditMakeDocLink]) gibt es offenbar nicht in Script. AppendDocLink klappt nicht
Also mir dampft inzwischen die Birne ....
Hat jemand eine Idee??
Vielen Dank im voraus
Alex
ja, habe ich bereits getan, aber bisher keinen weg gefunden, den doclink im body des maildocs sichtbar zu machen, ohne dieses im vorfeld zu speichern. genau das möchte ich aber nicht, da der nutzer im zweifel die mailerstellung doch noch abbrechen möchte. das doc ist aber dann schon da, also müsste ich irgendwie löschen, das widerum erfordert löschrechte in der acl ... soll so auch nicht sein.
kann ich einen doclink im rt field sichtbar machen, ohne dieses zu speichern? meine mal irgendwo hier im forum eine anleitung dafür gesehen zu haben, kann das post aber bei besten willen nicht wiederfinden...
mein code bisher
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim newuidoc As NotesUIDocument
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim maildoc As NotesDocument
Dim rtitem As NotesRichTextItem
Set uidoc = workspace.CurrentDocument
Set db = session.CurrentDatabase
Set doc = uidoc.Document
Set maildoc = New NotesDocument( db )
Call maildoc.ReplaceItemValue( "Form", "(Mail)" )
Set rtitem = New NotesRichTextItem( maildoc, "Body" )
Call rtitem.AppendText("Link => ")
Call rtitem.AppendDocLink( doc, "Dokument" )
Call maildoc.MakeResponse(doc)
'muss Speichern wirklich sein ==== ???
Call maildoc.Save(True,False, True)
Set newuidoc = workspace.editdocument(True,maildoc)
Call newuidoc.GotoField("SendTo")
Mit @Formeln in dem Kontext habe ich zu wenig Erfahrung, aber es gäbe noch den (undokumentierten) LS-Befehl
notesRichTextItem.AddLinkByIds( dbReplicaID$, serverHint$, viewUNID$, documentUNID$, comment$ [, HotSpotText$ ])
Dieser prüft nicht auf die Existenz des Dokuments/View/Datenbank sondern fügt den Link "einfach so" hinzu.
Natürlich musst du irgendwie sicherstellen, dass man die Mail dann nur versenden kann, wenn das Dok gespeichert wurde.
Weiterhin muss man wissen, dass man Richtext über Die Backend-LS-Klassen nur ändern kannies nur funktioniert wenn das Dokument noch nicht offen ist.
(z.B. im QueryOpen).
Sobald UI beteiligt ist, muss andere Wege gehen, z.B auf die (ebenfalls undokumentierte) Methode "importItem" zurückgreifen oder über den Zwischenablage-Trick.
Gruß
Roland
Dann haben wir aneinander vorbei geredet...
Du meinst das Dokument welches den DocLink enthält muss gespeichert werden?
dann ist dein Problem schlichtweg ein anderes....
Set rtitem = New NotesRichTextItem( maildoc, "Body" )
Call rtitem.AppendText("Link => ")
Call rtitem.AppendDocLink( doc, "Dokument" )
und sollte durch ein zusätzliches "call rtItem.update()" nach allen RT-Operationen gelöst sein.
Gruß
Roland
jetzt gehts. hier meine lösung für alle die vielleicht mal ein ähnliches problem haben. ist doch eigentlich eine gaaaanz einfache sache gewesen ...
also, einen button in die maske, der folgenden formelcode ausführt
@If( @IsNewDoc ;
@If( @IsValid;
@Do(
@Command([RunAgent];"(Reopen)");
@Command([ToolsRunMacro];"(Mail)")
);
@Return(""));
@Command([RunAgent];"(Mail)") )
1. im ersten agenten "(Reopen)" neues doc speichern (validierung der pflichtfelder läuft im querysave) und dann reopen.
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim newuidoc As NotesUIDocument
Dim db As NotesDatabase
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set db = session.CurrentDatabase
Set doc = uidoc.Document
Call uidoc.Refresh
Call uidoc.Save
Call uidoc.Close(False)
Set newuidoc=workspace.editdocument(True,doc)
2. im 2. agenten dann die erstellung der eigentlichen mail
@Command([EditMakeDocLink]) ;
@Command([Compose]; ""; "(Mail)");
@Command([EditGotoField] ; "Body" );
@Command([EditInsertText]; @NewLine + @NewLine );
@Command([EditInsertText]; "DocLink zum Mutterdokument " );
@Command([EditPaste]) ;
@Command([EditGotoField] ; "SendTo" )
funktioniert wie sau. ging nur bei meinen ersten versuchen nicht, weil ich im quellcode des reopen agenten statt uidoc.Close(False) den parameter uidoc.Close(True) verwendet hatte. damit war das doc fürs reopen nach dem schließen nicht mehr im zugriff und ich bekam einen fehler. ok, workaround über GetDocByUniID wäre dann noch gegangen, habe ich aber nicht gleich dran gedacht.
wie auch immer .... herzlichen dank an alle beteiligten
alex