Also zunächst mal: Dass ComputeWithForm keine berechneten Felder kann ist Humbug.
Für Deine Frage ist das genau die richtige Methode.
Jetzt kommt das grosse ABER:
Man muss wissen, wie ComputeWithForm arbeitet, um nicht auf die Schnauze zu fallen:
Der Befehl arbeitet die Maske von oben nach unten ab. Läuft er an einer Stelle auf einen Fehler, dann wird der Rest der Maske nicht mehr berechnet.
Man hat also einen inkonsistenten Datensatz: Oberhalb des Fehlers berechnet, unterhalb des Fehlers nicht.
Ein "Fehler" kann dabei auch entstehen an Stellen, an denen der [ToolsRefreshSelectedDocuments] oder auch ein frontend- F9 keinen Fehler werfen: Die Formel- Sprache ist "Fehlertoleranter" und macht wesentlich mehr interne Typen- Umwandlungen als das im Backend passiert.
Ein Beispiel:
Wenn Du ein Datumsfeld über doc.ReplaceItemValue( "Feld" , "01.03.2011" ) befüllst, und dann das Dokument im Frontend (oder per ToolsRefresh) aktualisierst, dann klappt das alles, im Anschluss ist das Feld sauber mit einem Notes- Datumswert befüllt.
Rufst Du aber ComputeWithForm auf, dann wird er mit einem Fehler "Datum erwartet" abbrechen...
Deshalb muss man bei ComputeWithForm immer beide Parameter auf True setzen und den Fehler abfangen. Dummerweise ist die Meldung, die ComputeWithForm auswirft nicht sonderlich aussagekräftig, und das herausfinden, welches Feld den Fehler wirft, ist nicht immer trivial.
Ich bin schon ab und zu hingegangen und habe ein berechnetes Feld "Test" in meiner Maske eingefügt, das sich z.B. auf die aktuelle Uhrzeit berechnet.
Dann habe ich mir die oben genannte Eigenschaft zu Nutze gemacht und das Feld immer weiter in der Maske nach unten geschoben, bis es nach ComputeWithForm (beide Parameter auf False, da man sonst das Dokument nicht speichern kann) nicht mehr korrekt gefüllt war. Direkt oberhalb des Test- Feldes ist dann das fehlerhafte Feld.
Zu beachten ist also bei der Verwendung von ComputeWithForm folgendes:
1. Beide Parameter auf True setzen, sonst bekommt man inkonsistente Daten
2. Im Script alle Felder mit den richtigen Datentypen befüllen, sonst läuft ComputeWithForm eventuell auf einen Fehler
3. (optional) Die Formeln in der Maske "Bulletproof" machen, indem man z.B. in Datumsberechnungen auf gültige Datumswerte abfragt bzw. per @ToTime konvertiert und auch bei Zahlenberechnungen mit @ToNumber arbeitet, auch wenn man (eigentlich) erwartet, dass da immer ne Zahl drin steht
4. Es gibt einen Bug in ComputeWithForm in der Version 8.5.x: Wenn nicht VOR dem ComputeWithForm dem NotesDocument- Objekt mindestens 1 Wert zugewiesen wurde, dann tut ComputeWithForm schlicht und ergreifend nichts.
set doc = db.GetDocumentByUnid( strUnid )
call doc.ComputeWithForm( True , True)
call doc.Save( True , True )
ändern NICHTS am Dokument
set doc = db.GetDocumentByUnid( strUnid )
call doc.ReplaceItemValue( "IrgendeinFeld" , "irgeneinWert" )
oder
doc.IrgendeinFeld = "Irgendeinwert"
call doc.ComputeWithForm( True , True)
call doc.Save( True , True )
funktioniert.
In seltenen Fällen kann es auch sein, dass man die Maske gar nicht in den Griff bekommt. Dann hat man zwei Optionen:
1. Wirklich alle Formeln in Script nachprogrammieren (sehr aufwändig und ich muss zwei Stellen pflegen, wenn sich was ändert)
2. Eine "Compute- Maske" erstellen, die nur die Felder enthält, die ich neu berechnen will, eventuell als gemeinsame Felder, und dann
vor dem ComputeWithForm einfach die Maske über doc.ReplaceItemValue( "Form" , "Compute-Maske" ) umsetzen und nach dem ComputeWithForm wieder zurück auf die Original- Maske setzen
HTH
Tode