Domino 9 und frühere Versionen > ND8: Entwicklung
Nachhilfe beim Exiting-Event
Boox:
Hallo liebe Forum-Gemeinde,
ich (Script-Einsteiger) möchte über ein Exiting-Event eines Optionsfeldes realisieren, dass das Dokument bei der Auswahl des Wertes "OK" automatisch gespeichert wird (ich weiß, vermutlich alles andere als performant, stellt aber kein Problem dar).
Hier mein Code:
Sub Exiting(Source As Field)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
value = uidoc.FieldGetText(Source)
If value = "OK" Then
Call ws.CurrentDocument.Save
End If
End Sub
Das "FieldGetText" haut nicht so hin und ich weiß auch, dass die Funktion eigentlich ein Feldnamen als String erwartet. Allerdings stehe ich auf dem Schlauch, wie ich das mit dem Source-Feld verknüpfen kann. Wenn ich hier den Namen des Feldes als String reinschreibe, funktioniert es wie gewünscht.
Aber: Ich möchte das ganze "portabel" haben, so dass ich das Feld samt Event kopieren kann, ohne jedes Mal den Code anzupassen.
Könnt ihr mir da weiterhelfen?
Viele Grüße
Gregor
jBubbleBoy:
Bei Optionsfeldern geht kein FieldGetText, den Wert erhält man über's Backend, z.B.:
--- Code: ---ws.currentDocument.document.getFirstitem("FeldName").text
--- Ende Code ---
In deinem Fall würde ich aber ein Doc-Refresh (Eigenschaft Feld) anstoßen und im PostRecalc-Ereignis das Speichern regeln, mit:
--- Code: ---if source.document.getFirstitem("FeldName").text = "OK" then source.save
--- Ende Code ---
Boox:
Hallo Erik,
vielen Dank für den Hinweis. Allerdings funktioniert doch FieldGetText zumindest in Verbindung mit dem uidoc. Also zumindest klappt es bei mir, wenn ich es so schreibe:
--- Code: ---Sub Exiting(Source As Field)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
value = uidoc.FieldGetText("t_ok")
If value = "OK" Then
Call ws.CurrentDocument.Save
End If
End Sub
--- Ende Code ---
Meinst Wie gesagt: Mein Ziel ist es, das Feld mehrfach kopieren zu können ("t_ok_1", "t_ok_2", "t_ok_3";...), ohne den Code immer anpassen zu müssen. Und das müsste ich dann ja im PostRecalc trotzdem...
Und nur zur Erklärung: Ich brauche das Feld zwar nur 15x und es wäre kein Problem, 15x das Script anzupassen...aber ich möchte ja auch was dazu lernen und daher frage ich, ob es auch einfacher geht ;D
jBubbleBoy:
Ups, da hab ich doch in der erster Antwort etwas falsches geschrieben ;)
Um die spätere Codepflege zu vereinfachen würde ich eine Funktion schreiben, mit einem Parameter für das betreffende Feld. Den Feldnamen erhältst du mit:
--- Code: ---ws.CurrentDocument.CurrentField
--- Ende Code ---
Mein Favorit wäre aber nach wie vor das PostRecalc-Ereignis, um nicht auf die Anzahl der vorhanden Felder zu achten, würde ich eine Schleife in dieser Art schreiben:
--- Code: ---Dim i%, fName$
i = 1
If ws.CurrentDocument.Document.HasItem("feld_" & i) Then fName = "feld_" & i
Do Until fName = ""
If ws.CurrentDocument.Document.GetFirstItem(fName).text = "OK" Then ws.CurrentDocument.save
i = i + 1
If ws.CurrentDocument.Document.HasItem("feld_" & i) Then fName = "feld_" & i Else fName = ""
Loop
--- Ende Code ---
Peter Klett:
--- Zitat von: jBubbleBoy am 24.04.17 - 21:00:05 ---Mein Favorit wäre aber nach wie vor das PostRecalc-Ereignis, um nicht auf die Anzahl der vorhanden Felder zu achten, würde ich eine Schleife in dieser Art schreiben:
--- Code: ---Dim i%, fName$
i = 1
If ws.CurrentDocument.Document.HasItem("feld_" & i) Then fName = "feld_" & i
Do Until fName = ""
If ws.CurrentDocument.Document.GetFirstItem(fName).text = "OK" Then ws.CurrentDocument.save
i = i + 1
If ws.CurrentDocument.Document.HasItem("feld_" & i) Then fName = "feld_" & i Else fName = ""
Loop
--- Ende Code ---
--- Ende Zitat ---
Dann würde bei einem Postrecalc das Dokument 15 mal gespeichert, wenn alle 15 Felder auf OK stehen. Ich habe es so verstanden, dass nur beim Exiting des Feldes gespeichert werden soll, wenn dieses OK ist. Wobei die Frage erlaubt ist, was passieren soll, wenn ein Feld schon vorher OK war, dann der Cursor in das Feld gesetzt und das Feld danach unverändert verlassen wird. Dann ist das Feld zwar OK, m.E. soll dann aber nicht gespeichert werden. Entweder müsste man die Veränderung selbst feststellen, oder auf das OnChange-Event ausweichen.
Ohne es aktuell getestet zu haben, vermute ich, dass das CurrentField im Postrecalc das nächste Feld ausweist, und damit das falsche, denn das gerade eben verlassene Feld ist ja eigentlich relevant.
Wenn ich mich recht erinnere, habe ich vor vielen Jahren erfolglos versucht, etwas ähnliches allgemeingültig zu schreiben, und passe seither solche Scripte je Feld an. Ist ja in der Regel nur der Feldname zu aktualisieren.
Möglicherweise könnte man mit einem @ThisName im Entering etwas erreichen, das gab es damals noch nicht. Habe aber keine Ahnung, ob das über Evaluate einen sinnvollen Rückgabewert ergibt. Im Entering den aktuellen Feldnamen irgendwo hinschreiben, und im Exiting nach der Aktion wieder entfernen. Theoretisch immerhin denkbar.
EDIT: @ThisName ist natürlich nicht notwendig, sollte ja über CurrentField gehen, wie schon geschrieben wurde
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln