Lade...
 

CX_FORMULA - Beispiele

Klasse CX_FORMULA - Beispiele

 

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  
if (has(a)) a + b else b
  mit Test auf dies Existenz des Datenfeldes a
if (if (has(a)) b > a else b > 0) 24.5$ else 12.5$
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  
if (has(a)) a < 12.0m else 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
 
1 / ((a + b) * (a - b)) + 1 /  ((a + b) * (a + b))
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 Opening Bracket Closing Bracket stehen
t * 25.5[m/s]
 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"