Klasse CX_FORMULA - Beispiele
- einfache Berechnungen
- Berechnungen mit bedingten Ausdrücken
- die Formel definiert eine Bedingung (Prädikat)
- lokale Variable und Wertzuweisung
- Formeln mit Fehlern
einfache Berechnungen
Formel | die gleiche Berechnung anders formuliert | Bemerkung |
---|---|---|
a + b | (a + b) | a und b sind dynamische Datenfelder |
0.43cm * (a + b) | ||
35.77m | eine Formel darf auch nur aus einer einzigen Konstanten bestehen | |
2.0 * sin(phi) | phi sei ein dynamisches Datenfeld | |
(a + b) * (a + b) | pow(a + b, 2) | die erste Version ist besser! |
- a * b | b * - a | Minus als Vorzeichen, nicht als Subtraktions-Operator |
owner.value + value | mit Zugriffsausdruck | |
Previous(::Day(24,12) ,6) - 28 | Funktion Day wird an ein Objekt CX_DATE gebunden, für das damit vorgegebene Jahr berechnet die Formel das Datum des Totensonntags. Dies ist ein Beispiel für einen externen (Day) und einen internen Funktionsaufruf (Previous), |
|
Previous(Day(Date("heute"), 24,12), 6) - 28 | Anders als im vorhergehenden Beispiel wird Funktion Day für das aus der Zeichenkette "heute" konstruierte Datum aufgerufen - also ein interner Funktionsaufruf - und wir erhalten das Datum des Totensonntages in diesem Jahr. |
Berechnungen mit bedingten Ausdrücken
Formel | die gleiche Berechnung anders formuliert | Bemerkung |
---|---|---|
if (a < b) a else b | min(a, b) | |
x + if (a = b) 1.0 else 2.0 | if (a = b) a + 1 else x + 2 | |
x * if (a > 0.0 & a < 10.0) 2.0 else 1.0 | if (a > 0.0 & a < 10.0) 2.0*x else x | |
|
mit Test auf dies Existenz des Datenfeldes a | |
|
if (b > if (has(a) a else 0) 24.5$ else 12.5$ |
die Formel definiert ein Bedingung (Prädikat)
Formel | die gleiche Berechnung anders formuliert | Bemerkung |
---|---|---|
a > b | b <= a | Ergebnis ist ein Objekt der Klasse CX_BOOLEAN |
a = 4.0 & b > 10.0 | ! (a != 4.0 | b <= 10.0) | |
true | ||
false | ||
|
Lokale Variable und Wertzuweisung
Formel | die gleiche Berechnung anders formuliert | Bemerkung |
---|---|---|
local tmp1, tmp2; tmp1 := (a + b) * (a - b); tmp2 := (a + b) * (a + b); 1 / tmp1 + 1 / tmp2 |
|
Komplexe Formeln werden übersichtlicher ... |
local tmp; tmp := a*a - b; tmp*tmp*tmp + tmp*tmp + tmp |
(a*a - b)*(a*a - b)*(a*a - b) - (a*a - b)*(a*a - b) - a*a - b | und Terme, die sich oft wiederholen werden nur einmal berechnet |
pow(a*a - b, 3) + pow(a*a - b, 2) + a * a - b |
InstantView®-Variable und Wertzuweisung
Formel | die gleiche Berechnung anders formuliert | Bemerkung |
---|---|---|
local tmp1, tmp2; tmp1 := var(breite)*2; 1 / tmp1 |
1 / (var(breite) * 2) | Der Wert "breite" ist eine InstantView®-Variable |
var(breite) := 2 + 3 | Man kann auch in der Formel einer InstantView®-Variable einen neuen Wert zuweisen. Dieser Wert wird aber erst nach dem Beenden der Formel der InstantView®-Variable zugewiesen. |
Formeln mit Fehler
fehlerhafte Formel | warum falsch | richtig wäre |
---|---|---|
a + 23,5m | Numerische Konstanten immer mit Dezimal-Punkt | a + 23.5m |
(a + b)(a - b) | die in der Mathematik übliche Schreibweise wird nicht unterstützt, der Operator für die Multiplikation muss explizit angegeben werden | (a + b) * (a - b) |
t * 25.5m/s | Maßeineinheit m/s muss in stehen |
|
t ** 2 | den Operator für Potenzierung gibt es nicht! | t * t |
a ** 3.27 | pow(t, 3.27) | |
+ a * b | nur Minus wird auch als Vorzeichen akzeptiert; das Plus-Zeichen kann nur als Additions-Operator verwendet werden | a * b |
if (a < b) 25.4 | kein Ergebnis für den Fall a >= b | if (a < b) 25.4 else 0.0 |
if a < b 25.4 else 0.0 | die Klammern nach if fehlen | if (a < b) 25.4 else 0.0 |
(a + b).c | Zugriffsausdruck startet mit Zwischenergebnis | (das kann nicht ausgedrückt werden !) |
(a + b).Foo() | Foo(a + b) | |
if (a == b) x else y | Operator für Gleichheit ist = und nicht == wie in C / C++ | if (a = b) x else y |
local tmp; tmp = (a + b) / (a - b); sinh(tmp) |
Operator für Wert-Zuweisung (Assignment) ist := und nicht = wie in C / C++ | local tmp; tmp := (a + b) / (a - b); sinh(tmp) |
local tmp1, tmp2; tmp1 := tmp2 * (a - b); tmp2 := a * (a - 1) * (a - 2); tmp1 + tmp2 |
die lokale Variable tmp2 wird schon benutzt, bevor ihr ein Wert zugewiesen wurde | local tmp1, tmp2; tmp1 := a * (a - 1) * (a - 2); tmp2 := tmp1 * (a - b); tmp1 + tmp2 |
var(breite):=200l; this.call(Macro) | Eine InstantView®-Variable, der ein neuer Wert zugewiesen wird, ändert ihren Wert erst beim Beenden der Formel. Es ist also nicht möglich einer InstantView®-Variable einen Wert zu zuweisen und diesen mit in einem Makroaufruf in der Formel zu verarbeiten. | |
a + b; a - b | Korrekt, aber unsinnig, denn a + b wird umsonst berechnet. Die Abtrennung eines Teilausdrucks mit Semikolon ist für Wertzuweisungen vorgesehen! | a - b |
ma = if (a < b) Stahl else "Sympal verzinkt" |
Obwohl ma (dynamisches Datenfeld "Materialart") auf eine Transformationstabelle verweist, ist die Verbindung mit den Konstanten zu indirekt | ma = if (a < b) ma::Stahl else ma::"Sympal verzinkt" |
if (a < b) ma = Stahl else ma = "Sympal verzinkt" |