United Planet GmbH

Rechnen mit Intrexx 7

Inhalt

Einleitung

Der Formeleditor von Intrexx 7 ermöglicht erstmals die Erstellung von rechnenden Formularen über den Portalmanager. Neben Ansichtselementen für Berechnungen können auch unterhalb von Tabellen Rechenergebnisse wie z.B. Summen oder kumulierte Werte angezeigt werden. Weiter können auch innerhalb von Zeilen und Spalten Formeln definiert werden.

Operatoren

Die Basis bilden die mathematischen Operatoren, mit denen Standardberechnungen wie Addition und Subtraktion berechnet werden können. Hinzu kommen noch logische Operatoren. Es ist zu beachten, dass die Ergebnisse der logischen Operatoren Double-Werte statt boolschen Werten zurückliefern. 1.00 steht hierbei für true, 0.00 für false.

  • OperatorBeschreibung
    +Addition
    -Subtraktion
    /Division
    *Multiplikation
    <Kleiner als
    <=Kleiner oder gleich
    >Größer als
    >=Größer oder gleich
    ==Ist gleich
    !=Ist ungleich
    &&Logisches Und
    ||Logisches Oder
    !Negation

Werte auslesen

Auf Eingabe- und Ansichtsseiten können in Formeln Werte aus diversen Quellen wie Kontrollen oder Datengruppen ausgelesen werden.

//Auslesen eines Werts aus einer Kontrolle vom Typ Integer oder Double mit Fallbackvalue 0.
//Die GUID entspricht hierbei der GUID der auszulesenden Kontrolle.
control("3A8788BDE1561CAF449890BAF01D6306B4F8E6AC", 0)

Folgende Methoden stehen hierfür zur Verfügung:

FormelBeschreibung
control(CONTROL_GUID, FALLBACK)Auslesen eines Werts aus einer Kontrolle vom Typ Integer oder Double mit Fallbackvalue 0.
controlAsNumber(CONTROL_GUID, FALLBACK)Auslesen eines Zahlenwerts aus einer Kontrolle vom Typ String mit Fallbackvalue 0.
formula(CONTROL_GUID, FALLBACK)Auslesen des Inhalts einer anderen Berechnungskontrolle. Es ist darauf zu achten, keine zirkulären Verweise zwischen Berechnungskontrollen zu definieren!
dataField(DATAFIELD_GUID, FALLBACK)Auslesen eines Wertes anhand der GUID des gewünschten Datenfelds.
dataFieldAsNumber(DATAFIELD_GUID, FALLBACK)Auslesen eines Zahlenwerts vom Typ String anhand der GUID des gewünschten Datenfelds.

Existieren für die aktuelle Datengruppe Kinddatengruppen, kann ebenfalls auf die Kinddatensätze des aktuellen Datensatzes zugegriffen und darauf diverse Aggregatsfunktionen ausgeführt werden.

//Berechnung der Summe eines Datenfelds aus der Kinddatengruppe.
childSum(dataGroup("669F2C0747A5FFBB4FB2C7829945071E1ED5B0CB"), dataField("9AA6E0484980D633B43DB53D9B11AF22962667B4", 0))

Folgende Methoden stehen hierfür zur Verfügung:

FormelBeschreibung
childSum(datagroup(GUID), dataField(GUID), FALLBACK)Summe eines Datenfelds über alle Kinddatensätze des aktuellen Elterndatensatzes aus der Kinddatengruppe.
childMin(datagroup(GUID), dataField(GUID), FALLBACK)Minimum eines Datenfeldwerts aller Kinddatensätze des aktuellen Elterndatensatzes aus der Kinddatengruppe.
childMax(datagroup(GUID), dataField(GUID), FALLBACK)Maximum eines Datenfeldwerts aller Kinddatensätze des aktuellen Elterndatensatzes aus der Kinddatengruppe.
childCount(datagroup(GUID), dataField(GUID), FALLBACK)Berechnung der Anzahl der Kinddatensätze zum aktuellen Elterndatensatz.
childAvg(datagroup(GUID), dataField(GUID), FALLBACK)Berechnung des Durchschnittswerts eines Datenfelds über alle Kinddatensätze zum aktuellen Elterndatensatz.

Tabellenfunktionen

Berechnungen in Ansichtstabellen

Innerhalb von Ansichtstabellen können Berechnungskontrollen als neue Spalte definiert werden. Damit kann die hinterlegte Formel für jede Zeile der Tabelle ausgeführt werden.

//Berechnung des Produkts zweier Spaltenwerte (z.B. Anzahl Artikel * Einzelpreis)
//Anzugeben sind die GUIDs der gewünschten Tabellenspalten.
row("FDBD14318DD7A434AD5131D5C26D630E8F292530", 0) * row("C6CA5368F24171BD6EDBF63C3B83F49FF1813C11", 0)

Folgende Methoden stehen hierfür zur Verfügung:

FormelBeschreibung
row(COLUMN_GUID, FALLBACK)Zugriff auf einen Spaltenwert mit Fallbackvalue.
rowAsNumber(COLUMN_GUID, FALLBACK)Zugriff auf einen Spaltenwert vom Typ String mit Fallbackvalue.
rowFormula(CONTROL_GUID, FALLBACK)Zugriff auf eine Spaltenformel mit Fallbackvalue.
rowDataField(DATAFIELD_GUID, FALLBACK)Zugriff auf einen Spaltenwert anhand der Datenfeld-GUID mit Fallbackvalue.
rowDataFieldAsNumber(DATAFIELD_GUID, FALLBACK)Zugriff auf einen Spaltenwert mit Fallbackvalue.

Existieren für die aktuelle Datengruppe Kinddatengruppen, kann ebenfalls auf die Kinddatensätze des aktuellen Datensatzes zugegriffen und darauf diverse Aggregatsfunktionen ausgeführt werden.

//Berechnung der Summe eines Datenfelds aus der Kinddatengruppe.
//Hierbei sind die GUID der Kinddatengruppe und des Datenfeldes aus der Kinddatengruppe anzugeben.
childSum(dataGroup("669F2C0747A5FFBB4FB2C7829945071E1ED5B0CB"), rowDataField("9AA6E0484980D633B43DB53D9B11AF22962667B4", 0))

Folgende Methoden stehen hierfür zur Verfügung:

FormelBeschreibung
childSum(datagroup(GUID), rowDataField(GUID), FALLBACK)Summe eines Datenfelds über alle Kinddatensätze des aktuellen Elterndatensatzes aus der Kinddatengruppe.
childMin(datagroup(GUID), rowDataField(GUID), FALLBACK)Minimum eines Datenfeldwerts aller Kinddatensätze des aktuellen Elterndatensatzes aus der Kinddatengruppe.
childMax(datagroup(GUID), rowDataField(GUID), FALLBACK)Maximum eines Datenfeldwerts aller Kinddatensätze des aktuellen Elterndatensatzes aus der Kinddatengruppe.
childCount(datagroup(GUID), rowDataField(GUID), FALLBACK)Berechnung der Anzahl der Kinddatensätze zum aktuellen Elterndatensatz.
childAvg(datagroup(GUID), rowDataField(GUID), FALLBACK)Berechnung des Durchschnittswerts eines Datenfelds über alle Kinddatensätze zum aktuellen Elterndatensatz.

Systemwerte

Zusätzlich zu Werten aus Datensätzen kann innerhalb von Formeln auf diverse Systemwerte wie Daten aus Sessions oder Systemdatengruppen zugegriffen werden.

//Auslesen eines Wertes aus einer Systemdatengruppe
//Anzugeben ist der Datenfeldname.
systemField(("L_VERSION"), 0)

Folgende Methoden stehen hierfür zur Verfügung:

FormelBeschreibung
systemField(COLUMN_NAME, FALLBACK)Auslesen eines Wertes aus einer Systemdatengruppe.
systemFieldAsNumber(COLUMN_NAME, FALLBACK)Auslesen eines Wertes vom Typ String aus einer Systemdatengruppe.
requestAsNumber(VARIABLE_NAME, FALLBACK)Auslesen eines Wertes aus dem aktuellen Request.
sharedState(VARIABLE_NAME, FALLBACK)Auslesen eines Wertes aus dem aktuellen Verarbeitungskontext.
sharedStateAsNumber(VARIABLE_NAME, FALLBACK)Auslesen eines Wertes vom Typ String aus dem aktuellen Verarbeitungskontext.
session(VARIABLE_NAME, FALLBACK)Auslesen eines Wertes aus der Benutzersession.
sessionAsNumber(VARIABLE_NAME, FALLBACK)Auslesen eines Wertes vom Typ String aus der Benutzersession.

Funktionen

Fehlerbehandlung

Die in den vorigen Beispielen gezeigten Fallback-Werte greifen für den Fall, dass der angefragte Wert, die gewünschte Kontrolle o.Ä. undefiniert (null) ist. Nicht behandelt werden dagegen Serverfehler, die bei der Berechnung auftreten. Dies kann z.B. dann der Fall sein, wenn ein Wert aus einem String-Datenfeld in einer Formel verwendet werden soll, dieser enthaltene Wert aber nicht zu einer Zahl geparst werden kann. Dies ist bei allen nicht numerischen Zeichen der Fall. In diesen Situationen wird in der Berechnungskontrolle statt eines Wertes lediglich "Es ist ein Fehler aufgetreten" angezeigt. U.U. kann dies erwünscht sein, um direkt fehlerhafte Daten aufspüren zu können. Ist dies jedoch nicht gewünscht, können solche Serverfehler nochmals separat angefangen werden.

//Auslesen eines Stringwerts und Rückgabe von 0 im Fehlerfall
zeroOnError(rowAsNumber("117B9589365400BBF5B72540565F75D42496BE73"))

//Auslesen eines Stringwerts und Rückgabe von 1 im Fehlerfall
oneOnError(rowAsNumber("117B9589365400BBF5B72540565F75D42496BE73"))

//Auslesen eines Stringwerts und Rückgabe eines benutzerdefinierten Werts im Fehlerfall
fallbackOnError(rowAsNumber("117B9589365400BBF5B72540565F75D42496BE73"), -1)

Rundungsfunktionen

Um hinterlegte oder berechnete Zahlenwerte nach bestimmten Kriterien bzw. mathematischen Verfahren zu runden, stehen diverse Rundungsmethoden zur Verfügung. Die einzelnen Verfahren sind hier genauer mit Beispielen beschrieben.

Funktion
roundLong(VALUE)
roundLongHalfAwayFromZero(VALUE)
roundLongHalfEven(VALUE)
roundLongHalfUp(VALUE)
roundLongHalfDown(VALUE)
round(VALUE)
roundHalfAwayFromZero(VALUE)
roundHalfEven(VALUE)
roundHalfUp(VALUE)
roundHalfDown(VALUE)

Fallunterscheidungen

Um auch komplexere Berechnungen oder Formeln nur unter bestimmten Bedingungen ausführen zu können, besteht die Möglichkeit, Fallunterscheidungen zu definieren.

//Grundlegender Aufbau
case(BOOLEAN_EXPRESSION, TRUE_EXPRESSION, FALSE_EXPRESSION)
caseNot(BOOLEAN_EXPRESSION, TRUE_EXPRESSION, FALSE_EXPRESSION)

//Wenn die Summe größer als 1000 ist, wird ein Ergebnis einer Formel verwendet, ansonsten ein statischer Wert 1000.
case(totalSum(table("A2391263105FD17F556A68A10AECC63115AEF217"), row("E605C89A571DDD8112A252A48256A92555A5E794")) > 1000, 
formula("26D6E15533B8AD9AFCE9BB36672F2F9912C5CB73", 0), 
1000)

Zusätzlich zu Vergleichen von Zahlenwerten können in einem boolschen Ausdruck auch Strings überprüft werden. So kann eine Berechnung nur genau dann durchgeführt werden, wenn z.B. die zugehörige Bestellung einen bestimmten Status hat.

//Auslesen eines Bestellstatus
case(equalsIgnoreCase(rowDataField("062FA7D7B2F1651C5037307B0E3E1FB2B107969F", ""), "Bestellt"), true, false)
Funktion
equals(STRING_1, STRING_2)
equalsIgnoreCase(STRING_1, STRING_2)
startsWith(STRING, PREFIX)
startsWithIgnoreCase(STRING, PREFIX)
endsWith(STRING, SUFFIX)
endsWithIgnoreCase(STRING, SUFFIX)
contains(STRING, SEQUENCE)
containsIgnoreCase(STRING, SEQUENCE)
isEmpty(STRING)
isNullOrEmpty(STRING)
isNull(STRING)

Aggregatsfunktionen für Spaltenwerte

Unterhalb von Tabellen wird in vielen Fällen eine Bestimmung von Werten benötigt, die in der Tabelle angezeigt werden. Hierzu zählen Berechnungen wie Summen, Zwischensummen oder Durchschnittswerte. Dafür gibt es drei verschiedene Varianten, um unterschiedliche UseCases abzudecken (hier gezeigt am Beispiel einer Summenbestimmung):

FunktionBeschreibung
sum(table("TABLE_GUID"), row("CONTROL_GUID"))Bestimmung der Summe aller Daten, die aktuell angezeigt werden.
subTotalSum(table("TABLE_GUID"), row("CONTROL_GUID"))Bestimmung der Summe aller Daten von Seite 1 der Tabelle bis zur angezeigten Seite. Unterscheidet sich von sum nur dann, wenn eine Tabellennavigation vorhanden ist und man sich nicht mehr auf der ersten Seite befindet.
totalSum(table("TABLE_GUID"), row("CONTROL_GUID"))Summe über alle Datensätze, die in der Tabelle angezeigt werden, unabhängig von der aktuellen Position des Navigationselements.

Analoge Methoden existieren für:

FunktionBeschreibung
max/subTotalMax/totalMaxMaximalwert
min/subTotalMin/totalMinMinimalwert
count/subTotalCount/totalCountAnzahl
avg/subTotalAvg/totalAvgDurchschnittswert

Beachten Sie, dass es sich bei den total-Methoden um "teure", d.h. rechenintensive Operationen handelt. Bei sehr großen Datenbeständen können entsprechende Verzögerungen auftreten.

Datumsfunktionen

Zur Bestimmung von Fristen, Fälligkeiten und ähnlichen Anwendungsfällen ist es möglich, mit Datums- und Zeitwerten zu arbeiten. Hierzu zählen sowohl Systemdaten wie Erstellungsdatum, als auch Werte aus Datums-und Zeitdatenfeldern oder der aktuellen Zeit.

Funktionen für einzelne Datumswerte

Soll ein Wert aus einem einzelnen Datumswert ermittelt werden, können folgende Methoden wie im Beispiel gezeigt eingesetzt werden(Bei allen Methoden kann als zweiter Parameter die zu verwendende Zeitzone angegeben werden):

//Stundenanteil des aktuellen Datums in der Zeitzone Europe/Berlin
hour(currentDateTime, "Europe/Berlin")

//Tag des Monats aus einem Datumswert eines Datenfelds ohne Angabe der Zeitzone. 
//Somit wird die Zeitzone des aktuell angemeldeten Benutzers berücksichtigt
dayOfMonth(dataField("2DA5429B4BE959EBE28B18E0BAB8C4705C789D1A", -1))
FunktionBeschreibung
currentDateTimeDas aktuelle Datum
currentRequestDateTimeDas Datum aus dem letzten Request
dateTime("DATE_STRING", DATE_FORMAT")Datumswert aus einem String
dayOfYear("DATE_EXPRESSION")Tag des Jahres
dayOfMonth("DATE_EXPRESSION")Tag des Monats
dayOfWeek("DATE_EXPRESSION")Tag der Woche mit Montag als Wochenbeginn
weekOfYear("DATE_EXPRESSION")Woche im Jahr mit Montag als Wochenbeginn
weekOfYearSunday("DATE_EXPRESSION")Woche im Jahr mit Sonntag als Wochenbeginn
year("DATE_EXPRESSION")Jahr des Datums
month("DATE_EXPRESSION")Monat des Datums (Januar = 1, Feburar = 2, ...)
hour("DATE_EXPRESSION")Stunde des Datums
minute("DATE_EXPRESSION")Minuten des Datums
second("DATE_EXPRESSION")Sekunden des Datums
millisecond("DATE_EXPRESSION")Millisekunden des Datums

Differenzen zwischen zwei Datumswerten

Um diverse Differenzen zwischen zwei Datumswerten zu ermitteln, können folgende Methoden verwendet werden:

//Differenz in Tagen zwischen einem Datumswert und dem aktuellen Datum
diffInDay(dataField("C2FA3A0DD01E7E6612972A7A97D8DDCA1709CF3E", -1), currentDateTime)
FunktionBeschreibung
diffInDay("DATE_1", "DATE_2")Differenz zwischen zwei Datumswerten in Tagen
diffInHour("DATE_1", "DATE_2")Differenz zwischen zwei Datumswerten in Stunden
diffInMinute("DATE_1", "DATE_2")Differenz zwischen zwei Datumswerten in Minuten
diffInSecond("DATE_1", "DATE_2")Differenz zwischen zwei Datumswerten in Sekunden
diffInMillisecond("DATE_1", "DATE_2")Differenz zwischen zwei Datumswerten in Millisekunden

Datumsaudrücke aus Datensätzen oder Systemwerten

Analog zum Auslesen von Zahlenwerten können auch Datumswerte aus Datenfeldern, Zeilen in Tabellen etc. ausgelesen werden

FunktionBeschreibung
controlAsDateTime("CONTROL_GUID", "FALLBACK")Datumswert aus einer Kontrolle
dataFieldAsDateTime("DATAFIELD_GUID", "FALLBACK")Datumswert aus einem Datenfeld
rowAsDateTime("CONTROL_GUID", "FALLBACK")Datumswert aus der aktuellen Zeile (in einer Ansichtstabelle)
rowDataFieldAsDateTime("DATAFIELD_GUID", "FALLBACK")Datumswert aus der aktuellen Zeile per Datenfeld-GUID (in einer Ansichtstabelle)
sessionAsDateTime("VARIABLE", "FALLBACK")Datumswert aus einer Sessionvariablen
sharedStateAsDateTime("VARIABLE", "FALLBACK")Datumswert aus einer Variablen aus dem aktuellen Verarbeitungskontext
requestAsDateTime("VARIABLE", "FALLBACK")Datumswert aus einer Requestvariablen
systemFieldAsDateTime("COLUMN_NAME", "FALLBACK")Datumswert aus dem Wert eines Systemdatenfelds