Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: sja am 30.09.13 - 16:22:59
-
Lieber @atnotes,
es soll in einer Funktion (LotusScript) unter anderem Wert in dem Feld "Form" geändert werden. Da das ganze Script kompliziert ist, habe ich einen Test-Button erstellt mit folgendem Script. Beim Ende der Funktion soll das Dokument geschlossen werden ohne Nachfrage, ob das Dokument gespeichert soll. In allen Feldern werden zugeordnete Werte gespeichert ohne Problem, nur in dem Feld "Form" habe ich Probleme, wird immer alter Wert behalten, egal in de Backend oder Frontend ändere ich den Wert und speichere das Dokument.
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUiDocument
Set uidoc = ws.CurrentDocument
Call uidoc.Refresh
Set doc = uidoc.Document
doc.StatusAngebot = "8"
doc.abgeschlossen_1 = "ja"
doc.abgeschlossen_am = "30.09.2013"
doc.abgeschlossen_durch = "sja"
'doc.Form = "Abshcluss"
Call doc.Replaceitemvalue("Form", "Abschluss" )
Call doc.Save(True, True)
'Call uidoc.FieldSetText( "Form", "Abshcluss" )
'Call uidoc.Save()
doc.saveOption = "0"
'Call uidoc.Save()
Call uidoc.Close
End Sub
Bitte um Hilfe. Vielen Dank im Voraus
Sofia
-
Hallo Sofia,
warum machst du vor dem doc.ReplaceItemValue ein Call?
Versuch es mal so, wie es in der Hilfe steht. :)
This script changes the value of the EstimatedCost item to 122.
Dim doc As NotesDocument
Dim item As NotesItem
'...set value of doc...
Set item = doc.ReplaceItemValue( "EstimatedCost", 122 )
Call doc.Save( True, True )
Chris
-
Du hast hier zwar den Button, aber gibt es mglw. noch eine weitere Aktion, die das Dokument noch einmal aus dem Frontend heraus speichert und dabei den Wert in "Form" wieder überschreibt?
-
Das mit dem Call geht völlig in Ordnung, kann man so schreiben, wenn man keinen Rückgabewert haben will (habe ich in Zusamenhang mit ReplaceItemValue noch nie anders gemacht, und funktioniert immer).
Ich denke, dass das Hauptproblem darin besteht, dass das Dokument geöffnet ist. Ich würde das ganze umdrehen.
1. Dokument ändern
2. Dokument refreshen
3. Dokument speichern
4. Dokument schließen
5. Form ändern
6. Dokument speichern
Dann kommt da bzgl. Form nichts aus dem UI dazwischen.
Etwa so:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUiDocument
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
doc.StatusAngebot = "8"
doc.abgeschlossen_1 = "ja"
doc.abgeschlossen_am = "30.09.2013"
doc.abgeschlossen_durch = "sja"
Call uidoc.Refresh
Call uidoc.Save()
doc.SaveOptions = "0"
Call uidoc.Close
Call doc.RemoveItem ("SaveOptions")
doc.Form = "Abschluss"
Call doc.Save(True, True)
End Sub
Ich hoffe, das ist etwa das, was Du erwartest ...
-
Das eigentliche Hauptproblem ist, dass man das Feld SaveOptions hinten ohne "s" schreibt.
Dann braucht man auch kein replaceitem oder irgend etwas anderes... der Code funktioniert dann einwandfrei.
-
Im Prinzip braucht sie auch garkein Saveoption wenn sie nach dem Ändern des Dokuments im Backend auch dort speichert.
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUiDocument
Set uidoc = ws.CurrentDocument
Call uidoc.Refresh
Set doc = uidoc.Document
doc.StatusAngebot = "8"
doc.abgeschlossen_1 = "ja"
doc.abgeschlossen_am = "30.09.2013"
doc.abgeschlossen_durch = "sja"
Call doc.Replaceitemvalue("Form", "Abschluss" )
Call doc.Save(True, True)
doc.saveOption = "0" (Wird aber hinfällig)
Call doc.Save(True, True)
Call uidoc.Close
End Sub
Chris
-
Natürlich braucht es das Setzen von SaveOptions, denn NotesUIDocument.SavedSinceModified könnte immer noch False sein. Daher gehört auch vorab noch ein NotesUIDocument.Save hinein, um Frontend-Speicherungen, die noch nicht ins Backend-Document publiziert wurden, zu sichern. Insbesondere gilt das, wenn es RTFs im Document gibt, und je nach Kontext ist dann vor den Backend-Stunts sogar noch ein Reload oder eine komplette Auslagerung in ein abgetrenntes Backend-Oject erforderlich!
Bernhard
-
Hm, okay. Danke für die Info Bernhard.
Ich habe den ähnlichen Fall bei mir so gelöst und da kommt keine "Wollen Sie speichern?"-Abfrage
(...)
Feld = ws.Prompt (PROMPT_OKCANCELEDIT, "Name","Geben Sie bitte ein Item an:")
If Not Isempty (Feld) Then
Wert = ws.Prompt (PROMPT_OKCANCELEDIT, "Wert","Geben Sie hier bitte den neuen Wert ein:")
If Not Isempty (Wert) Then
Set item2 = doc.ReplaceItemValue(Feld,Wert)
(...)
Call doc.Save( False, True )
(...)
End If
End If
End Sub
-
Kann es sein, dass Du die Routine auf ein geschlossenes Dokument ausführst?
Wenn Du ein Dokument geöffnet hast, das speichern und "geräuschlos" schließen willst, brauchst Du das SaveOptions, insbesondere wenn die Speicherung im Backend erfolgt. Die Abfrage kommt ja nicht beim Speichern, sondern beim Schließen.
Wichtig ist, dass das SaveOptions gesetzt wird, nachdem das Dokument gespeichert wurde, sonst wird das mitgespeichert, und Du wunderst Dich später, warum die folgenden Änderungen des Dokuments nicht mehr gespeichert werden.
Möglicherweise ist das SaveOptions bei Speicherung des uidoc hinfällig, ich würde es in solch einem Konstrukt trotzdem immer setzen.
-
Hallo @All,
herzlich danke ich allen für die Hilfe, habe was neues für mich dabei gelernt. Ich überlege das alles, ausprobiere und teile die Ergebnisse mit, aber Nachmittag, jetzt muss ich dringend andere Arbeit erledigen.
Vielen Dank
Liebe Grüße
Sofia
-
Hallo Peter,
nein. Ich ruf das Script als Aktion in der Menüleiste aus einer Maske heraus auf. Die Änderungen werden eben auch erst beim nächsten öffnen des Dokuments sichtbar.
-
Hallo Peter,
nein. Ich ruf das Script als Aktion in der Menüleiste aus einer Maske heraus auf. Die Änderungen werden eben auch erst beim nächsten öffnen des Dokuments sichtbar.
Und das Dokument ist dabei im Bearbeitenmodus? Das Verhalten kenne ich eigentlich nur im Lesemodus.
Im Bearbeitenmodus sind auch Änderungen im Backend sofort sichtbar, ausgenommen natürlich Richtext, aber den änderst Du auch nicht mit ReplaceItemValue.
-
Guten Morgen zusammen,
in meinem Fall öffne ich das dokument aus einer Ansicht heraus, lass es im "Lesen"-Zustand und ruf dann über die Menüleiste meinen oben geposteten Code auf. Klappt einwandfrei :)
Aber wir sollten auf Sofias Antwort warten damit ihr Thread nicht zu sehr von ihrer Frage abkommt.
Chris
-
Hallo @All,
erst vielen Dank für reiche Hilfe, hat mir wirklich sehr geholfen! :-)
Hier ist meine Lösung für den Button "Abschluss". Den Button u. a. Buttons gehört zur einen Teilmaske "Workflow", wo und auch in einem Skript in der Scriptbibliotheken werden alle verwendete hier Variablen deklariert und einige initialisiert.
Also das ganzen Lösung-Script in dem Button "Abschluss"
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
Call uidoc.Refresh
Dim result As Integer
result = ws.Prompt(PROMPT_YESNO,"Abschluss", "Soll das Angebot wirklich abgeschlossen werden? ")
If result = 1 Then
Call uidoc.Refresh
Set docWF = uidoc.Document
tmpHistory = tmpDatumZeit & ": Abgeschlossen von " & cName & Chr(13) & tmpHistory
text1 = "Abgeschlossen."
text2 = tmpDatumZeit & " abgeschlossen von " & cName
docWF.abgeschlossen = text2
docWF.abgeschlossen_1 = "ja"
docWF.abgeschlossen_am = tmpDatumZeit
docWF.abgeschlossen_durch = cName
docWF.StatusAngebot = "7" 'zum Abschluss
docWF.history = tmpHistory
result = ws.Prompt(PROMPT_OK,"Info",text1)
Call uidoc.Save() 'Script in QuerySave: u. a. Call StartWF(doc) -> myWorkflowScript in der ScriptBibliotheken u. a. werden auch alle Versionen vom Angebot abgeschlossen und StatusAngebot auf “8“ gesetzt.
Set uidoc = ws.CurrentDocument
Call uidoc.Refresh
Set docWF = uidoc.Document
Call docWF.Replaceitemvalue("Form", "Abschluss" )
Call docWF.Save(True, True)
docWF.SaveOptions = "0"
Call uidoc.Close
End If
End Sub
Noch mal herzlichen Dank und Liebe Grüße
Sofia