Beschleunigung der Formelauswertung

Aus Asprova Hilfe
Wechseln zu: Navigation, Suche
Hilfe Nummer: 8991100
Zusätzliche Informationen
Formeleditor

Kurzschlussauswertung

Seit Version 15.0 unterstützt Asprova Kurzschlussauswertung zur schnelleren Auswertung von Formeln. (Bereits Version 14.1 unterstützt die Kurzschlussauswertung für Formeln ohne IF() und interne Funktionen.)

Beschreibung

Werden die logischen Operatoren && oder || genutzt, so kann das Ergebnis manchmal bereits bestimmt werden, wenn nur ein Teil der Formel ausgewertet wurde. Im folgenden Beispiel ist etwa für 3, 4, 5 & 6 bereits nach Auswertung des ersten Arguments das Ergebnis klar. Die Auswertung des zweiten Elements kann also übersprungen werden, so dass die Auswertung schneller erfolgt.

Formel Ergebnis
1 TRUE && TRUE TRUE
2 TRUE && FALSE FALSE
3 FALSE && TRUE FALSE
4 FALSE && FALSE FALSE
5 TRUE || TRUE TRUE
6 TRUE || FALSE TRUE
7 FALSE || TRUE TRUE
8 FALSE || FALSE FALSE

Kurzschlussauswertung wird nicht nur von Asprova genutzt, sondern wird beim Programmieren häufig eingesetzt, so dass sich im Internet, Büchern und so weiter mehr Informationen finden lassen. Die Details der Kurzschlussauswertung hängen von der Programmiersprache ab, bei && oder || entsprechen sie der Logik von C++.

Beispiele

Soll etwa die Auftragstabelle auf Aufträge gefiltert werden, deren [Menge] mindestens 100 und deren [Auftragstyp] "Bestand (Fluktuation)" ist, so kann mit beiden folgenden Formeln das selbe Ergebnis erzielt werden:

  • ME.Type=='J'&&ME.Qty>=100
  • ME.Qty>=100&&ME.Type=='J'

Angenommen in der Auftragstabelle gibt es nur ein paar Aufträge mit dem [Auftragstyp] "Bestand (Fluktuation)", aber viele Aufträge mit einer [Menge] von mindestens 100. In diesem Fall kann das in der ersten Formel das zweite Argument (ME.Qty>=100) für die meisten Aufträge übersprungen werden. In der zweiten Formel muss das zweite Argument (ME.Type=='J') fast immer ausgewertet werden.

Da beide Formeln einfach sind, unterscheidet sich die Auswertungszeit nicht so stark. Mit den beiden folgenden Formeln wird auf Bestandsaufträge gefiltert, die mit verspäteten Verkaufsaufträgen verknüpft sind.

  • ME.Type=='J'&&SumIF(ME.RightmostOrder,TARGET.Type=='S'&&ME.Lateness>0s,1)
  • SumIF(ME.RightmostOrder,TARGET.Type=='S'&&ME.Lateness>0s,1)>0&&ME.Type=='J'

Die Eigenschaft [Aufträge ganz rechts] enthält alle Aufträge, mit denen der aktuelle Auftrag in Richtung des Endprodukts abschließend verknüpft ist. Müssen hierfür viele Aufträge durchgegangenen werden, bis man bei den Aufträgen ganz rechts ankommt, so dauert die Auswertung der Formel länger. In der ersten Formel kann die Auswertung des zweiten Arguments übersprungen werden, wenn ME kein Bestandsauftrag ist. In der zweiten Formel muss die interne Funktion SumIF() für alle Aufträge ausgewertet werden und kann nicht übersprungen werden. Damit hat die erste Formel das Potenzial, die Auswertung stark zu beschleunigen.

Werden also && oder || genutzt um derart Formeln miteinander zu verbinden, so sollten zur schnellstmöglichen Auswertung Formeln, die einfach ausgewertet werden können am Anfang stehen, und komplexe Formeln, deren Auswertung länger dauert, am Ende.

SumIF und ExistIF

In Versionen vor 15.0 mussten zur Bestimmung, ob es Aufträge mit einer [Menge] von mindestens 100 gibt, Formeln wie SumIF(ME.RightmostOrders,TARGET.Qty>=100,1) genutzt werden. In Version 15.0 wurde die interne Funktion ExistIF() hinzugefügt, die die Auswertung beendet, sobald ein passendes Objekt gefunden wird, und so die Auswertung beschleunigt. Die entsprechende Formel lautet ExistIF(ME.RightmostOrders,TARGET.Qty>=100,1).


Hilfe Nummer: 8991100