Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: vrhsva am 11.12.19 - 14:50:49

Titel: Felder über ein Backend-Script neu berechnen lassen
Beitrag von: vrhsva am 11.12.19 - 14:50:49
Hallo

ich habe folgendes Szenario:

in einer Datenbank gibt es eine Reihe von Kinddokumenten, die eine Preiskalkulation enthalten. Da gibt es einige Eingabefelder und einige berechnete Felder. Beispiel für ein berechnetes Feld:
Anzahl * Stunden * Stundensatz
Der Stundensatz wird ebanfalls berechnet und zwar mit der Formel @eval(meinFormelFeld)
In dem meinFormelFeld steht eine Formel, die unter anderem auf ein Profil-Dokument zugreift.
Also praktisch gesehen werden die Stundensätze zentral in einem Profil-Dokument gepflegt und bei Änderung sollen die Preiskalkulationen alle neu berechnet werden.

Das soll über einen Agenten gemacht werden, der alle Preiskalkulations-Dokumente einmal im Backend öffnet, ein ComputeWithForm durchführt und abspeichert.
Leider scheint das ComputeWithForm die Formeln in den Formelfeldern aber nicht auszuführen. Zumindest wurden nach der Ausführung die Stundensätze in den Dokumenten nicht aktualisiert, was ich ja eigentlich damit erreichen wollte.

Gibt es da ne andere Möglichkeit, ohne dass man die Dokumente im UI öffnen und ein RefreshHideFormulas durchführen muss?
Titel: Re: Felder über ein Backend-Script neu berechnen lassen
Beitrag von: Peter Klett am 11.12.19 - 17:21:02
Wenn ComputeWithForm nicht funktioniert, wirst Du die Funktionalität wohl im Agenten nachbauen müssen
Titel: Re: Felder über ein Backend-Script neu berechnen lassen
Beitrag von: SD am 11.12.19 - 18:31:29
Wenn ich Profildokument höre, muss ich immer an Caching denken.

Theoretisch könnte sein, dass der Agent noch mit dem alten Wert aus dem Profildokument arbeitet, und sich deswegen nichts ändert. Ebenso kann es aber auch sein, dass der Agent die Werte richtig ausrechnet, aber wenn man am Client das Dokument wieder öffnet, um die Werte nachzuschauen, werden die Computed-Felder nochmal am Client neu berechnet und dafür werden dann die alten Werte aus dem Profildokument verwendet.

Ich würde den Agent mal so ergänzen, dass er alle relevanten Feldwerte vor dem ComputeWithForm rausprintet und dann nach dem ComputeWithForm nochmal. Dann weiß man schon mal sicher, was der Agent macht.

Wenn das richtig ist, würde ich im Client ohne das Dokument zu öffnen (auch nicht in einer Vorschau) in den Dokumenteigenschaften nachschauen, was in den Feldern gespeichert ist.

So kann man zumindest schon mal eingrenzen, wo genau der Fehler liegt.
Titel: Re: Felder über ein Backend-Script neu berechnen lassen
Beitrag von: Tode am 11.12.19 - 19:28:51
ComputeWithForm ist ziemlich unzuverlässig: genau wie das frontend arbeitet es die Felder von oben nach unten und links nach rechts ab. Wirft ein Feld einen Fehler (z.B. text erwartet o.ä.) dann wird der Rest der Maske nicht weiter berechnet. Dabei werden ber3chnet zur Anzeige Felder NICHT berechnet, rechnest Du also mit einem Feld, das nur Cfd ist, dann wird die Formel auf einen Fehler laufen. Wenn es wirklich nur eine einfache Muliplikation ist, würde ich den Code in Script nachbauen und das ergebnis per Replaceitemvalue direkt ins Dokument schreiben.
Titel: Re: Felder über ein Backend-Script neu berechnen lassen
Beitrag von: vrhsva am 13.12.19 - 12:40:20
Vielen Dank für die Anregungen.
Bin selbst durch Einblenden der versteckten Formelfelder auf die Lösung gekommen.
Und zwar hatte ich die Felder, die die Formeln für andere berechnete Felder enthalten mit dem Feldtyp "Formula" versehen. Als Einstellung dafür "Literalize Fields". Nun habe ich beim Öffnen des Dokumentes gesehen, das der Inhalt des Formelfeldes alle Variablen, die sich auf Feldnamen beziehen, durch den Wert des Feldes ersetzt hat.
Das ist natürlich doof, wenn die Felder weit dahinterliegen. Eigentlich wollte ich ja, dass die Formeln in den Formelfelder erst ausgeführt werden, wenn sie in einem anderen Feld mit @eval(Formelfeld) aufgerufen werden.
Nun habe ich sämtliche Formelfelder als berechnete Textfelder deklariert und die Berechnungs-Formel selbst in {} geschrieben. Somit werden die Formeln erst ausgeführt, wenn sie dran sind.
Anschließend funktionierte auch computewithform und aus der Ansicht heraus @command([ToolsRefreshSelectedDocs]).

Eine Frage noch: Wo muss ich denn hier klicken, damit dieser Thread in der Übersicht als erledigt (geschlossen) angezeigt wird?
Titel: Re: Felder über ein Backend-Script neu berechnen lassen
Beitrag von: Peter Klett am 13.12.19 - 13:50:25
Im ersten Beitrag das Symbol "Daumen hoch" eintragen