Die Formelsprache

In REWOO Scope gibt es zwei verschiedene Formen von Formeln:

Zuweisungen:

= <Ausdruck>

Bedingungen:

? <Bedingung>
mit Aktion
? <Bedingung> : <Aktion>
bzw. mit mehreren Aktionen
? <Bedingung> : <Aktion> ; <Aktion> ; <Aktion>

Einstieg in die Formelsprache

Das folgende Kapitel vermittelt anhand von einfachen Praxisbeispielen einen grundlegenden Einblick in die Möglichkeiten der Formelsprache.

Datenfelder, die für einen Aspekttyp im Formulardesigner so angelegt werden und danach referenziert werden können, haben nachstehend den jeweiligen Datenfeldtyp in Klammern.

Feldname (Typ: String)

Die Arbeitsschritte stehen in ihrer Abfolge unter Anwendung.

Zu beachten ist, dass Formeln für Datenfelder entweder mit einem = für Zuweisungen oder mit einem ? bei Bedingungen eingeleitet werden können. Referenzen zu anderen Datenfeldern werden mit einem vorangestellten @ eingeleitet.

= DAY ( @Feier am - TODAY )

Datum

Datum in einem String-Feld ausgeben
Problem: Das Datum eines Date-Feldes soll für die Weiterverarbeitung in ein String-Feld überführt werden.
Voraussetzung: Date-Feld, String-Feld
Lösung:
  1. Datum (Typ: Date)
  2. String mit Datum als Text (Typ: String)
    = @Datum[DD.MM.YYYY]
Erklärungen: Die Formel gibt das Datum in dem in eckigen Klammern angegebenen Format als String zurück. Es stehen folgende Platzhalter zur Verfügung: D (Tag), M (Monat), Y (Jahr), E (Wochentag). Sonderzeichen wie Punkt, Leerzeichen oder Schrägstrich können nach belieben eingefügt werden. Für höhere Detailstufen wird der jeweilige Platzhalter mehrfach nacheinander gestellt, Bsp. M = 1, MM = 01, MMM = Jan, MMMM = Januar.
Datumsfunktionen
Story: In wie vielen Tagen findet die Feier statt?
Anwendung:
  1. heute ist der 26.09.2015
  2. Feier am (Typ: Date)
    15.10.2015
  3. Anzahl der Tage bis zur Feier (Typ: Number)
    = DAY ( @Feier am - TODAY )
  4. Ergebnis: 20
Anmerkung:
  • Anstelle von DAY könnte auch MONTH oder YEAR stehen.
  • Wichtig auch: TODAY bezieht sich immer auf das tagesaktuelle Datum und wird somit jeden Tag ausgewertet.
  • Will man eine gewisse Anzahl an Tagen zu einem Datum hinzuzählen, wird eine Zahl mit der Einheit versehen und addiert: +5 day

Zahlen

Zahlen runden
Story: Wie hoch sind meine Ausgaben für meine Feier pro Kopf, gerundet auf ganze Euro-Beträge?
Anwendung:
  1. Anzahl Gäste (Typ: Number)
    15
  2. Ausgaben (Typ: Number)
    184,32 €
  3. Ausgaben pro Kopf (gerundet) (Typ: Number)
    = ROUND ( ( @Ausgaben / @Anzahl Gäste ) | 0 )
  4. Ergebnis: 12 €
Anmerkung:
  • Die Anzahl der Nachkommastellen, auf die gerundet wird, kann nur ganze positive Zahlen betragen, inklusive der 0. Angegeben wird das nach dem |-Symbol.
Zahlen in einem String-Feld ausgeben
Problem: Eine ID soll für die Weiterverarbeitung in einem String-Feld verwendet werden. Die ID hat immer 5 Stellen, z.B. 00032 oder 01234.
Voraussetzung: Number-Feld, String-Feld
Lösung:
  1. ID (Typ: Number)
  2. String mit Datum als Text (Typ: String)
    = {Rechnung }@ID[5]
Erklärungen: Die Formel gibt die Zahl in dem in eckigen Klammern angegebenen Format als String zurück. Dabei können Vorkommastellen und Nachkommastellen angegeben werden. Nicht belegte Stellen werden mit Nullen aufgefüllt. [5.2] formatiert die Zahl mit 5 Vorkommastellen und 2 Nachkommastellen, [4] mit 4 Vorkommastellen und beliebigen Nachkommastellen, [.3] mit 3 Nachkommastellen und beliebigen Vorkommastellen.
Minimum und Maximum
Story: Wie hoch ist die größte Einzelspende?
Anwendung:
  1. Für jeden Gast existiert auf einer Aspektunterebene jeweils ein Formular mit einem Feld "feste Zusage" (Typ: Boolean). Von 15 Gästen haben 12 mit einem Häkchen zugesagt und in ihrem Feld "Spende" einen Betrag eingetragen.
  2. größte Spende (Typ: Number)
    = MAX ( CHILDREN@Spende )
Anmerkung:
  • MAX gibt den höchsten Wert und MIN den niedrigsten Wert zurück.
  • Referenziert werden können Felder vom Typ Date und Number.
Teilen und Zahlenrest
Story: Eine Häppchen-Platte hat 26 Stücke. Um sie gerecht zu verteilen, soll berechnet werden, wie viele Stücke jeder Gast bekommt und wie viele noch übrig bleiben.
Anwendung:
  1. Anzahl Gäste (Typ: Number)
    8
  2. Anzahl Häppchen (Typ: Number)
    26
  3. Häppchen pro Kopf (Typ: Number)
    = @Anzahl Häppchen DIV @Anzahl Gäste
    Ergebnis: 3
  4. Anzahl übrigbleibender Häppchen (Typ: Number)
    = @Anzahl Häppchen MOD @Anzahl Gäste
    Ergebnis: 2
Anmerkung:
  • Beide Operationen beziehen sich auf ganze Zahlen und geben ihrerseits auch nur ganze Zahlen zurück.

Nachrichten

Story: Das System soll mir eine Nachricht schicken, wenn mein Kassenstand unter 50 € fällt.
Anwendung:
  1. Kassenstand (Typ: Number)
    40
  2. Prüfung Kassenstand (Typ: Condition)
    ? ( @Kassenstand >= 50 ) : MESSAGE ( compliance )
Anmerkung:
  • Es können auch Felder vom Typ Boolean referenziert werden. Wichtig ist nur, dass in der runden Klammer ( Kassenstand >= 50 ) ein boolescher Ausdruck steht.
  • Als vordefinierte Nachrichten-Typen existieren STAFF, COMPLIANCE, FINANCE, TIME, SIGNATURE.

Nachrichten mit vordefiniertem Text

Story: Eine Nachricht ("Achtung logischer Konflikt") wird abgesetzt, wenn meine Party gleichzeitig als "abgesagt" und "findet statt" markiert wurde.
Anwendung:
  1. abgesagt (Typ: Boolean)
    = {true}
  2. findet statt (Typ: Boolean)
    = {true}
  3. logischer Konflikt (Typ: Condition)
    ? AND ( @abgesagt ; @findet statt ) : MESSAGE ( compliance ; {Achtung logischer Konflikt} | * ; true )
Anmerkung:
  • Eine Nachricht wird abgesetzt, wenn beide Häkchen gesetzt sind.
  • Alle Nutzer mit Zugriff auf das Datenblatt erhalten die Nachricht.
  • Der Text in der geschweiften Klammer ist frei wählbar.
  • Der optionale Zusatz nach dem |-Symbol beschreibt, in welchen Fällen die Nachricht abgesetzt wird. In diesem Fall, wenn die Bedingung von einem beliebigen Zustand * (true oder false) in true geändert wird.
  • Hier kann man beliebige Kombinationen von false, true und * wählen. Wird nichts angegeben, wird als Standard true nach false gesetzt.

Auslösen einer Nachricht

Story: Das System soll allen Benutzern, die den Kassenwert sehen dürfen, eine Alarm-Meldung (eine spezielle Art von Nachricht) schicken, wenn der Kassenstand unter 50 € fällt. Sobald der Kassenstand wieder in Ordnung ist, soll die Nachricht automatisch aus der Inbox der Benutzer entfernt werden.
Anwendung:
  1. Kassenstand (Typ: Number)
    40
  2. Prüfung Kassenstand (Typ: Condition)
    ? ( @Kassenstand >= 50 ) : ALERT ( compliance )
Anmerkung:
  • Wird ein Alert versendet, geht ein und dieselbe Nachricht an alle Benutzer, die das Feld sehen dürfen. Da alle Benutzer dieselbe Nachricht sehen, kann ein einzelner Benutzer sie nicht einfach bestätigen. Sie verschwindet erst, wenn die Bedingung wieder erfüllt ist (dann aber automatisch).
  • Die Anmerkungen für "MESSAGE" und "MESSAGE mit vordefiniertem Text" gelten auch für ALERT, da die Syntax bei beiden (bis auf das Schlüsselwort ALERT) identisch ist.

Datenblattversionen

Story: Wie sehr hat sich der Kassenstand verändert?
Anwendung:
  1. Kassenstand (Typ: Number)
    60
  2. Kassenstand ändern zu
    70
  3. Differenz zum letzten Kassenstand (Typ: Number)
    = @Kassenstand - VERSION ( @Kassenstand | -1 )
  4. Ergebnis: 10
Anmerkung:
  • Wurde der Kassenstand von 60 auf 70 geändert, wird im Feld Differenz zum letzten Kassenstand der Wert 10 ausgegeben, da 10 € hinzugekommen sind.
  • Nach dem |-Symbol wird angegeben, welche Version des Datenfeldes referenziert wird. Negative Werte geben an, welche relative Vorversion betrachtet wird, ein positiver Wert gibt die absolute Version des Datenfeldes an. Bei 0 wird der aktuelle Wert zurückgegeben.

Auswerten von Listen

Story: Ist Anna mit auf der Gästeliste?
Anwendung:
  1. Gästeliste (Typ: String)
    Jennifer, Petra, Herta, Anna, Stefan, Paul
  2. V.I.P. eingeladen? (Typ: Condition)
    ? CONTAINS ( @Gästeliste | {Anna} )
Anmerkung:
  • Die Funktion kann sich nur auf Felder vom Typ String beziehen. Dabei wird exakt nach dem beschriebenen Wort gesucht.
  • Groß- und Kleinschreibung wird beachtet.
  • Die Antwort auf die Frage ist immer, ob der Begriff gefunden wurde oder nicht. Die Funktion gibt also einen booleschen Wert zurück.

Bedingtes Zählen und Auflisten

Story: Für eine Feier wurde für jeden Gast ein Formular im Unteraspekt angelegt, auf dem jeder seine Zusage vermerken kann. Wer hat zugesagt und wie viele Leute kommen insgesamt?
Anwendung:
  1. Zusage (Typ: Boolean) auf den Formularen der Gäste
  2. Es wurden 13 Gäste angelegt, von denen 12 den Haken im Feld Zusage gesetzt haben.
  3. Liste der Teilnehmer (Typ: ElementLinks)
    = LINKLISTIF ( CHILDREN | @Zusage )
  4. Anzahl der Teilnehmer (Typ: Number)
    = COUNTTRUE ( CHILDREN@Zusage )
  5. Ergebnis: 12
Anmerkung:
  • Das ElementLinks-Feld zeigt eine Liste aller Gäste an, die zugesagt haben.
  • Die COUNTTRUE-Formel kann nur boolesche Aussagen verarbeiten.
  • Neben einer Referenz sind auch durch Semikolon getrennte, ausformulierte Aussagen möglich, die auf ihren Wahrheitsgehalt geprüft und dann gezählt werden:
    = COUNTTRUE ( 1 < 2 ; 1 < 3 ; 1 < 4 ; 1 > 4 )
    Ergebnis: 3
    = COUNTTRUE ( YEAR ( TODAY ) > 1900 ; YEAR ( TODAY ) < 2000 )
    Ergebnis: 1

Logische Verkettungen

Story: Eine Nachricht soll mich 2 Tage vor meiner Feier erinnern, wenn sie wegen zu wenig Zusagen (weniger als 4) abgesagt wird. Auch möchte ich eine Nachricht erhalten, wenn die Anzahl der Teilnehmer nur knapp darüber liegt.
Anwendung:
  1. Anzahl eingeladene Gäste (Typ: Number)
    10
  2. Anzahl Absagen (Typ: Number)
    2
  3. Feier am (Typ: Date)
    01.01.2015
  4. alles in Ordnung (Typ: Condition)
    ? [ @Anzahl eingeladene Gäste - @Anzahl Absagen <= 6 ; AND ( @Anzahl eingeladene Gäste - @Anzahl Absagen < 4 ; DAY ( @Feier am - TODAY ) <= 2 ) ] : MESSAGE ( staff )
Anmerkung:
  • Eine Ampelfunktion wird durch [ und ] definiert, worin zwei durch Semikolon getrennte Bedingungen stehen.
  • Ist die erste Bedingung wahr, ist die Ampel gelb. Die Zweite schaltet den Status auf rot. Sind beide Bedingungen falsch, ist die Ampel grün.
  • Rot hat Vorrang vor Gelb. Ist die zweite Bedingung wahr, ist die Ampel rot, unabhängig vom Status der ersten Bedingung.

Auswertung von Excel-Tabellen

Story: Das Kassenbuch liegt in einer Excel-Datei vor. Der darin ermittelte Kassenstand von 138,42 € soll als Budget für die Feier verwendet werden.
Anwendung:
  1. Eine Excel-Datei kassenbuch.xls mit der Arbeitsmappe Jahr 2015. Der Kassenstand steht in der Zelle A12.
  2. Kassenbuch in Excel (Typ: SpreadsheetFile)
    kassenbuch.xls
  3. Kassenstand (Typ: Number)
    = EXCEL ( @Kassenbuch in Excel ; Jahr 2015 ! A12 )
  4. Ergebnis: 138,42 €
Anmerkung:
  • Es können auch Dateien mit der Endung *.xlsx verwendet werden.

Bedingtes Aufsummieren

Story: Für einen guten Zweck werden die Gäste bei einer Feier einen frei wählbaren Betrag spenden. Welcher Gesamtbetrag ist zu erwarten von den Gästen, die fest zugesagt haben? Wie viel wird im Durchschnitt gespendet?
Anwendung:
  1. Für jeden Gast existiert auf einer Aspektunterebene jeweils ein Formular mit einem Feld "feste Zusage" (Typ: Boolean). Von 15 Gästen haben 12 mit einem Häkchen zugesagt und in ihrem Feld "Spende" einen Betrag eingetragen.
  2. Spende (Typ: Number)
    = SUMIF ( CHILDREN | @feste Zusage )
    Ergebnis: 452 €
  3. Spende pro Kopf (Typ: Number)
    = @Spende / COUNTIF ( CHILDREN | @feste Zusage)
    Ergebnis: 37,67 €
Anmerkung:
  • Die CHILDREN-Referenz liest automatisch dasselbe Feld auf untergeordneten Formularen aus. Eine explizite Referenzierung auf das Spenden-Feld ist damit nicht notwendig.
  • Summiert werden nur die Spendenbeträgen der Gäste, für die das Boolean-Feld "feste Zusage" ein Häkchen hat.
  • Der Unterschied zwischen COUNT und SUM liegt darin, dass COUNT die Anzahl der Elemente zählt (also auf wie vielen Formulare die Bedingung zutrifft), SUM jedoch die beinhalteten Werte zusammenrechnet.

Projektzustand

Story: Zeige alle Unterformulare, deren Status ACTIVE ist.
Anwendung:
  1. Alle aktiven Unterformulare (Typ: ElementLinks)
    = LINKLISTIF( CHILDREN | STATE=ACTIVE )
Anmerkung:

Projektzustand verändern

Story: Ändere den aktuellen Status eines Elements beim Erstellen auf ACTIVE.
Anwendung:
  1. Verstecktes Feld mit Aktion und Bedingung, die immer false ergibt (Typ: Boolean)
    ? 1<0 : SETSTATE(ACTIVE)
Anmerkung:
  • Gültige Status sind ACTIVE, ONHOLD, CLOSED, ARCHIVED, REJECTED.
  • Da SETSTATE eine Aktion vergleichbar zu MESSAGE oder ALERT ist, kann auch hier genau definiert werden, in welchen Fällen es zum Auslösen der Aktion kommt, indem man die Formel um die Parameter true, false und * erweitert, Beispiel:
    ? 1>2 : SETSTATE ( ACTIVE | f ; t )

Referenz eines Choice-Feldes

Story: Wie viele Gäste haben in ihrer Einladung Zusage ausgewählt, wie viele Absage?
Anwendung:
  1. Für jeden Gast existiert ein Unterformular, auf dem ein Feld "Status" (Typ: Choice) angelegt ist. Dort sind die Wahlmöglichkeiten "Zusage" und "Absage" hinterlegt.
  2. Anzahl Zusagen (Typ: Number)
    = COUNTIF ( CHILDREN | @Status = {Zusage} )
  3. Anzahl Absagen (Typ: Number)
    = COUNTIF ( CHILDREN | @Status = {Absage} )
Anmerkung:
  • Die COUNTIF-Funktion zählt die Anzahl der Formulare, für die die Bedingung zutrifft. Damit lässt sich auslesen, wie oft ein bestimmter Wert in Choice-Feldern auf untergeordneten Formularen gesetzt ist.
  • Als Standardwert kann eine Einstellung für das Choice-Feld hinterlegt werden, so dass beim Anlegen des Formulars die Auswahl standardmäßig auf Absage steht.
  • Statt über den genauen Choice-Wert lässt sich ein gesetzter Wert auch über dessen Position in der Auswahlliste abfragen. Das ist möglich mit @Choice[index], wobei die Zählung mit 0 für die erste Option beginnt (z.B. @Choice[1] liefert true, wenn die zweite mögliche Auswahl des Choice-Feldes ausgewählt ist). Der Vorteil dieser Methode ist die Unabhängigkeit von den Begriffen der Auswahl, der Nachteil ist die Abhängigkeit von der Reihenfolge und der Anzahl der Wahlmöglichkeiten.

Ampel

Story: Wenn der Kassenstand kritisch wird (weniger als 40 €), soll eine Ampel gelb zeigen. Bei weniger als 20 € soll sie auf rot stehen.
Anwendung:
  1. Kassenstand (Typ: Number) mit jeweiligem Kassenstand
  2. Kassenstand prüfen (Typ: TrafficLight)
    ? [ @Kassenstand < 40; @Kassenstand < 20 ]
Anmerkung:
  • Die rote Ampelbedingung dominiert die gelbe. Ein grüner Zustand ergibt sich, wenn weder die erste noch die zweite Bedingung wahr ist.

Ausschaltbare Ampel

Story: Eine Zeitkontrolle für ein Projekt: Eine Ampel soll anzeigen, wenn ein Projekt heute endet, es allerdings noch nicht beendet ist. Darüber hinaus soll auch schon 7 Tage im Voraus ersichtlich sein, dass das Projekt demnächst endet, um vorzeitig eventuell nötige Maßnahmen ergreifen zu können. Ist das Projekt bereits beendet, soll diese Überprüfung nicht mehr durchgeführt werden.
Anwendung:
  1. geplantes Projektende (Typ: Date)
    05.11.2015
  2. Projekt erledigt (Typ: Boolean)
    = {false}
  3. Zeitkontrolle (Typ: TrafficLight)
    ? [ AND ( DAY ( @geplantes Projektende - TODAY ) < 7 ; NOT(@Projekt erledigt) ) ; AND ( DAY ( @geplantes Projektende - TODAY) <= 0 ; NOT(@Projekt erledigt) ) ]
Anmerkung:
  • Die Einzelbedingungen werden über AND mit einer Überprüfung des "Projekt erledigt"-Feldes ergänzt. Ist in diesem Feld ein Häkchen gesetzt, ergeben sowohl der erste als auch der zweite Teil der Ampel-Bedingung immer false. Damit steht die Ampel stets auf grün.

Rechenfunktionen

COUNT

Funktionsweise: Zählt die Elemente der referenzierten Listen.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNT ( <listFormula> )
Beispiele:
  • = COUNT ( @MeineListe )
  • = COUNT ( @Signaturfeld )

COUNTIF

Funktionsweise: Zählt die Elemente der referenzierten Listen, für die die Bedingung wahr ist. Alle Referenzen in der Bedingung beziehen sich auf die Formulare der zu zählenden Elemente; Felder des Formulars, das die Formel enthält, können in der Bedingung referenziert werden, indem ein THIS vorangestellt wird
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNTIF ( <list> | <condition> )
Beispiele:
  • = COUNTIF ( @MeineListe | @Auftrag freigegeben )
  • = COUNTIF ( @MeineListe | @Angelegt am < TODAY )

COUNTTRUE

Funktionsweise: Zählt die Anzahl der wahren Bedingungen.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNTTRUE ( @booleanEntry1 ; @booleanEntry2 ; ... )
Beispiele:
  • = COUNTTRUE ( CHILDREN@Boolean )

DIV

Funktionsweise: DIV berechnet das ganzzahlige Ergebnis einer Division von zwei Zahlen.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = @numberEntry1 DIV @numberEntry2
Beispiele:
  • 58 DIV 2 = 29
  • 59 DIV 2 = 29
  • 60 DIV 2 = 30
  • 3,8 DIV 1,2 = 3

FILESIZE

Funktionsweise: Gibt die Summe der Dateigrößen aller Dateien innerhalb eines Datei-Containers in Byte zurück.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = FILESIZE ( @entry )
Beispiele:
  • = FILESIZE ( @Rechnungen )

MAX, MIN

Funktionsweise: Gibt das Extremum von referenzierten Feldern zurück: MAX den Maximalwert und MIN den Minimalwert.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = MAX ( @entry1 ; @entry2 ; ... )
Beispiele:
  • = MAX ( CHILDREN@Starttermin )
  • = MIN ( @Aufträge@Auftrg1@Umsatz ; @Aufträge@Auftrag2@Umsatz )

MAXIF, MINIF

Funktionsweise: Gibt das Extremum von referenzierten Feldern zurück, wenn die Bedingung wahr ist. Alle Referenzen in der Bedingung beziehen sich auf die Formulare der referenzierten Elemente des vorderen Teils. Soll sich die Bedingung auf ein Feld beziehen, das auf demselben Datenblatt wie die MAXIF/MINIF-Formel ist, muss vor das referenzierte Feld ein THIS vorangestellt werden.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = MAXIF ( @entry1 ; @entry2 ; ... | <condition> )
Beispiele:
  • = MAXIF ( CHILDREN@Sterttermin | @Auftragfreigegeben )
  • = MINIF ( CHILDREN@Umsatz | YEAR ( @Starttermin ) = 2015year )

MOD

Funktionsweise: MOD berechnet den Rest einer Division zweier Zahlen.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = @number1 MOD @number2
Beispiele:
  • 5 MOD 3 = 2
  • 6 MOD 3 = 0
  • 7 MOD 3 = 1
  • 12,3 MOD 3,8 = 0,9

ROUND

Funktionsweise: Rundet eine Zahl-Referenz auf die angegebene Anzahl an Stellen.
Erlaubte Referenzen:
  • number
  • decimal_place (Nachkommastellen)
Rückgabewert: Syntax:
  • = ROUND ( @number | <decimal_place> )

SMA

Funktionsweise: Einfacher, gleitender Mittelwert über den Zeitraum der angegebenen Anzahl von Tagen.
Erlaubte Referenzen:
  • number
  • number_of_days (Zeitraum in Tagen)
Rückgabewert: Syntax:
  • = SMA ( @number | <number_of_days> )

SUM

Funktionsweise: Summenbildung vom Inhalt der referenzierten Felder.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = SUM ( @entry1 ; @entry2 ; ... )
  • = SUM ( <referenceList> )
Beispiele:
  • = SUM ( CHILDREN@Umsatz )
  • = SUM ( @UmsatzNetto ; @Steuer )

SUMIF

Funktionsweise: Summenbildung vom Inhalt der referenzierten Felder, wenn die Bedingung wahr ist. Alle Referenzen in der Bedingung beziehen sich auf die Formulare der referenzierten Elemente des vorderen Teils. Soll sich die Bedingung auf ein Feld beziehen, das auf demselben Datenblatt wie die SUMIF-Formel ist, muss vor das referenzierte Feld ein THIS vorangestellt werden.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = SUMIF ( @entry1 ; @entry2 ; ... | <condition> )
  • = SUMIF ( <referenceList> | <condition> )
Beispiele:
  • = SUMIF ( CHILDREN@Umsatz | YEAR ( @Auftragsdatum ) = YEAR ( TODAY ) )
  • = SUMIF ( @Servicekosten ; @Ersatzteile | @Auftrag freigegeben)

Logische Funktionen

AND

Funktionsweise: Eine Und-Verknüpfung von booleschen Ausdrücken. Ergibt nur TRUE, wenn alle Teilbedingungen TRUE ergeben.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? AND ( @booleanEntry1 ; @booleanEntry2 ; ... )
  • ? AND ( <referenceList> )
Beispiele:
  • ? AND ( @Auftrag freigegeben ; @Umsatz > 0 )

CONTAINS

Funktionsweise: Überprüft, ob der angegebene Text in einem referenzierten String enthalten ist.
Erlaubte Referenzen:
  • string
  • text (zu beinhaltender Text)
    • String
    • Text in geschweiften Klammern
Rückgabewert: Syntax:
  • ? CONTAINS ( @string | <text> )
Beispiele:
  • ? CONTAINS ( @Name | {Müller} )
  • ? CONTAINS ( @Name | @angelegt von )

HAS_VALUE

Funktionsweise: Mit der Funktion HAS_VALUE kann überprüft werden, ob ein Formularfeld einen gültigen Wert enthält. Dies bedeutet, dass HAS_VALUE auch dann true zurückliefert, wenn in einem Feld eine (gültige) Formel hinterlegt wurde.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? HAS_VALUE ( @entry )
Beispiele:
  • ? HAS_VALUE ( @EndeDatum )

NOT

Funktionsweise: Eine Verneinung von booleschen Ausdrücken. Invertiert das Ergebnis der beinhalteten Bedingung (TRUE ergibt FALSE und umgedreht).
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? NOT ( @booleanEntry )
  • ? NOT ( <condition> )
Beispiele:
  • ? NOT ( @Auftrag freigegeben )

OR

Funktionsweise: Eine Oder-Verknüpfung von booleschen Ausdrücken. Ergibt TRUE, wenn eine der Teilbedingungen TRUE ergibt.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? OR ( @booleanEntry1 ; @booleanEntry2 ; ... )
  • ? OR ( <referenceList> )
Beispiele:
  • ? OR ( @Auftrag freigegeben ; @EndeDatum < TODAY )

Verknüpfungen

CONNECTIONS

Funktionsweise: Kann auf Datenfelder der anliegenden Connection zugreifen, wobei das referenzierte Feld vom selben Typ sein muss wie das Zielfeld.
Erlaubte Referenzen:
  • connection_type (Name des Beziehungstyps)
  • entry (Name des referenzierten Feldes)
Rückgabewert:
  • Inhalt des referenzierten Feldes
Syntax:
  • = CONNECTIONS ( @connection_type ) @entry
Anmerkung:
  • Da diese Formel eine Menge zurückgibt, muss sie mit einer Mengenformel (SUM, SUMIF, MAX, MAXIF, MIN oder MINIF) kombiniert werden.
    = SUM ( CONNECTIONS ( @connectionType ) @entry )
Funktionsweise: Bildet eine Liste aus den referenzierten Elementen
Erlaubte Referenzen:
  • Elemente (semikolon-separierte Liste)
  • THIS
  • CHILDREN
  • PARENT
  • PREV
  • NEXT
Rückgabewert: Syntax:
  • = LINKLIST ( <elements> )
Beispiele:
  • = LINKLIST ( CHILDREN )
  • = LINKLIST ( THIS )
  • = LINKLIST ( @alle Mitarbeiter ; @alle Kundenkontakte )

LINKLISTIF

Funktionsweise: Bildet eine Liste aus den referenzierten Elementen, wenn die Bedingung wahr ist. Alle Feld-Referenzen in der Bedingung beziehen sich auf die Formulare der referenzierten Elemente des vorderen Teils. Felder des Formulars, das die Formel enthält, können in der Bedingung referenziert werden, indem ein THIS vorangestellt wird.
Erlaubte Referenzen:
  • elements
    • Elemente (semikolon-separierte Liste)
    • THIS
    • CHILDREN
    • PARENT
    • PREV
    • NEXT
  • condition (bezieht sich jeweils auf die referenzierten Datenblätter)
Rückgabewert: Syntax:
  • = LINKLISTIF ( <elements> | <condition> )
Beispiele:
  • = LINKLISTIF ( CHILDREN | @Umsatz > 0 )
  • = LINKLISTIF ( @Mitarbeiter in Urlaub ; @Mitarbeiter krank | @Abteilungsleiter )

OTHERASPECTS

Funktionsweise: Kann auf Datenfelder von anderen Datenblättern eines bestimmten Aspekttyps zugreifen, zu denen irgendeine Beziehung existiert. Das Feld mit der Formel und die referenzierten Felder müssen vom selben Typ sein.
Erlaubte Referenzen:
  • aspect_type (Name des Aspekttyps)
  • entry (Name des referenzierten Feldes)
Rückgabewert (abhängig vom referenzierten Feld):
  • Inhalt des referenzierten Feldes
Syntax:
  • = OTHERASPECTS ( @aspect_type ) @entry
Anmerkung:
  • Da diese Formel eine Menge zurückgibt, muss sie mit einer Mengenformel (SUM, SUMIF, MAX, MAXIF, MIN oder MINIF) kombiniert werden.
    = SUM ( OTHERASPECTS ( @aspect_type ) @entry )
  • Wird OTHERASPECTS in Verbindung mit einer Bedingung verwendet (z. B. SUMIF), dann bezieht sich die Bedingung auf das Datenblatt des angegebenen Typs.
Beispiele:
  • = SUM ( OTHERASPECTS ( @aufträge ) @Umsatz )
  • = SUMIF (OTHERASPECTS ( @aufträge ) @Umsatz | @Auftrag abgeschlossen )
Funktionsweise: Referenziert auf dem Formular einer Beziehung die jeweils anliegenden Aspektknoten als Navigationshilfe. Mit IN und OUT kann weiter definiert werden, ob man das Ausgangs-Datenblatt der Beziehung oder das Zieldatenblatt ausgeben möchte. Ohne Definition werden beide zurückgegeben. Funktioniert nur auf Beziehungsdatenblättern.
Erlaubte Referenzen:
  • direction (IN, OUT)
Rückgabewert: Syntax:
  • = PARENTLINK
  • = PARENTLINK ( <direction> )

ROLES

Funktionsweise: Bildet eine Liste aller Elemente, zu oder von denen vom referenzierten Element eine Beziehung besteht. Soll nur ein bestimmter Beziehungstyp beachtet werden, kann ROLESIF verwendet werden.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = ROLES ( <reference> )
Beispiele:
  • = ROLES ( THIS )
  • = ROLES ( CHILDREN )

ROLESIF

Funktionsweise: Bildet eine Liste aus den Elementen, zu denen eine Beziehung eines bestimmten Beziehungstyps bzw. einer bestimmten Richtung besteht.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = ROLESIF ( <reference> | <direction> )
  • = ROLESIF ( <reference> | @connection_type ; <direction> )
Beispiele:
  • = ROLESIF ( THIS | @mitarbeiter2abteilung )
  • = ROLESIF ( THIS | @abteilungsleiter ; IN )

Datumsfunktionen

CREATIONDATE

Funktionsweise: Wird durch das Datum ersetzt, zu welchem das betreffende Formular erstellt wurde. Wird auf Vorlagen nicht ausgewertet.
Rückgabewert:
  • Date (Erstellungsdatum)
Syntax:
  • = CREATIONDATE

DAY

Funktionsweise: Extrahiert aus dem referenzierten Datum den Tag bzw. rechnet eine Zeitspanne in die Anzahl an Tagen um. Zu beachten ist, dass als Datum immer ein Datumsfeld verwendet werden muss. Das direkte Eintragen eines Datums in die Formel ist derzeit nicht möglich.
Erlaubte Referenzen:
  • Date
  • Number (mit Zeit-Einheit)
  • Zahl mit Zeiteinheit
Rückgabewert: Syntax:
  • = DAY ( @dateEntry )
  • = DAY ( @dateEntry - @dateEntry2 )
  • = DAY ( @numberEntry )
Beispiele:
  • = DAY ( @Anfangsdatum )
  • = DAY ( @Datum1 - @Datum2 )
mögliche Ergebnisse:
  • DAY ( 13.11.2015 ) = 13 day
  • DAY ( 13.11.2015 - 5.11.2015 ) = 8 day
  • DAY ( 691200000 ms ) = 8 day

HOUR

Funktionsweise: Extrahiert aus dem referenzierten Datum die Stunde bzw. rechnet eine Zeitspanne in die Anzahl an Stunden um. Da ein Datum in Scope immer auf Mitternacht normiert wird, ergibt HOUR bei einem Datum immer 0.
Erlaubte Referenzen:
  • Date
  • Number (mit Zeit-Einheit)
  • Zahl mit Zeiteinheit
Rückgabewert: Syntax:
  • = HOUR ( @dateEntry )
  • = HOUR ( @dateEntry - @dateEntry2 )
  • = HOUR ( @numberEntry )
Beispiele:
  • HOUR ( 1 day ) = 24 h
  • HOUR ( 691200000 ms ) = 192 h

MONTH

Funktionsweise: Extrahiert aus dem referenzierten Datum den Monat bzw. rechnet eine Zeitspanne in die Anzahl an Monaten um.
Erlaubte Referenzen:
  • Date
  • Number (mit Zeit-Einheit)
  • Zahl mit Zeiteinheit
Rückgabewert: Syntax:
  • = MONTH ( @dateEntry )
  • = MONTH ( @dateEntry - @dateEntry2 )
  • = MONTH ( @numberEntry )
Beispiele:
  • MONTH ( 13.11.2014 ) = 11 month
  • MONTH ( 13.11.2014 - 5.09.2014 ) = 2 month
  • MONTH ( 5961600000 ms ) = 2 month

PERIODIC

Funktionsweise: Liefert das nächste Datum eines sich regelmäßig wiederholenden Ereignisses. Hiermit einfach möglich: nächster Geburtstag, nächster Jour fixe.
Erlaubte Referenzen:
  • base_date (Basis-Datum)
  • period (Intervall)
    • Number
    • Zahl mit Zeit-Einheit (day, week, month, year)
Rückgabewert: Syntax:
  • = PERIODIC ( @base_date | @period )
Beispiele:
  • = PREIODIC ( @Geburtstag | 1 year )
mögliche Ergebnisse Wichtig: das Datum muss als Referenz hinterlegt werden. Direkte Eingabe eines Datums in der Formel ist derzeit nicht möglich. Wenn heute der 13.01.2015 ist, dann gelten folgende Berechnungen:
  • PERIODIC ( 07.01.2015 | 5 day ) = 17.01.2015
  • PERIODIC ( 08.01.2015 | 5 day ) = 13.01.2015
  • PERIODIC ( 13.01.2015 | 5 day ) = 13.01.2015
  • PERIODIC ( 05.01.2015 | 1 week ) = 19.01.2015
  • PERIODIC ( 08.01.2015 | 1 week ) = 15.01.2015
  • PERIODIC ( 02.01.2015 | 2 month ) = 02.03.2015
  • PERIODIC ( 31.12.2014 | 2 month ) = 28.02.2015
  • PERIODIC ( 31.12.2014 | 1 year ) = 31.12.2015
  • PERIODIC ( 29.02.2012 | 1 year ) = 28.02.2015

TODAY

Funktionsweise: Wird täglich durch das aktuelle Datum ersetzt und die Formel neu ausgewertet.
Rückgabewert: Syntax:
  • = TODAY
  • = TODAY + 1 day
Mögliche Datumseinheiten zur Verrechnung sind: day, week, month, year (immer im Singular!).

WEEK

Funktionsweise: Gibt die Kalenderwoche an, in der sich das referenzierte Datum befindet.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = WEEK ( @dateEntry )

WEEKDAY

Funktionsweise: Gibt den Wochentag des referenzierten Datums als Zahl zurück.
Erlaubte Referenzen: Rückgabewert:
  • Number (1 für Montag ... 7 für Sonntag)
Syntax:
  • = WEEKDAY ( @dateEntry )

WORKDAYS

Funktionsweise: Gibt die Anzahl der Arbeitstage zwischen zwei Daten zurück. Start- und Endtag werden mitgezählt. Arbeitstage sind alle Tage außer Samstag und Sonntag.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = WORKDAYS ( @startDate ; @endDate )

YEAR

Funktionsweise: Extrahiert aus dem referenzierten Datum das Jahr bzw. rechnet eine Zeitspanne in die Anzahl an Jahren um.
Erlaubte Referenzen:
  • Date
  • Number (mit Zeit-Einheit)
  • Zahl mit Zeiteinheit
Rückgabewert: Syntax:
  • = YEAR ( @dateEntry )
  • = YEAR ( @dateEntry - @dateEntry2 )
  • = YEAR ( @numberEntry )
Beispiele:
  • YEAR ( 13.11.2014 ) = 2014 year
  • YEAR ( 13.11.2014 - 5.09.2011 ) = 3 year
  • YEAR ( 100656000000 ms ) = 3 year

Buttonfunktionen

COPY

Funktionsweise: Die COPY-Formel beinhaltet die Logik für einen CopyButton. Eine COPY-Formel besteht aus Referenzen zum zu kopierenden Datenblatt und dem Ort, wo es hinkopiert werden soll (ohne beim Kopieren von Objekten und Prozessen). Darüber hinaus kann beim Kopieren einer ganzen Struktur das Datenblatt ausgewählt werden, das beim Kopieren zum Bearbeiten angeboten wird. Letztlich lässt sich der Status der erstellten Elemente festlegen und auch, ob ein einzelnes Datenblatt oder eine ganze Struktur kopiert werden soll.
Erlaubte Referenzen:
  • source (zu kopierendes Datenblatt)
    • Objekt
    • Prozess
    • Aspekt
    • Knoten
  • targets (Elternelement, worunter das Element kopiert werden soll; mehrfache Einträge möglich)
    • Objekt
    • Prozess
    • Aspekt
    • Knoten
    • Beim Kopieren eines Objekts oder Prozesses, wird diese Referenz leer gelassen.
  • input_element (Datenblatt unter source, das zur Bearbeitung angeboten wird; wenn leer, dann wird automatisch das source-Element verwendet)
    • Aspekt
    • Knoten
  • state (Status der kopierten Elemente)
    • PLANNING (default)
    • ACTIVE
  • range (Umfang)
    • SINGLE (nur das Element wird kopiert)
    • CHILDREN (Element mit allen Unterelementen)
    • CONNECTED (default; Element mit allen Unterelementen und allen über Beziehungen verbundenen Elemente)
    • SINGLE_UP (das referenzierte Element und alle Beziehungen (unabhängig von ihrer Richtung) werden kopiert (= Single). Bestehen diese Beziehungen zu imaginären Elementen, so werden diese, ebenso wie deren imaginären Elternelemente und Beziehungen, ebenfalls rekursiv mitkopiert (= Up))
Aktion:
  • Kopie eines Elements bzw. einer Elementstruktur wird in der REWOO-Welt erstellt.
Syntax:
  • = COPY ( LINKLIST ( @source ) ; LINKLIST ( @targets ) ; LINKLIST ( @input_element ) | <state> ; <range> )
Beispiele:
  • = COPY ( LINKLIST ( @Aufträge@template Auftrag ) ; LINKLIST ( @Aufträge ) | ACTIVE ; SINGLE )
Anmerkung:

PORTFOLIO

heißt jetzt TABLEVIEW

TABLEVIEW

Funktionsweise: Die TABLEVIEW-Formel definiert die Logik hinter einem TableViewButton. Sie beinhaltet die zu öffnende Tabellenansicht und optional eine Filterung, nach der die Tabellenzeilen eingeschränkt werden soll.
Erlaubte Referenzen:
  • table (Name einer angelegten Tabellenansicht)
  • condition (bezieht sich jeweils auf die referenzierten Datenblätter)
  • entry (Feld vom Element-Typ der Tabellenansicht)
    • Feld-Referenz
    • NAME (Referenz für den Elementnamen)
    • STATE (Referenz für den Elementstatus)
    • STAGE (Referenz für den Layout-/Schrittnamen)
  • value (möglicher Wert des entry-Feldes)
    • Wert
    • Feldreferenz (Feld vom Element-Typ der Tabellensicht)
    • Feldreferenz mit THIS (Feld auf dem Datenblatt des TableViewButton)
    • absolute Feldreferenz
Aktion:
  • Eine (gefilterte) Tabellenansicht wird geöffnet.
Syntax:
  • = TABLEVIEW ( @tableView )
  • = TABLEVIEW ( @tableView | <condition> )
Beispiele:
  • = TABLEVIEW ( @Auftragsübersicht )
  • = TABLEVIEW ( @Auftragsübersicht | THIS@Ansprechpartner = @Ansprechpartner )
  • = TABLEVIEW ( @Auftragsübersicht | @Auftragsdatum < TODAY )
  • = TABLEVIEW ( @tableView | AND ( NOT ( STATE = ONHOLD ) ; NAME = {Produkt 1001} ; OR ( STAGE <> {Final} ; @entry = 4 ) ) )
Anmerkung:
  • Die in "entry" referenzierten Datenfelder müssen sich auf dem Datenblatttyp der Tabellenansicht befinden, allerdings nicht zwingend als Spalten in der Tabelle angelegt sein.
  • Bedingungen können mit AND, OR und NOT beliebig geschachtelt werden.

Wertfunktionen

COUNTER

Funktionsweise: Gibt eine Zahl zurück, die global dem string zugeordnet ist und bei jeder Instanz um den Wert 1 hochgezählt wird.
Erlaubte Referenzen:
  • String
  • Text in geschweiften Klammern
Rückgabewert: Syntax:
  • = COUNTER ( <counter_name> )
Beispiele:
  • = COUNTER ( AuftragsNr )
  • = COUNTER ( @angelegt von )

CREATOR

Funktionsweise: Wird durch den Nutzernamen ersetzt, der das betreffende Formular erstellt hat (z.B. durch einen CopyButton). Wird nicht auf Vorlagen ausgewertet.
Rückgabewert: Syntax:
  • = CREATOR

ELEMENTNAME

Funktionsweise: Gibt den Namen/Bezeichner des aktuellen Elements als String zurück.
Rückgabewert: Syntax:
  • = ELEMENTNAME

EXCEL

Funktionsweise: Auslesen einer bestimmten Zelle aus einer in einem SpreadsheetFile-Feld abgelegten Excel-Datei.
Erlaubte Referenzen:
  • spreadsheet
  • worksheet (Arbeitsmappe innerhalb der Excel-Datei)
  • cell (Zelle innerhalb der Arbeitsmappe, Beispiel: B12)
Rückgabewert (abhängig vom Format der Zelle): Syntax:
  • = EXCEL ( @spreadsheet ; <worksheet> ! <cell> )
Beispiele:
  • = EXCEL ( @Projektauftrag ; Tabelle1!E4 )

INIT

Funktionsweise: Wird ein Element aus einer Vorlage kopiert, wird die INIT-Formel durch den referenzierten Wert ersetzt. Dadurch kann dynamisch ein Wert gesetzt werden, ohne dass letztlich eine bleibende Referenz geschrieben wird. Diese Funktion findet lediglich auf Vorlagen Verwendung.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = INIT ( @sourceEntry )
Anmerkung:
  • Innerhalb der INIT-Funktion werden keine Formeln unterstützt. Es können nur einzelne Felder referenziert werden.

PARENTNAME

Funktionsweise: Gibt den Namen des jeweils übergeordneten Elements als String zurück. Auf Beziehungsdatenblättern muss zusätzlich angegeben werden, ob das Ausgangs- oder das Zieldatenblatt zurückgegeben werden soll. Funktioniert nicht für Objekte und Prozesse.
Erlaubte Referenzen:
  • direction (IN, OUT)
Rückgabewert:
  • String (Bezeichner des referenzierten Elements)
Syntax:
  • = PARENTNAME
  • = PARENTNAME ( <direction> )
    bei Connections

VERSION

Funktionsweise: Gibt den Wert des referenzierten Feldes zu einem vergangenen Zeitpunkt zurück. Eine negative Versions-ID gibt eine Vorversion relativ zur aktuellen Version zurück. Eine positive Versions-Id orientiert sich an der absoluten Versionsnummer des Feldes. Der Zeitpunkt kann auch in Form einer Referenz auf ein Datumsfeld angegeben werden. In diesem Fall wird der Wert des Feldes zum entsprechenden Zeitpunkt in der Vergangenheit ausgelesen.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = VERSION ( @entry | <versionId> )
  • = VERSION ( @entry | @date_entry )
Anmerkung:
  • Wird die Version mithilfe eines Date-Feldes bestimmt, wird der erste Wert dieses Datums zurückgegeben. Das ist normalerweise der Wert, den das referenzierte Feld um 0:00 Uhr (UTC) hatte. Möchte man den letzten Wert eine Tages zurückgegeben haben, muss man dementsprechend den Folgetag als Datum auswählen.
  • Wird ein Datumswert angegeben, an dem das zugehörige Element noch gar nicht existiert hat, so wird die Formel als "NICHT AUSWERTBAR" gekennzeichnet.
  • Wird ein zukünftiger Datumswert angegeben, so wird der aktuelle Wert zurückgegeben.

Systemaktionen

ALERT

Funktionsweise: Verschickt abhängig von einer Bedingung eine Meldung an alle Benutzer mit mindestens Lese-Recht auf dem Datenblatt. Diese Meldung kann nicht als gelesen markiert oder gelöscht werden. Sie verschwindet allerdings automatisch, wenn die auslösende Bedingung behoben ist.
Erlaubte Referenzen:
  • condition
  • category (Kategorie der Meldung)
    • COMPLIANCE
    • FINANCE
    • SIGNATURE
    • STAFF
    • TIME
    • benutzerdefinierte Kategorie
  • message_text (Inhalt der Nachricht; optional)
    • Text in geschweiften Klammern
  • bool_from, bool_to (legt fest, welcher Wechsel der Bedingung zur Aktion führt; optional)
    • f = false
    • t = true
    • * = true, false
Syntax:
  • ? <condition> : ALERT
  • ? <condition> : ALERT ( <category> )
  • ? <condition> : ALERT ( <message_text> )
  • ? <condition> : ALERT ( <bool_from> ; <bool_to> )
  • ? <condition> : ALERT ( <category> ; <message_text> | <bool_from> ; <bool_to> )
Beispiele:
  • ? @Projektkosten > 5000 : ALERT ( finance ; {Achtung die Kosten übersteigen das Projektbudget.} | f ; t )
Aktion:
  • Alle Benutzer, die dieses Element sehen, erhalten eine Alarm-Nachricht, wenn er ausgelöst wird.

EMAIL

Funktionsweise: Verschickt abhängig von einer Bedingung eine E-Mail mit einem bestimmten Text an die angegebenen Empfänger. Die E-Mail kann auch Anhänge besitzen, die in Form einer Referenz auf ein FileLinks-Feld angegeben werden können.
Erlaubte Referenzen:
  • condition
  • send_to (E-Mail-Adressen der Empfänger)
    • Email (auch per OTHERASPECTS und CHILDREN summiert)
    • String
    • Text in geschweiften Klammern (kommaseparierte Liste von E-Mail-Adressen)
  • reply_to (E-Mail-Adresse des Absenders)
  • email_title, email_text (Betreff und Inhalt der E-Mail)
  • attachments (Anhänge; optional)
  • bool_from, bool_to (legt fest, welcher Wechsel der Bedingung zur Aktion führt; optional)
    • f = false
    • t = true
    • * = true, false
Syntax:
  • ? <condition> : EMAIL( @send_to ; @reply_to ; @email_title ; @email_text )
  • ? <condition> : EMAIL( @send_to ; @reply_to ; @email_title ; @email_text ; @attachments | <bool_from> ; <bool_to> )
Beispiele:
  • ? @Kosten IST > @Kosten SOLL : EMAIL ( @Mailempfänger ; @reply ; {Achtung Kosten zu hoch!} ; @Mailtext | f ; t )
  • ? @Kosten IST > @Kosten SOLL : EMAIL ( @Mailempfänger ; @reply ; {Achtung Kosten zu hoch!} ; {Die Kosten übersteigen das Budget. Bitte prüfen ##DEEPLINK##} | f ; t )
Aktion:
  • An alle angegebenen E-Mail-Adressen wird eine E-Mail versendet.
Sonstiges:
  • Link zum Datenblatt: In email_text kann der Platzhalter ##DEEPLINK## verwendet werden, um automatisch einen Link zum Datenblatt in den E-Mail-Text einzufügen.

MESSAGE

Funktionsweise: Verschickt abhängig von einer Bedingung eine Nachricht an alle Benutzer, die mindestens Lese-Recht auf das Datenblatt besitzen.
Erlaubte Referenzen:
  • condition
  • category (Kategorie der Meldung)
    • COMPLIANCE
    • FINANCE
    • SIGNATURE
    • STAFF
    • TIME
    • benutzerdefinierte Kategorie
  • message_text (Inhalt der Nachricht; optional)
    • Text in geschweiften Klammern
  • bool_from, bool_to (legt fest, welcher Wechsel der Bedingung zur Aktion führt; optional)
    • f = false
    • t = true
    • * = true, false
Syntax:
  • ? <condition> : MESSAGE
  • ? <condition> : MESSAGE ( <category> )
  • ? <condition> : MESSAGE ( <message_text> )
  • ? <condition> : MESSAGE ( <bool_from> ; <bool_to> )
  • ? <condition> : MESSAGE ( <category> ; <message_text> | <bool_from> ; <bool_to> )
Soll eine Nachricht bei einer Ampel ausgelöst werden, muss kein Übergang angegeben werden. Die Nachricht wird ausgelöst, wenn entweder die gelbe oder die rote Bedingung true ist. Aktion:
  • An alle Anwender, die das Element sehen, wird eine Nachricht geschickt.

SETSTATE

Funktionsweise: Verändert abhängig von einer Bedingung den Status des aktuellen Elements.
Erlaubte Referenzen:
  • condition
  • state (Zielstatus)
    • ACTIVE
    • ONHOLD
    • CLOSED
    • ARCHIVED
    • REJECTED
  • bool_from, bool_to (legt fest, welcher Wechsel der Bedingung zur Aktion führt; optional)
    • f = false
    • t = true
    • * = true, false
Syntax:
  • ? <condition> : SETSTATE ( <state> | <bool_from> ; <bool_to> )
  • ? <condition> : SETSTATE ( <state> )
Beispiele:
  • ? @Auftrag abgeschlossen : SETSTATE ( CLOSED | f ; t )
Aktion:
  • Das aktuelle Element wird in den angegebenen Status versetzt.

Vergleichsoperatoren

Zahl, Datum ElementLinks
> größer als enthält mehr als die Elemente von
>= größer gleich enthält mindestens die Elemente von
= gleich enthält die gleichen Elemente
<= kleiner gleich mindestens alle Elemente sind enthalten in
< kleiner mehr als alle Elemente sind enthalten in
<> ungleich beide Listen enthalten mehr als ihre Schnittmenge
Text
= entspricht genau der Zeichenfolge
? enthält Zeichenfolge
! enthält Zeichenfolge nicht

Referenzen

Auf Datenblätter

Die folgende Grafik zeigt alle möglichen relativen Referenzierungen von anderen Datenblättern in einer Welt. Eine absolute (direkte) Referenz ist generell zu allen Elementen einer Welt möglich. Mit Ausnahme von PARENTNAME geben alle hier angegebenen Funktionen eine Element-Liste zurück.

Funktionen:

  • LINKLIST(THIS) - Selbstreferenz auf Datenblatt mit Formel
  • LINKLIST(PARENT) - Übergeordnetes Datenblatt (nicht Objekte oder Prozesse!)
  • LINKLIST(CHILDREN) - Alle untergeordneten Datenblätter (nicht auf Objekten und Prozessen!)
  • LINKLIST(PREV) - Alle Datenblätter, die in PrevLinks-Feldern dieses Formulars stehen
  • LINKLIST(NEXT) - Alle Datenblätter, die in NextLinks-Feldern dieses Formulars stehen
  • ROLES - Alle Datenblätter, zu denen eine Beziehung besteht
  • ROLESIF - Alle Datenblätter, zu denen eine Beziehung eines bestimmten Typs besteht
  • PARENTLINK - Übergeordnetes Datenblatt; für Beziehungen jeweils Ausgangs- bzw. Zieldatenblatt
  • PARENTNAME - Datenblattname des übergeordneten Datenblatts als String; für Beziehungen jeweils Ausgangs- bzw. Zieldatenblatt
Referenzierung von Elementen in REWOO Scope

Auf Datenfelder

Über Datenblätter hinaus können auch spezielle Datenfelder auf anderen Datenblättern referenziert werden. Die folgende Grafik zeigt alle möglichen relativen Referenzierungen von Datenfeldern auf anderen Formularen. Eine absolute Referenz ist generell zu allen Datenfeldern einer Welt möglich.

Referenzen, die sich auf mehr als ein einzelnes Feld beziehen, benötigen eine vorangestellte Mengenformel, wie SUM, SUMIF, MAX, MAXIF, MIN oder MINIF. Im Bezug auf Objekte und Prozesse gelten dieselben Einschränkungen wie auch bei der Referenzierung von Datenblättern.

Funktionen:

  • PARENT@feld - Feld auf übergeordnetem Datenblatt
  • CHILDREN@feld - Feld auf allen untergeordneten Datenblättern (benötigt Mengenformel)
  • PREV@feld - Feld auf allen Datenblättern, die im PrevLinks-Feld hinterlegt sind (benötigt Mengenformel)
  • NEXT@feld - Feld auf allen Datenblättern, die im NextLinks-Feld hinterlegt sind (benötigt Mengenformel)
  • OTHERASPECTS(@aspect_type)@feld - Feld auf alles Datenblättern eines bestimmten Typs, zu denen eine Beziehung besteht (benötigt Mengenformel)
  • CONNECTIONS(@connection_type)@feld - Feld auf allen anliegenden Beziehungsdatenblättern eines bestimmten Beziehungstyps (benötigt Mengenformel)
Referenzierung von Feldern in REWOO Scope

Einheiten

REWOO Scope unterstützt eine große Bandbreite von Einheiten. Diese finden vor allem im Datenfeldtyp Number Verwendung.

Unterstützte Einheiten

Zahlreiche Einheiten des internationalen Einheitensystems (SI-Einheiten) und alternativer Einheiten werden unterstützt:

  • Datenmenge: bit, byte, kbit oder kilobit, Kibit oder kibibit, kB oder kilobyte, KiB oder kibibyte, Mbit oder megabit, Mibit oder mebibit, MB oder megabyte, MiB oder mebibyte, Gbit oder gigabit, Gibit oder gibibit, GB oder gigabyte, GiB oder gibibyte, Tbit oder terabit, Tibit oder tebibit, TB oder terabyte, TiB oder tebibyte, Pbit oder petabit, Pibit oder pebibit, PB oder petabyte, PiB oder pebibyte
  • Länge: Å (Angstrom), mm (Millimeter), cm (Zentimeter), in (Inch), dm (Dezimeter), ft (Foot), yd (Yard), m (Meter), km (Kilometer), mi (Meile), nmi (Nautische Meile), ly (Lichtjahr)
  • Fläche: mm², cm², dm², m², a (Aar), ha (Hektar), km²
  • Volumen: mm³, cm³, oz (Unze), dm³, L (Liter), gal (Galone), m³, km³
  • Dauer: ms, s, min, h, day, week, month, year
  • Geschwindigkeit: mph (Meilen/Stunde), kn (Knoten), Mach
  • Beschleunigung: grav (Gravitation)
  • Kraft: hp (Pferdestärke)
  • Masse: g, lb (Pfund), kg, t
  • Energie: J (Joule)
  • Temperatur: K (Kelvin), °F (Fahrenheit), °R (Rankine)
  • Elektrizität: A
  • Stoffmenge: mol
  • Lichtstärke: cd

Währungen

Auch Währungen können an Zahlen angehängt werden. Dazu müssen die international standardisierten Währungskürzel (für Euro und US-Dollar auch das jeweilige Währungszeichen) verwendet werden. Achtung: Unterschiedliche Währungen können nicht automatisch miteinander verrechnet werden.

Beispiele unterstützter Währungen:

  • EUR (automatisch dargestellt als €)
  • USD
  • GBP
  • CHF
  • JPY

Einheiten einsetzen

Es gibt unterschiedliche Wege, über die Einheiten an Zahlen angefügt werden können:
1. Direkte Eingabe des Anwenders:

Der Nutzer fügt bei einer Eingabe in ein Number-Feld einfach die Einheit mit an. Achtung: Einheiten werden stets im Singular angegeben.

Beispiel:

5 day
2. Anfügen per Formel:

Eine einheitslose Zahl kann auch per Formel eine Einheit zugewiesen bekommen. Umgesetzt wird das, indem man zum Beispiel eine leere Menge mit Einheit addiert oder den Wert mit 1 und einer Einheit multipliziert.

Beispiele:

12 + 0 day = 12 day
3 * 1 month = 3 month
3. Anfügen als Text nach Feld-Wert:
Im Typdesigner gibt es die Möglichkeit, für Number-Felder einen benutzerdefinierten "Text nach dem Wert" anzugeben, in den sich unter anderem auch Einheiten unterbringen lassen. Das ist lediglich eine kosmetische Lösung, da hier nur ein Text nach dem Wert eingeblendet wird, der allerdings nicht Teil des Wertes selbst ist. Eine Verrechnung unterschiedlicher Einheiten ist hier nicht möglich, da der angehängte Text systemintern nicht als Einheit angesehen wird. Zudem kann es zu Einheiten-Dopplungen in der Anzeige kommen, wenn ein Nutzer manuell eine Einheit an eine Zahl anhängt.

Einheiten miteinander verrechnen

Einheiten können miteinander verrechnet werden, solange sie kompatibel sind.

Beispiele:

1 year + 12 month = 2 year
2 km + 500 m = 2,5 km
3 m * 5 m = 15 m²
15 m² * 2 m = 30 m³

Datums-Funktionen

Abgespeichert werden Datumswerte in Unix-Time (Millisekunden seit dem 01.01.1970). Daraus folgt, dass die Differenz zweier Daten von der Einheit ms ist. Um dies in eine andere Datumseinheit umzurechnen kann das Ergebnis entsprechend interpretiert werden. Möglich sind hier die Funktionen DAY, MONTH, YEAR. Beispiel:
= YEAR ( @date2 - @date1 )
Auch ist es möglich in einem Datenfeld vom Typ Date zu einem Datum eine Zahl zu subtrahieren oder addieren. Dazu kann man Einheiten angeben wie day, month, year. Beispiel:
= @date1 + 14 day

Kopier-Logik

An dieser Stelle soll umfänglich erklärt werden, welche Logik hinter einer Copy-Aktion steht.
Dabei wird nicht unterschieden, ob die Aktion per Button (ohne Formelzusatz) oder über die Oberfläche ausgeführt wird.

Begriffe und Vorbereitung

Das jeweilige Bild zeigt die Situation vor der Copy-Aktion (linke Seite) und nach der Aktion (rechte Seite).
Dabei
  • sind gefüllte Kreise reelle Elemente, wohingegen leere Kreise imaginäre Elemente darstellen.
  • stellen senkrechte Striche die impliziten Abhängigkeiten zwischen Elementen dar, wie sie zwischen Objekten, Aspekten und deren Knoten bestehen.
  • stellen geschwungene Linien Beziehungen dar.
  • hat jedes Element und jede Beziehung einen Bezeichner.
  • haben solche Elemente ein Hochkomma im Namen, welche eine Kopie sind, und besitzen ansonsten den gleichen Bezeichner wie ihr Ursprung (A' ist eine Kopie von A).
  • ist das Ziel der Kopier-Aktion immer T (Target)
  • ist die Quelle der Kopie immer das Element N (Node).
  • ist das Element S ein verbundenes Element und Q dessen Eltern-Element.
  • ist zusätzlich am Quell-Element ein Kind-Element C und ein Eltern-Element P.

Copy-Situationen

Es wird von einer bestehenden Beziehung von N nach S ausgegangen, die mindestens ausgehende Lese-Rechte besitzt.
  • P,N,C real; Q,S real; R real Schema fürs Kopieren
  • P,N,C real; Q,S real; R imaginär Schema fürs Kopieren
  • P,N,C real; Q real; R imaginär; S imaginär Schema fürs Kopieren
  • P,N real; Q,S real; R real; C imaginär Schema fürs Kopieren
  • P real; Q,S real; R imaginär;N,C imaginär Schema fürs Kopieren
  • P real; Q real; N,C imaginär; R imaginär; S imaginär Schema fürs Kopieren
  • P,N,C imaginär; Q,S imaginär; R imaginär Schema fürs Kopieren
  • P,N,C real; Q,S real; R real Schema fürs Kopieren
  • P,N,C real; Q,S real; R imaginär Schema fürs Kopieren
  • P,N,C real; Q real; R imaginär; S imaginär Schema fürs Kopieren
  • P,N real; Q,S real; R real; C imaginär Schema fürs Kopieren
  • P real; Q,S real; R imaginär; N,C imaginär Schema fürs Kopieren
  • P real; Q real; R imaginär; S,N,C imaginär Schema fürs Kopieren
  • P real; R imaginär; Q,S,N,C imaginär Schema fürs Kopieren

Mögliche Konfigurationen eines CopyButtons

Ein CopyButton kann diverse Szenarien abbilden und muss je nach Szenario unterschiedlich konfiguriert werden. Die Konfiguration findet größtenteils über die COPY-Formel selbst statt, durch die bereits eine große Bandbreite an Möglichkeiten einstellbar ist. Darüber hinaus können für den Button auch im Designer Einstellungen hinterlegt werden, die sich auf das Verhalten und die Funktion auswirken.

Konfigurationen anhand der COPY-Formel:
  1. Kopieren eines TLE mit initialem Bearbeiten des TLE Formulars
    = COPY ( SOURCE )
  2. Kopieren eines TLE mit initialem Bearbeiten des TLE Formulars und initialem Status und verbundener Struktur
    = COPY ( SOURCE | STATE ; RANGE )
  3. Kopieren eines Aspektformulars
    = COPY ( SOURCE ; TARGET )
  4. Kopieren eines Aspektformulars und initialem Status und verbundener Struktur
    = COPY ( SOURCE ; TARGET | STATE ; RANGE )
  5. Kopieren eines TLE mit initialem Bearbeiten eines Aspektformulars
    = COPY ( SOURCE ; ; DATASHEET )
  6. Kopieren eines TLE mit initialem Bearbeiten eines Aspektformulars und initialem Status und verbundener Struktur
    = COPY ( SOURCE ; ; DATASHEET | STATE ; RANGE )
  7. Kopieren eines Aspektformulars mit initialem Bearbeiten eines Aspektformulars
    = COPY ( SOURCE ; TARGET ; DATASHEET )
  8. Kopieren eines Aspektformulars mit initialem Bearbeiten eines Aspektformulars und initialem Status und verbundener Struktur
    = COPY ( SOURCE ; TARGET ; DATASHEET | STATE ; RANGE )
Konfigurationen im Designer:
  1. Beziehung zur Kopie - Stellt beim Kopieren automatisch eine Beziehung zwischen dem Formular mit dem CopyButton und der erstellten Kopie her. Richtung, Recht und Typ der Beziehung können definiert werden. Ist in der COPY-Formel ein Datenblatt zur Bearbeitung hinterlegt, wird die Beziehung zu diesem Element erstellt.
  2. Name der Ziele - Legt fest, in welchem Format mögliche Copy-Ziele im Copy-Dialog angezeigt werden sollen. Der Dialog wird nur eingeblendet, wenn mehrere Copy-Ziele in der COPY-Formel hinterlegt sind.
  3. Mit Formular - Legt fest, ob beim Kopieren dem Nutzer ein Datenblatt zur Bearbeitung angeboten wird. Ist diese Funktion deaktiviert, dann wird das Datenblatt einfach in der vorliegenden Form kopiert. In der COPY-Formel zur Bearbeitung angegebene Datenblätter werden in diesem Fall ignoriert.

Best Practice

Buttons

§ Filtern mit dem TableViewButton nach einem Boolean
Problem: In einer Tabellenansicht sollen nur Aufträge angezeigt werden, die noch nicht erledigt sind. 
Voraussetzung: Tabellenansicht mit entsprechendem Boolean-Feld
Lösung:
  1. Tabellenansicht definieren: Offene Aufträge (Boolean-Feld als Spalte angelegt)
  2. TableViewButton mit Filterung (Typ:TableViewButton)
    = TABLEVIEW ( @Offene Aufträge | @erledigt? = {false} )
Erklärungen:
  • Zeigt die Tabellenansicht gefiltert nach der angegebenen Bedingung an.
  • Das Feld in der Bedingung muss nicht zwangsweise in der Tabelle auch als Spalte angelegt sein.
§ ConnectionButton, welcher nur Ziele anbietet, die eine Bedingung erfüllen
Problem: Die hinterlegte Liste eines ConnectionButtons soll nach einem Kriterium auf Seiten der Ziel-Elemente nur solche anzeigen.
Voraussetzung: Geschwister-Elemente, welche ein Boolean-Feld auf dem Formular besitzen. Auf dem Eltern-Element eine Liste der Kindelemente.
Lösung:
  1. Auf dem Eltern-Datenblatt:
    Liste der Kinder (Typ: ElementLinks)
    = LINKLISTIF ( CHILDREN | @Boolean )
  2. Auf dem Geschwister-Datenblatt:
    Verbinde mit Geschwister (Typ: ConnectionButton)
    = PARENT@Liste der Kinder
Erklärungen: Die Filterung, ob ein Kindelement in die Liste aufgenommen wird, entsteht auf dem Eltern-Element. So zeigt der ConnectionButton nur eine ausgewählte Liste.

Nachrichten / Alerts

§ Einmalige Benachrichtigung, wenn ein Formular erstellt wird
Problem: Sobald ein neues Formular erstellt wird, soll einmalig eine Nachricht versendet werden.
Lösung:
  1. Verstecktes Feld zum Absetzen der Nachricht (Typ: Condition)
    ? 1=1 : MESSAGE ( staff ; {Ein neues Formular wurde angelegt.} | * ; t )
§ Nachricht senden, wenn ein Wert mehrere Schwellen überschritten hat
Problem: Eine Nachricht soll abgesetzt werden, wenn jeweils die Schwellen 15, 30 oder 45 überschritten sind. Es soll jedoch keine Nachricht geschickt werden, wenn sich der Wert innerhalb zweier Schwellen ändert.
Voraussetzung: Ein Feld mit einem Zahlenwert
Lösung:
  1. Feld mit Zahlenwert (Typ: Number)
  2. Kontrollfeld (Typ: Number), welches zurückgibt, in welchem Intervall sich der aktuelle Wert befindet
    = COUNTTRUE ( @Wert >= 15 ; @Wert >= 30 ; @Wert >= 45 )
  3. Das Feld, welches das Intervall prüft (Typ: Boolean)
    ? AND ( (@Wert <= 15 * @alpha) ; (VERSION (@Wert | -1) > 15*@alpha) ) : MESSAGE(staff)
§ FileLinks-Feld beobachten und eine Nachricht absetzen, wenn eine Veränderung (upload, entfernen) vorgenommen wurde
Problem: Das Projektteam soll eine Nachricht erhalten, sobald das zentrale Business-Case-File verändert oder ein neues hochgeladen wurde.
Voraussetzung: Ein FileLinks-Feld, in welches die Datei hochgeladen wird.
Lösung:
  1. Business Case (Typ: FileLinks)
  2. verstecktes Feld für die Überwachung und das Auslösen der Aktion (Typ: Condition)
    ? AND (COUNT (VERSION(@Business Case | -1) - (@Business Case)) = 0; COUNT ( (@Business Case) - VERSION (@Business Case | -1)) = 0 : MESSAGE( compliance; {Veränderung beim Business Case!} | *;f)
Erklärungen: In beiden Bedingungen werden jeweils Mengenoperationen ausgeführt, die prüfen, ob sich die Vorgänger-Version von der aktuellen Version unterscheidet.

Datumsberechnungen

§ Fällt ein angegebenes Datumsintervall in die aktuelle Woche?
Problem: Start und Ende eines Vorgangs wird angegeben. Mich interessiert, ob die aktuelle Woche davon betroffen ist und mit wie vielen Tagen.
Voraussetzung: Der Stichtag muss als Feld (Typ: Date) vorliegen
Lösung:
  1. Feld für den Start bzw. das Ende der aktuellen Woche (Typ: Date):
    Start aktuelle Woche bzw. Ende aktuelle Woche
  2. Feld für den Start bzw. das Ende des Vorgangs (Typ: Date):
    Start bzw. Ende
  3. Tage der Aktion in dieser Woche (Typ: Number)
    = WORKDAYS( MIN( MAX( @Start ; @Start aktuelle Woche) ; @Ende aktuelle Woche ) ; MAX( MIN( @Ende;@Ende aktuelle Woche ); @Start aktuelle Woche) ) - SUMIF( 1| OR( @Ende<@Start aktuelle Woche ; AND( @Start=@Ende ; @Ende<@Start aktuelle Woche) ) )
Erklärungen: Um Samstage und Sonntag auszuschließen nutzt man die Funktionsweise von WORKDAYS. Der Korrektur-Term kümmert sich um einen Ausnahme-Fall.
§ Wie lautet das Datum vom aktuellen Wochenstart?
Problem: Für weitere Berechnungen wird das Datum vom Montag der aktuellen Woche benötigt.
Lösung:
  1. Datum für diese Woche Montag (Typ: Date)
    = TODAY - WEEKDAY(TODAY) + 1
§ Wann ist der nächste Geburtstag eines Mitarbeiters?
Problem: Wann hat ein Mitarbeiter das nächste Mal Geburtstag?
Voraussetzung: Das Geburtsdatum des Mitarbeiters muss als Feld (Typ: Date) vorliegen.
Lösung:
  1. Geburtsdatum (Typ: Date)
  2. Nächster Geburtstag (Typ: Date)
    = PERIODIC (@Geburtsdatum | 1 year)
§ Welcher Mitarbeiter hat als nächstes Geburtstag und wann?
Problem: Auf dem Elternformular soll angezeigt werden, welcher Mitarbeiter als nächstes Geburtstag hat und an welchem Datum.
Voraussetzung: Elternformular mit untergeordneten Mitarbeiter-Datenblättern.
Lösung:
  1. Felder auf den Mitarbeiter-Datenblättern:
    Geburtsdatum (Typ: Date)
    Nächster Geburtstag (Typ: Date)
    = PERIODIC (@Geburtsdatum | 1 year)
  2. Felder auf dem übergeordneten Elternformular:
    Nächster Geburtstag (Typ: Date)
    = MIN (CHILDREN)
    Geburtstagskind (Typ: ElementLinks)
    = LINKLISTIF(CHILDREN | @Nächster Geburtstag = THIS@Nächster Geburtstag)
Erklärungen: Auch geeignet für Jubilare.
§ In welches Quartal fällt ein Stichdatum?
Problem: Ein Stichtag soll nach seinem Quartal bewertet werden.
Voraussetzung: Der Stichtag muss als Feld (Typ date) vorliegen.
Lösung:
  1. Feld für den Stichtag (Typ: Date)
  2. Feld für das Quartal (Typ: Number)
    = ( MONTH (@Stichtag/1 month) +2 ) MOD 3
Erklärungen: Der Offset von 2 wird benötigt, damit die Division nicht Null ergibt. Will man das Problem transformieren (In welches Halbjahr fällt der Stichtag) muss man den Offset durch 5 und die Division durch 6 ersetzen.
§ Benachrichtigung, wenn bei einem Datumsfeld ein neuer Wert eingetragen wurde
Problem: In einem Date-Feld wird das Ende eines Projekts erfasst. Sobald in dem Feld eine Änderung vorgenommen wird, soll eine Nachricht abgesetzt werden.
Voraussetzung: Ein Date-Feld, welches überwacht werden soll.
Lösung:
  1. Projektende (Typ: Date)
  2. Überwachungsfeld (Typ: Condition)
    ? AND( DAY (@Projektende) > 0; (VERSION (@Projektende | 0) - VERSION (@Projektende | -1)) = 0 ): MESSAGE (time; {Projektende wurde geändert}| *;f)
Erklärungen:
  • Der erste Teil der AND-Bedingung sorgt dafür, dass keine Nachricht beim ersten Setzen eines Projektendes verschickt wird.
  • Eine Überwachung ist auch für Number-Felder möglich. Hierfür muss jedoch der erste Teil der AND-Bedingung "OR (@number / @number = 1;@number=0)" lauten.
§ Wie viele Arbeitstage liegen zwischen Projekt-Start und Projekt-Ende?
Problem: Arbeitstage zwischen Start- und Ende-Datum zählen, dabei sollen Start/Ende integriert werden und Wochenend-Tage ausgeschlossen werden. Man geht also von einer 5 Tage-Woche aus.
Voraussetzung: 2 Date-Felder (Start- und Enddatum), Number-Feld für Anzahl der Arbeitstage
Lösung (simpel):
  • Anzahl der Arbeitstage (Typ: Number)
    = WORKDAYS (@Startdatum; @Enddatum)
Lösung (komplex): Zum Anpassen an benutzerdefinierte Arbeitstage (wenn nicht Montag-Freitag)
  • Anzahl der Arbeitstage (Typ: Number)
    = ( DAY ( @Enddatum - @Startdatum ) + 1 )-( ( ( WEEKDAY ( @Startdatum ) + ( DAY ( @Enddatum - @Startdatum ) + 1 ) ) DIV 7 + ( ( WEEKDAY ( @Startdatum ) + ( DAY ( @Enddatum-@Startdatum ) + 1 ) ) DIV 7 ) ) - COUNTTRUE ( OR ( WEEKDAY ( @Startdatum ) = 7 ; WEEKDAY ( @Enddatum ) = 6 ) ) ) + COUNTTRUE ( AND ( WEEKDAY ( @Startdatum ) = 7 ; WEEKDAY ( @Enddatum ) = 6 ) )
Erklärungen: WORKDAYS zählt standardmäßig Montag bis Freitag als Arbeitstage. Samstag und Sonntag werden nicht gezählt.

Historie Datenfelder

§ Mittelwert-Betrachtung für Trend
Problem: Ein Zahlenwert verändert sich beständig. Da eine Schwellwert-Betrachtung nicht ausreichend ist, um ein Gefühl für die Güte der Veränderung zu bekommen, soll ein Mittelwert über einen gewählten Zeitraum gebildet und mit dem aktuellen Wert verglichen werden.
Voraussetzung: Ein Zahlenfeld muss über einen definierten Zeitraum (Beispiel 30 Tage) vorhanden und mit Werten befüllt worden sein.
Lösung:
  1. 1. das zu beobachtende Zahlenfeld (Typ: Number) und dessen Mittelwert über die letzten 30 Tage: Kontostand
    = SMA (@Kontostand | 30)
  2. durch einen Pfeil soll der Trend in den letzten 30 Tagen interpretiert werden (Typ: Indicator)
    ? [@Mittelwert - @Kontostand = 0; @Mittelwert - @Kontostand > 0]
Erklärungen: Wichtig ist dabei, dass Ausreißer den Mittelwert stark beeinflussen können. Um solche Ausreißer zu unterdrücken, würde man ausgereifte Filter-Funktionen benötigen.
§ Ramp-Up einer monatlichen Auszahlung in Abhängigkeit vom heutigen Monat und dem Auszahlungs-Start
Problem: Ein monatlicher Betrag soll ausgezahlt werden. Dabei sollen im ersten Monat 30%, im zweiten Monat 60% und ab dem dritten Monat die vollen 100% ausgezahlt werden. Das Startdatum soll vom Benutzer gesetzt werden. Es soll eine Ausgabe erfolgen, welcher Betrag in nächsten drei Monaten jeweils ausgezahlt wird.
Voraussetzung: Feld mit Startdatum und Feld mit dem monatlichen Gesamtbetrag.
Lösung:
  1. Start Auszahlung (Typ: Date)
  2. Monatlicher Betrag (Typ: Number)
  3. Auszahlung dieser Monat (Typ: Number)
    = (1 - COUNTTRUE (MONTH (@Start Auszahlung) = MONTH (TODAY)) * 0.7 - COUNTTRUE (MONTH(@Start Auszahlung) = MONTH (TODAY) -1 month) * 0.4 - COUNTTRUE (MONTH (@Start Auszahlung) > MONTH (TODAY)) ) * @monatlicher Betrag
  4. Auszahlung kommender Monat (Typ: Number)
    = (1 - COUNTTRUE (MONTH (@Start Auszahlung) = MONTH (TODAY) +1 month) * 0.7 - COUNTTRUE (MONTH (@Start Auszahlung) = MONTH (TODAY)) * 0.4) * @monatlicher Betrag
  5. Auszahlung in zwei Monaten (Typ: Number)
    = (1 - COUNTTRUE (MONTH (@Start Auszahlung) = MONTH (TODAY) + 2 month) * 0.7 - COUNTTRUE (MONTH (@Start Auszahlung) = MONTH (TODAY) + 1 month) * 0.4) * @monatlicher Betrag
§ Zuletzt hochgeladenes Dokument in der Übersicht generieren lassen
Problem: Auf mehreren Kind-Formularen gibt es FileLinks-Felder, in diese Nutzer Dateien hochladen können. In der Eltern-Übersicht will man nun die Übersicht bewahren und das Letzte oder die zuletzt hochgeladenen Dateien anzeigen lassen.
Voraussetzung: Die Versionierung des Typen muss angeschaltet sein, sonst funktioniert diese Lösung nicht.
Lösung:
  1. Folgende Felder sind in den Kind-Formularen für den Nutzer zugänglich: Fotos (Typ: FileLinks) sowie Dokumente (Typ: FileLinks)
  2. Auf dem Elternformular sollten diese Felder auf den Kind-Formularen summiert werden
    = SUM (CHILDREN)
  3. Auf dem Elternformular braucht es ein zusätzliches Feld zur Anzeige, in welchem die Versions-Differenz dargestellt wird: Zuletzt hochgeladene Dateien (Typ: FileLinks)
    = (@Fotos - VERSION ( @Fotos | -1 )) + (@Dokumente - VERSION ( @Dokumente | -1 ))
Erklärungen: In diesem Beispiel werden die beiden Input-Felder getrennt betrachtet, das bedeutet jedes Feld stellt jeweils das zuletzt hochgeladene Dokument dar. Will man das global letzte Dokument erhalten, muss man auf dem Kindelement beide Felder summieren und dann im Elternelement zusammenziehen. So verschleiert man die Unterschiedlichkeit.

Ampeln

§ Ampel, welche sich unter einer Bedingung ausschaltet
Problem: Ein TrafficLight-Feld kann grün, gelb oder rot anzeigen. Eine Ampel kann jedoch auch ausgeschaltet sein und nichts anzeigen, wenn der zu interpretierende Wert "not evaluable" ist.
Voraussetzung: Ein Ampel Feld mit einer Bedingung, welche es erlaubt, dass die Ampel den 4ten Zustand erreicht.
Lösung:
  1. Ampel (Typ: TrafficLight)
  2. Feld für die Prüfung (Typ: Boolean)
    ? NOT (AND ( @Ampel[0] ; @Ampel[1] ; @Ampel[2] ))
Erklärungen: Die Ampel schaltet sich aus, sobald die Bedingung3 nicht erfüllt ist, da dadurch die komplette gelb Bedingung ungültig wird (Division durch 0)
§ Prüfen, ob eine Ampel den 4ten Zustand hat (=ausgeschaltet)
Problem: Ist eine Ampel ausgeschaltet, soll ein entsprechendes Boolean-Feld dies anzeigen und ggf. weitere Aktionen auslösen Lösung:
  1. Feld für die Ampel (Typ: TrafficLight)
    ? [ Bedingung1 ; Bedingung2 ]
  2. um folgende boolesche Aussage ergänzen. Ist die Bedingung nicht erfüllt, schaltet sich die Ampel aus
    ? [AND (Bedingung1 ; ( 1 / SUMIF (1 | Bedingung3)) = 1) ; Bedingung2]
Erklärungen: Das Ergebnis ist wahr, wenn der Zustand der Ampel nicht in der definierten Menge liegt - in diesem Fall ausgeschaltet.
§ Referenzierung von TrafficLight bzw. Ampel steuern abhängig von anderen Ampeln
Problem: Eine Ampel soll abhängig von den Zuständen der Kind-Ampeln schalten. Die Ampel soll gelb werden, wenn mehr als vier (Kind-)Ampeln rot sind. Mehr als sechs rote Ampeln ergeben eine rote Ampel auf dem Elternelement.
Voraussetzung: min. ein Ampel Feld auf den Kindelementen
Lösung:
  1. übergeordnete Ampel (Typ: TrafficLight)
    ? [COUNTTRUE (CHILDREN[1]) > 4 ; COUNTTRUE (CHILDREN[1] > 6]
Erklärungen:
  • CHILDREN[0] referenziert gelbe Ampeln, CHILDREN[1] rote Ampeln und CHILDREN[2] grüne Ampeln.
  • In diesem Beispiel müssen die Ampeln auf den Kindelementen ebenfalls "Status" heißen (also das gleiche Ampelfeld sein).
  • Soll mit verschiedenen Feldern gearbeitet werden, müssen diese einzeln in der COUNTTRUE Formel aufgeführt werden.
    Beispiel:
    COUNTTRUE ( CHILDREN@ampel1[1] ; CHILDREN@ampel2[1] ; usw.)
  • Kommen die Ampelfelder nicht auf allen Kindelementen vor, so muss mit der direkten Referenz gearbeitet werden:
    COUNTTRUE (@Kindname@ampel1[1] ; @Kindname@ampel1[1] ; usw.)
  • Soll der Zustand eines Ampelfeldes auf dem selben Formular abgefragt werden, ersetzt man CHILDREN durch den Referenznahmen (zB @ampel[1])

Listen

§ Prüfen, ob ein einzelnes Element in einer (ElementLinks-)Liste vorkommt
Problem: In einer Liste (Typ: ElementLinks) werden projektbeteiligte Personen aufgelistet. Nun soll auf dem Formular einer Person geprüft werden, ob diese Person auch in der Liste dabei ist.
Voraussetzung: Vorhandenes ElementLinks-Feld mit den Projektbeteiligten; ein Formular einer Person, auf dem die Prüfung durchgeführt werden soll
Lösung:
  1. Feld für die Projektbeteiligten (Typ: ElementLinks)
  2. Feld für die Prüfung (Typ: Boolean)
    ? @Projektbeteiligte >= LINKLIST (THIS)
Erklärungen: verschiedene Mengenvergleiche sind möglich:
  • >= Dieses oder mehr Elemente kommen in der Liste vor
  • > Es muss dieses und andere Elemente in der Liste vorkommen
  • = Nur dieses Element darf in der Liste vorkommen
§ Überprüfung ob ein Element in einer Liste auftaucht (indirekte Variante)
Problem: In einer Liste werden verschiedene Elemente aufgezählt. Es soll nun geprüft werden, ob ein bestimmtes Element in dieser Liste vorhanden ist
Voraussetzung: Eine Liste (Typ: ElementLinks)
Lösung:
  • Liste (Typ: ElementLinks)
  • Feld für das zu suchende Element (Typ: ElementLinks)
    = LINKLIST (THIS)
  • Überprüfung in separatem Feld (Typ: Boolean)
    ? COUNT(@Liste) - 1 = COUNT((@Liste - @Element))
  • Alternative Lösung:
    ? AND (COUNT (@Element) > 0 ; COUNT ((@Liste - @Element)) + 1 = COUNT (@Liste))
Erklärungen: (@Liste - @Element) liefert eine Liste ohne das gesuchte Element (sofern es vorhanden ist)
§ Elemente in einer Liste zählen
Problem: In einer Liste werden unter Erfüllung verschiedener Bedingungen (LINKLISTIF) Elemente referenziert. Die Anzahl der dort referenzierten Elemente soll nun ermittelt werden
Voraussetzung: Eine Liste mit verschiedenen Elementen
Lösung:
  1. Liste mit Elementen (Typ: ElementLinks)
  2. Anzahl der Elemente (Typ: Number)
    = COUNT (@Liste mit Elementen)
§ Einsortieren in eine Liste nach Auswahl, welche in einem Choice-Feld getroffen wurde
Problem: Eine Liste soll jeweils nur Einträge anzeigen, bei denen eine bestimmte Auswahl über ein Choice-Feld gesetzt wurde.
Voraussetzung: Ein vorhandenes Choice-Feld mit mindestens zwei Auswahlmöglichkeiten
Lösung:
  1. Zustand (Typ: Choice)
  2. Listenfeld mit Elementen (Typ: ElementLinks)
    = LINKLISTIF (CHILDREN | @Zustand = {flüssig}
§ Prüfen, ob in einem Choice-Feld ein bestimmter Eintrag gesetzt ist
Problem: Überprüfen, ob eine bestimmte Choice-Auswahl ausgewählt wurde.
Voraussetzung: Vorhandenes Choice-Feld mit X Auswahlmöglichkeiten
Lösung:
  1. Auswahl (Typ: Choice)
  2. Prüffeld (Typ: Boolean)
    ? @Auswahl[X]
    Alternative Lösung:
    ? @Auswahl={flüssig}
Erklärungen:
  • X muss hier durch eine Nummer der Choice-Auswahl ersetzt werden. Der Index beginnt mit 0. Beispiel: Choice-Feld mit 3 Antworten entspricht Choice[0], Choice[1] und Choice[2].
  • Alternativ kann auch der gesetzte Wert direkt referenziert werden. Hier ist allerdings wichtig, dass die exakte Schreibweise beachtet wird.

Weitere Beispiele

§ Ausgabe einer Summierung soll zwingend mit Einheit bzw. Währung ausgegeben werden
Problem: Bei den Kindelementen sollen Zahlenwerte eingegeben werden. Da ich den User nicht zwingen kann, korrekt in Euro zu reporten, soll wenigstens die Summe in Euro erscheinen.
Voraussetzung: Number-Feld
Lösung:
  1. Betrag in Euro (Typ: Number)
    = SUM ( CHILDREN@Number-Feld ) + 0 €
Erklärungen:
  • Durch das +0 € wird die Summe immer mit Euro dargestellt.
  • Anstelle des Euro-Zeichens können viele weitere SI-Einheiten verwendet werden.
§ Summenbildung nur von Werten, für die eine Bedingung zutrifft
Problem: Eine Summe soll nur von den Elementen gebildet werden, auf dessen Formular ein Boolean-Feld wahr ist.
Voraussetzung: Boolean-Feld
Lösung:
  1. Checkbox (Typ: Boolean)
  2. Wert (Typ: Number)
    = SUMIF (CHILDREN | @Checkbox)
§ Automatische Status-Wechsel anhand der Prozess-Struktur
Problem: In einer Prozesskette soll der Nachfolge-Prozess aktiv werden, sobald seine Vorgänger ihre Phase abgeschlossen haben.
Voraussetzung: Eine Prozesskette muss durch die Verwendung von Prev-/NextLinks definiert sein.
Der Nutzer muss seine Phasen jeweils von PLANNING auf ACTIVE setzen, wenn die Phase beginnt bzw. von ACTIVE auf CLOSED, wenn die Phase abgeschlossen wurde.
Lösung:
  1. verstecktes Feld auf jedem Formular für die Prüfung (Typ: Boolean)
    ? AND (COUNT (PREV) > 0; COUNTIF (PREV | STATE < CLOSED) = 0) : SETSTATE (ACTIVE |f;t)
Erklärungen: Die Formel ist fehlertolerant gegen den Fall, dass keine Vorgänger definiert sind. Außerdem wird der Wechsel zwischen ONHOLD und ACTIVE ignoriert.
§ Navigierbare Route bei Google-Maps mit Start-Ziel-Adresse
Problem: Aus zwei Adressen soll ein direkter Link zu Google Maps erzeugt werden, der einen Routen-Vorschlag anzeigt.
Voraussetzung: Zwei ausgefüllte String-Felder mit der jeweiligen Start- und Zieladresse.
Lösung:
  1. Start-Adresse (Typ: String)
  2. Ziel-Adresse (Typ: String)
  3. Routenplanung (Typ: ExternalLinks)
    = {http://maps.google.de/maps?saddr=} + @Start-Adresse + {&daddr=} + @Ziel-Adresse
§ Link zu XING-Suche
Problem: Auf einem Formular soll ein Link zur Verfügung gestellt werden, der das XING-Netzwerk automatisch nach einem vorgegebenen Namen durchsucht.
Voraussetzung: Ein ausgefülltes String-Feld mit dem Namen und ggf. ein weiteres String-Feld mit dem Ort.
Lösung:
  1. Name (Typ: String)
  2. Ort (Typ: String)
  3. XING-Suche (Typ: ExternalLinks)
    = {https://www.xing.com/publicsearch/query?utf8=%E2%9C%93&search[q]=} + @Name + {+} + @Ort + {&send=1}
Erklärungen: Als Ergebnis öffnet sich die XING-Suche mit den entsprechenden Daten.