Ich wirbele nichts durcheinander. Bitte lies Dir meinen Post nochmal durch.
Ich gebe jetzt extra explizit immer an, ob ich von einem UI-Feld oder von einem Dokument-Item spreche.
Ich habe lediglich geschrieben, dass ich nicht an das Frontend UI Body Feld rankomme, um für den Inhalt für mein Backend-Dokument-Item nutzen zu können.
Tatsache ist, ich muss Backend-Dokument-Funktionen nutzen.
Ich werde den Tip von @Diali versuchen, um an das Frontend-UI-Dokument von meinem Temp-Dokument ranzukommen.
Dann werde ich den Inhalt vom Frontend-UI-Body-Feld des Benutzer-Dokuments in das Frontend-UI-Body-Feld meines Temp-Dokuments zu kopieren und das Temp-Dokument anschließend zu speichern.
Danach kann ich das Backend-Body-Item des Temp-Dokuments verwenden, um das Suchen&Ersetzen durchzuführen. Anschließend muss ich das Temp-Dokument speichern, schließen und wieder öffnen.
Letztlich dann das Frontend-UI-Body-Feld des Temp-Dokuments kopieren und hoffentlich in das Frontend-UI-Body-Feld des Benutzer-Dokuments zurückkopieren können.
Body-Inhalt von ungesendeter Mail lesen?
- PeterSchneider
- Erledigt
-
-
also ein RT-Feld Backend und Frontend manipulieren funktioniert schon - allerdings nicht auf direktem Weg!
Die temp. Maske mit einem RT-Feld hast du schon angelegt.
1. Frontend nach Backend
- RT-Feld im Frontend verändern
- Frontend-Dokument mit dem RT-Feld speichern
- Backend-Dokument als neues Objekt holen
- zugreifen aufs Backend RT-Feld2. Backend nach Frontend
- Backend RT-Feld verändern
- Backend-Dokument speichern (in wenigen Sonderfällen geht es auch ohne zu speichern)
- Frontend Dokument öffnen (ggf. im Editmode)
- Zugriff aufs Fontend RT-FeldGruß
Dirk -
Das habe ich, nur hast du dann wohl meinen Post nicht richtig gelesen, da ich nur von Frontendzugriffen geschrieben habe
-
@taurec
und ich geschrieben hatte, dass ich nicht mit Frontendzugriffen alleine weiterkomme um Suchen&Ersetzen hinzubekommen.
Sollte es dennoch möglich sein, ein Richtext-Feld im Frontend zu verändern (Suchen&Ersetzen), dann bitte ich um einen entsprechenden Beweis.@Diali
- RT-Feld im Frontend verändern
genau daran scheitert es ja schon. Meines wirklich bescheidenen Wissens nach kann ich das gewünschte Verändern (Suchen&Ersetzen) nur im Backend durchführen.
Ich bin leider noch nicht dazu gekommen, Deinen Tip mit dem Zugriff auf das UI-Dokument auszuprobieren. -
> RT-Feld im Frontend verändern
geht nur über LotusScript und die Win-API und dies nicht besonders gut / zuverlässig.Manipulationen mache ich immer im Backend und zeige dann das Ergebnis nur noch im Frontend an.
Gruß
Dirk -
Ich denke, ich bin ein gutes Stück weitergekommen, habe aber noch ein paar kleine Probleme:
- Es werden immer 2 Temp-Dokumente erstellt (wohl weil ich 2xspeichere) aber ich habe keine Erklärung warum.
- Obwohl das erwartete Ergebnis im Temp-Dokument gespeichert wird, wird das Temp-UI-Dokument nicht mit tempuidoc.reload korrekt aktualisiert.
- Ich möchte das Temp-UI-Dokument schließen ohne dass der Anwender gefragt wird. Aber das Feld "SaveOptions" gibt es nicht ??Hier der aktuelle Code:
Code
Alles anzeigenSet uidoc = ws.Currentdocument s_body = uidoc.Fieldgettext("Body") ' RT-Body vom uidoc selektieren und in Zwischenablage kopieren uidoc.Gotofield("Body") Call uidoc.Selectall Call uidoc.Copy ' Neues Temp-Dokument erstellen und UI-Dokument holen Set tempdoc = New NotesDocument(db) Set tempuidoc = ws.Editdocument(True, tempdoc) ' RT-Body vom tempuidoc selektieren und Zwischenablage einfügen tempuidoc.Gotofield("Body") Call tempuidoc.Paste ' Temp-Dokument speichern Call tempuidoc.Save Set tempdoc = tempuidoc.Document ' RT-Body vom Tempdoc holen Set body = tempdoc.Getfirstitem("Body") ' Suche nach vorhandenem Platzhalter pattern = |%(\w+)%| Set regex = CreateObject("VBScript.Regexp") regex.Global = True regex.IgnoreCase = True regex.Pattern = pattern Set matches = regex.Execute(s_body) ' Alle gefundenen Patterns (%text%) If matches.count > 0 Then ForAll m In matches ForAll submatch In m.Submatches ' gefundenes Feld durch Platzhalter ersetzen Set rtnav = body.CreateNavigator Set rtrange = body.CreateRange Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH) Call rtrange.SetBegin(rtnav) If rtrange.FindAndReplace (m.Value, "%" & s_placeholder & "%", RT_REPL_ALL + RT_FIND_CASEINSENSITIVE) > 0 Then Call body.Compact Call body.Update End If End ForAll End ForAll ' Dokument nochmals speichern und UI-Dokument refreshen Call tempdoc.Save(True, False, True) tempuidoc.Reload ' Temp-UI-Body selektieren und Inhalt kopieren tempuidoc.Gotofield("Body") tempuidoc.Selectall tempuidoc.Copy ' UI-Body selektieren, markieren und Inhalt mit Zwischenablage überschreiben uidoc.Gotofield("Body") uidoc.Selectall uidoc.Clear uidoc.Paste ' Temp-Dokument schließen und löschen Call tempuidoc.fieldsettext("SaveOptions", "0") Call tempuidoc.close(True) tempdoc.Removepermanently(True)
LG Peter
-
merke dir die Universal-ID des temp-Doks. Danach das tempuidoc schließen und dann wieder öffnen.
Bei relodes im NotesUiDocument steht:ZitatRich text items are an exception. Modifications made to rich-text items in the back-end document do not appear in the front-end until the document is closed and reopened.
Aus welchem Grund benutzt du VBScript? Dies ist dann nicht mehr auf anderen Platformen (Linux, MAC) lauffähig und bei jeder Änderung im Betriebssystem musst du diese Funktion überprüfen, ob diese noch genau so unterstützt wird.
Gruß
Dirk -
Zitat
merke dir die Universal-ID des temp-Doks. Danach das tempuidoc schließen und dann wieder öffnen.
Ok, damit habe ich eine Antwort auf Problem 2.Bleibt noch Problem 1: Warum werden 2 Temp-Dokumente erzeugt? Liegt es daran, dass ich beim 1. Mal tempuidoc.save verwende und beim 2. Mal tempdoc.save?
und 3: Wieso existiert das Feld SaveOptions nicht? In allen im Internet gefundenen Beispielen wird immer nur geschrieben, dass man das Feld SaveOptions auf "0" setzen soll.
Aus dem einfachen Grund, dass ich im Internet auf der Suche nach Beispielen war und das das erste Beispiel war, das auch direkt funktionierte. Hast Du ein Beispiel für eine Plattform-unabhängige Alternative?LG Peter
-
mehrere Dokumente weren erzeugt, weil du einmal das Frontend und einmal das Backenddokument speicherst.
Das Feld Saveoptions musst du selber ind ie Maske einbauen. Dabei handelt es sich um einen reservierten Namen für ein Feld. Ein Feld mit diesem Namen hat Sonderfunktionen.
So wie ich es lese, sehen deine Platzhalter so aus: %Hier_steht_ein_Platzhalter%
Meine Bedenken sind, dass ich an dem %-Zeichen nicht erkennen kann, welches das vorgestellte und welches das nachgestellte Prozentzeichen ist. Wenn in einem Text ein % vorkommt, dürfte dies die Logik im ungünstigsten Fall durcheinander bringen.
Für so etwas halte ich mich an die XML-Tag-Schreibweise. Also z.B. so: <FELD>Mein_Feld</FELD>
Damit kann ich ellativ einfach ermitteln, welche Werte sich zwischen den Tags befinden.Code
Alles anzeigentxt = "EingangsText" dim arr as Variant dim arr2 as Variant arr = split(txt, "</FELD>" ' zerlegen in ein Array, Trenner ist "<FELD>" (öffnender Tag) if isArray(arr) Then ' Array gefunden for i = 1 to ubound(arr) ' vor der Stelle 0 stand kein <FELD> arr2 = split(arr(i), "</FELD>") ' einzelne Strings aus dem Array arr zerlegen, Trenner "</FELD>" (schließender Tag) If isArray(arr2) then If ubound(arr2) > 0 then ' mindestens einmal muss der String "</FELD>" vorkommen in dem Teilstring arr(i) wert = arr2(0) ' an der Stelle 0 steht der Teil zwischen den beiden Tags End if End If Next end if
Gruß
Dirk -
und 3: Wieso existiert das Feld SaveOptions nicht? In allen im Internet gefundenen Beispielen wird immer nur geschrieben, dass man das Feld SaveOptions auf "0" setzen soll.
Das kann ich mir auf Anhieb nicht vorstellen. Suche ich nach "ibm domino saveoptions", ist gleich der zweite Treffer ein Link aufs "IBM Notes and Domino Application Development wiki" und dort wird man dazu aufgefordert "just add a SaveOptions field".
Der vierte Link führt bei mir auf die 6.5er Designer-Hilfe, die das Thema "Reserved fields that control mailing options" behandelt und auch dort ist die Anweisung ziemlich unzweideutig: "To build mailing options into a form, create fields that have reserved names in Designer." Was reservierte Namen sind, wird beschrieben.Und wenn ich einfach mal nach "ibm domino set item value" google, ist gleich der zweite Treffer ein Link aufs Kapitel "Creating an item and assigning values in LotusScript classes" aus der 6er Designer-Hilfe. Dort ist beschrieben, wie man Werte den Items zuweist und auch der Unterschied zwischen Item und Feld dargelegt: "The user cannot see the new item as a field in the document unless you add the field to the form design. However, the item exists and can be accessed programmatically."
Die Ergebnisse der Google-Suche mögen sich in Abhängigkeit von Browser, seiner Version, seiner Sprache und dem bisherigen Suchverhalten unterscheiden. Andere Suchmaschinen mit ihren eigenen Indizes mögen auch andere Resultate in anderer Reihenfolge präsentieren. Aber dass man so gar nichts dazu finden würde, ist eine -mit Verlaub- mutige Behauptung...
-
Zitat
Das Feld Saveoptions musst du selber ind ie Maske einbauen. Dabei handelt es sich um einen reservierten Namen für ein Feld. Ein Feld mit diesem Namen hat Sonderfunktionen.
Ich habe versucht, das Feld anzulegen und das Dokument zu speichern, aber der Anwender wird noch immer gefragt, ob er das Dokument speichern möchte oder nicht. -
Ich habe bei Google nach "lotusscript SaveOptions" gesucht und mir die ersten 4 Suchergebnisse der Reihe angeschaut:
- Notes/Domino 4 and 5 Forum : SaveOptions := "0" in lotus ...
- Modify a rich text field in the UI without having to save and re ...
- Is there a way to close a doc using LotusScript without the ...
- SaveOptions confusion - Experts ExchangeUnd auch noch
http://www-01.ibm.com/support/…THOUT_SAVING.html?lang=deAuch hier konnte ich keinen Hinweis finden, dass ich das Item selbst manuell erstellen muss.
Es ist unverzeihlich, dass ich die falschen Suchbegriffe verwendet habe und auch nicht alle gefundenen 2230 Seiten angeschaut habe.
Insofern war es natürlich unangemessen mutig von mir diese Behauptung so völlig aus der Luft gegriffen zu behaupten.
Zu meiner sehr schwachen Entschuldigung hatte ich geschrieben "im Internet gefundenen Beispielen" und nicht "alle im Internet existierenden Beispielen". -
das Feld solltest du in die Maske einfügen (Textfeld, eventuell verborgen) ...
und dann- uidoc.Save
- Saveoptions auf "0" setzen
- uidoc.CloseWenn du vorher Saveoptions auf 0 setzt, wird das UI-Dokument auch nicht mehr gespeichert und ohne Nachfrage geschlossen.
Gruß
Dirk -
Notes/Domino 4 and 5 Forum : SaveOptions := "0" in lotus ...
Ich möchte das jetzt nicht bis zum Exzess durchdeklinieren und hier unnötig eskalieren lassen, aber gerade dieses Beispiel ("dieses", nicht "alle, die irgendwann mal irgendwer irgendwo gepostet hat" ... nur damit wir vom Gleichen reden!) ist wirklich sehr schön gewählt.
Der Post im aufgeführten Forum enthält einen Link, der -wäre man ihm gefolgt- die exakte Syntax angibt:CodeCall uidoc.Save 'save the document first ===> das ist der wichtige Teil ... ==> doc.SaveOptions="0" 'then set the SaveOptions field to 0 Call uidoc.Close 'close the document
Damit hätte alles Wesentliche gesagt sein können, denn das Beispiel gibt bereits an, wie man ein Item programmatisch erzeugt.
-
-
naja ...
du speicherst das Backend-Dokument und setzt im Backend-Dokument das Feld Saveoptions. Davon bekommt das Frontend-Dokument aber nix mit, deshalb kommt die Abfrage.
Es macht in deinem Fall auch keinen Sinn Saveoptions im Backend zu setzten, denn falls du irgendo dieses Backend-Dokument speicherst, dann steht die "0" im Backend-Dokument drin und du kannst das Frontend-Dokument nicht mehr speichern.
- 1. Speicher das Frontend-Dokument
- 2. setzte im frontend_Dokument das Feld SaveOptions auf "0"
- 3. Schließe das Frontend-DokumentGruß
Dirk -
Sowas hatte ich schon befürchtet.
Also scheint es keine Möglichkeit zu geben, das UI-Dokument zu schließen, wenn es nicht schon vorher ein Feld SaveOptions gab.
Nachträglich erstellen funktioniert wol auch nicht.
Da ich die Standard-Mail-Maske aber nicht anspassen möchte, muss ich also wohl doch eine eigene Dummy-Maske mit einem RT-Feld und dem SaveOptions-Feld erstellen?
Dann habe ich noch 2 Fragen:
1. Wie kann ich dann beiCodeSet tempdoc = New NotesDocument(db)Call tempdoc.Save(True, False, True) Set tempuidoc = ws.Editdocument(True, tempdoc)
mitgeben, welche Maske verwendet werden soll?2. Wieso habe ich bisher in keiner selbstgebauten Maske das Feld SaveOptions erstellt, kann aber beim Button "abbrechen" die funktionierende Formel
verwenden? -
Code
Set tempdoc = New NotesDocument(db) tempdoc.Form = "DeinMaskenname" ' hier den entsprechednen Maskennamen eintragen tempdoc.Saveoptions = "" ' erstellt ein Feld SaveOptions Call tempdoc.Save(True, False, True) Set tempuidoc = ws.Editdocument(True, tempdoc)
Field ändern den Wert eines vorhandenen Feldes oder erzeugt ein neues Feld.
Da du im Frontend-Dokument stehst, wird auch dort das Feld erzeugt.Mit Evaluate kannst du zwar eine @Function aus dem Script heraus ausführen, aber als Objekt wird ein NotesDocument mitgegeben, d.h. Backend.
Gruß
Dirk -
Genau das hatte ich auch schon versucht:
CodeSet tempdoc = New NotesDocument(db) tempdoc.SaveOptions = "0" Call tempdoc.Save(True, False, True) Set tempuidoc = ws.Editdocument(True, tempdoc)
Im Debugger sehe ich, dass dass tempdoc bisher nur als einziges Feld "SaveOptions" hat. Im tempuidoc existiert aber noch nichts.
Erst nach dem
werden im tempuidoc.document alle Items aufgeführt, aber hier auch nicht das SaveOptions.
Insofern macht es Sinn, dass der Anwender immer noch gefragt wird.
Es scheint, als ob das Feld tatsächlich in der Maske vorhanden sein muss, aber warum funktioniert ein Formel-Button in der Maske, der ja auch SaveOptions auf "0" setzt, ohne dass das Feld existiert. -
Ich habe es jetzt endlich hinbekommen. Mit einer eigenen Dummy-Maske, in der das Feld "SaveOptions" schon existiert, funktioniert es tatsächlich.
Vielen Dank für die Unterstützung und die Geduld.
LG Peter