Priorität bei Ausführung
Im Formelwerk gibt es die Möglichkeit, eine Priorität bei Ausführung (bzw. Execution Order) für Formeln zu definieren. Damit diese angewendet wird muss vor CoPlanner 11 Release 2 2024 der Parameter „FormulasUsePriorityQueue“ im svrconfig.xml auf true gesetzt sein, ab dieser Version ist es immer automatisch aktiviert.
Mit dieser Option der Formelabarbeitung werden Formeln nicht wie bisher nach der Reihenfolge, in der die Formeln durch die Änderungen der Tabelle getriggert wurden, abgearbeitet, sondern nach Priorität.
Anhand eines einfachen Beispiels werden altes und neues Verhalten verglichen: wenn sich in der Gewinn- und Verlustrechnung die Umsätze ändern, dann ändert sich der Gewinnvortrag und auch die Bilanz muss neu gerechnet werden.
Ohne Anpassung der Priorität wird jetzt mit der Änderung eines Umsatzes im Jänner der Gewinn-/Verlustvortrag für den Februar angepasst und die Bilanz neu gerechnet, durch die Änderung des Gewinn-/Verlustvortrags im Februar ändert sich auch der Gewinn-/Verlustvortrag im März, und muss somit neu gerechnet werden. Beim Schreiben dieser Änderung wird auch wieder die Berechnung der Bilanz ausgelöst.
Vereinfacht gesagt, aus einer Umsatzänderung resultiert auch eine Gewinn-/Verluständerung, die monatsweise weitergeschrieben werden muss und bei jedem Weiterschreiben wird auch die Bilanz neu gerechnet.
Sinnvoll wäre es aber, zuerst die GuV fertig zu rechnen (d.h. den Gewinnvortrag bis Ende Jahr weiterzuschreiben), und erst dann die Daten einmal in die Bilanz zu übernehmen.
Dies kann über die Priorität erreicht werden: hat die Formel für den Gewinn-/Verlustvortrag z.B. eine Priorität von 1 und die Formel, die die Bilanz aktualisiert, eine Priorität von 2, so wird bei jedem Weiterschreiben eine weitere Berechnung des Gewinn-/Verlustvortrags und eine Berechnung der Bilanz in die Berechnungsqueue gestellt.
In der Queue wird die Formel mit Priorität 1 vorgereiht, wodurch das Berechnen des Gewinn-/Verlustvortrags vor der Berechnung der Bilanz abgeschlossen wird. Zusätzlich erkennt das System, das es bereits eine Anforderung, die Bilanz neu zu rechnen, in der Queue hat und stellt diese Anforderung daher nicht mehr zusätzlich in die Queue.
Festlegen der Reihenfolge
Die Priorität für die Abarbeitung einer Formel wird anhand der Tabelle, deren Änderung die Berechnung der Formel triggert, festgelegt. Somit können Formeln mit unterschiedlicher Priorität ausgeführt werden (z.B. bei den variablen Kosten: wird die Neuberechnung der Variablen Kosten durch eine Änderung in der variablen Kosten-Planung ausgelöst, so will in der Maske auf das Ergebnis warten, wird die Berechnung hingegen durch eine Änderung in der Umsatzplanung getriggert, so soll diese Berechnung im Hintergrund passieren. Das lässt sich realisieren, indem man den beiden Tabellen „Umsatzerlöse“ und „Variable Kosten unterschiedliche Prioritäten im Formeldesigner zuweist)
Wird keine Reihenfolge vergeben, oder kann keine Reihenfolge ermittelt werden (z.B. Formel wird durch ein Makro aufgerufen), so wird die Reihenfolge auf 1 gesetzt.
Vermeidung Queue Starvation
Wenn Gefahr droht, dass eine Berechnungsanforderung „ewig“ in der Queue warten muss, wird dies vom System erkannt, und neue Berechnungsanforderungen werden ab dem Zeitpunkt des Erkennens hinter die bereits in der Queue befindlichen Berechnungsanforderungen gelegt – unabhängig von der vergebenen Priorität.
Masken: Warten auf Berechnungen der ersten Ebene
In Eingabemasken kann durch das Setzen des Flags „WaitForCalc“ festegelegt werden, ob auf Berechnungen gewartet wird. Im der bestehenden Implementierung zu Festlegung der Reihenfolge wird dabei auf alle Berechnungen gewartet, die direkt durch das Schreiben in eine Tabelle ausgelöst wurden (dies wird durch Kalkulationstiefe 1 gekennzeichnet). Dabei wird auf alle Formeln der Kalkulationstiefe 1 gewartet, unabhängig davon, ob die Berechnung durch den Benutzer selbst oder durch die Eingabe eines anderen Benutzers ausgelöst wurde.
Mit der Priorität kann dies feiner gesteuert werden, es wird auf die Abarbeitung aller direkt durch die Eingabe ausgelösten Formeln, deren Priorität < 0 ist gewartet (ebenfalls benutzerübergreifend). Um auf eine Formel zu warten, die auf einer anderen Tabelle als der Eingabetabelle rechnet, muss man diese Formel nur von der Eingabetabelle aus triggern und mit einer passenden Priorität (< 0) versehen. Dies kann z.B. wie folgt genutzt werden: in einer Umsatztabelle wird über eine Update-Formel der Umsatzsteuersatz zum aktuellen Datensatz dazugeholt und die USt gerechnet, und über eine weitere Formel der Umsatz für eine GuV-Berechnung weitergeschrieben. In der Maske wird jetzt auf die Update-Formel gewartet, da USt und USt-Satz dem Benutzer angezeigt werden, auf das Weiterschreiben in Richtung GuV wird jedoch nicht gewartet.
Sonderstellung der SAME-Formel
Wird die Berechnung von SAME-Formeln durch eine Dateneingabe ausgelöst, so werden diese Formel direkt beim Speichern des Datensatzes synchron gerechnet (und nicht in die Liste eingefügt). Die Berechnung erfolgt somit nicht über die Liste mit durchzuführenden Berechnungen.