Bei Optionsfeldern geht kein FieldGetText, den Wert erhält man über's Backend, z.B.:
ws.currentDocument.document.getFirstitem("FeldName").text
In deinem Fall würde ich aber ein Doc-Refresh (Eigenschaft Feld) anstoßen und im PostRecalc-Ereignis das Speichern regeln, mit:
if source.document.getFirstitem("FeldName").text = "OK" then source.save
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:
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
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
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:
ws.CurrentDocument.CurrentField
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:
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
Dann würde bei einem Postrecalc das Dokument 15 mal gespeichert, wenn alle 15 Felder auf OK stehen.
das stimmt ;) dabei ist mir eine viel einfachere Lösung eingefallen, im PostRecalc:
If Instr(Lcase(source.CurrentField),"feldname_")=1 Then
If source.Document.GetFirstItem(source.CurrentField).text = "OK" Then source.Save
End If
Das Problem beim OnChange-Event ist, das dieser beim Klick (und setzen des Wertes) nicht ausgelöst wird, das passiert erst bei einem F9-Refresh, Feldeigenschaft "aktualisieren" reicht nicht. In so einer Konstellation (Wenn ich in das Feld klicke, wird ja immer gespeichert) könnte der Nutzer "rausgehen" ohne dabei zu speichern, das gleiche Problem gibt es aber auch beim Exit-Ereignis. Deshalb denke ich mal wäre PostRecalc, auch weil man nur einmal Code schreiben muss, der beste Weg ;)
Frage:
Warum nicht in der Maske auf die Änderung des Feldes reagieren?
Hintergrund:
Ein doc.Save speichert das ganze Dokument. Bevor ich das tue, möchte man vielleicht noch andere Prüfungen vornehmen. Ich stelle mir eine Datenbank mit Masken, in denen irgendwelche Felder eingebaut sind, die vielleicht bei bestimmten Wert-Änderungen das Dokument speichern, ziemlich support-unfreundlich vor.
Lösungsvorschlag:
In Deinem Fall (15 Optionsfelder feld1 .. feld15) könntest Du im QueryRecalc der Maske folgendes schreiben:
Sub Queryrecalc(Source As Notesuidocument, Continue As Variant)
If Left$(Lcase(source.CurrentField),4)="feld" Then
Print "MACH WAS"
Else
Print "ist mir egal"
End If
End Sub
Den Print Befehl kannst Du natürlich auch durch etwas anderes ersetzen ;)
Damit hast Du an einer Stelle Deine Prüfungen/Save's verwaltet, Schreibaufwand ist minimal und falls Du mal eines der Optionsfelder ganz zufällig ;) in eine andere Maske kopierst, fängt diese nicht einfach aus heiterem Himmel an, manchmal das Dokument zu speichern.
Viel Erfolg,
Th.