Die Formelsprache

Mit Formeln können eine Regeln und Aktionen bis hin zu komplexen Geschäftsprozessen in den Datenblättern verankert werden.

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. Referenz des Datumsfelds
  2. Datumsformat als Text in eckigen Klammern (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. Referenz des Zahlenfelds
  2. Zahlenformat in eckigen Klammern
    = {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.

Choice

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.

E-Mails

Story: Wann wurde die letzte E-Mail zu einem Supportfall verschickt?
Anwendung:
  1. Für jeden Supportfall existiert ein Formular, auf dem ein Feld "E-Mails" (Typ: EmailFiles) angelegt ist. Dort sind alle verschickten E-Mails abgelegt.
  2. Datum, an dem die letzte E-Mail verschickt wurde (Typ: Date)
    = MAX ( @E-Mails[date] )
Aus EmailFiles können folgende Werte ausgelesen werden:
  • sender: Liste der Absender; Strings
  • receiver: Liste der Empfänger, Strings
  • cc: Liste der Empfänger in Kopie, Strings
  • subject: Liste der Betreffs, Strings
  • date: Liste der Sendezeitpunkte; Datumswerte
  • priority: Liste der Prioritäten; Strings
  • filesize: Liste der Dateigrößen; Zahlen, Einheit byte

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.

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 )

Rechenfunktionen

COUNT

Funktionsweise: Zählt die Elemente der referenzierten Listen. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNT ( <listFormula> )
  • = COUNT ( <evaluation> ; <listFormula> )
Beispiele:
  • = COUNT ( @MeineListe )
  • = COUNT ( @Signaturfeld )
  • = COUNT ( STRICT ; @MeineListe )

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 ( <listFormula> | <condition> )
Beispiele:
  • = COUNTIF ( @MeineListe | @Auftrag freigegeben )
  • = COUNTIF ( @MeineListe | @Angelegt am < TODAY )

COUNTTRUE

Funktionsweise: Zählt die Anzahl der wahren Bedingungen. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNTTRUE ( <booleanEntry1> ; <booleanEntry2> ; ... )
  • = COUNTTRUE ( <evaluation> ; <booleanEntry1> ; <booleanEntry2> ; ... )
Beispiele:
  • = COUNTTRUE ( CHILDREN@Boolean )
  • = COUNTTRUE ( STRICT ; 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

JOIN

Funktionsweise: Verkettet Texte und fügt zwischen jeden Text den angegebenen Trenner ein.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = JOIN ( <entry1> ; <entry2> ; ... | <separator> )
Beispiele:
  • = JOIN ( CHILDREN@E-Mail | , )
  • = JOIN ( @Aufträge@Auftrag1@Titel ; @Aufträge@Auftrag2@Titel | {, } )
Anmerkungen:
  • Bei den Referenzen dürfen keine Typen gemischt werden.

MAX, MIN

Funktionsweise: Gibt das Extremum von referenzierten Feldern zurück: MAX den Maximalwert und MIN den Minimalwert. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = MAX ( <entry1> ; <entry2> ; ... )
  • = MAX ( <evaluation> ; <entry1> ; <entry2> ; ... )
Beispiele:
  • = MAX ( CHILDREN@Starttermin )
  • = MIN ( STRICT ; @Aufträge@Auftrag1@Umsatz ; @Aufträge@Auftrag2@Umsatz )

MAXIF, MINIF

Funktionsweise: Gibt das Extremum von referenzierten Feldern zurück, wenn die Bedingung wahr ist. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt. 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> )
  • = MAXIF ( <evaluation> ; <entry1> ; <entry2> ; ... | <condition> )
Beispiele:
  • = MAXIF ( CHILDREN@Sterttermin | @Auftragfreigegeben )
  • = MINIF ( STRICT ; CHILDREN@Umsatz | YEAR ( @Starttermin ) = 2015year )

MOD

Funktionsweise: MOD berechnet den Rest einer Division zweier Zahlen.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = <number1> MOD <number2>
Mögliche Ergebnisse:
  • 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: Rückgabewert: Syntax:
  • = ROUND ( <numberEntry> | <decimal_place> )

SMA

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

SUBSET

Funktionsweise: Gibt eine Untermenge der ursprünglichen Liste zurück.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = SUBSET ( <list> | <begin_index> ; <end_index> )
Beispiele:
  • = SUBSET ( @Projekte | 0 ; 2 )
  • = SUBSET ( @Projekte | -3 ; -1 )
Anmerkungen:
  • Indizes beginnen bei 0.
  • Der End-Index wird in die Liste mit aufgenommen
  • Positive Indizes bezeichnen eine Position relativ zum Anfang der Liste, negative Indizes eine Position relativ zum Ende der Liste. (0;2) referenziert die ersten drei Einträge der List, (-3;-1) die letzten drei.

SUBSTRING

Funktionsweise: Ermittelt einen Teilstring.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = SUBSTRING ( <entry> | <begin_index> ; <end_index> )
Beispiele:
  • = SUBSTRING ( @Dateiname | 0 ; 3 )
  • = SUBSTRING ( @Dateiname | -3 ; 0 )
Anmerkungen:
  • Indizes beginnen bei 0.
  • Der End-Index wird nicht in den Teilstring mit aufgenommen
  • Positive Indizes bezeichnen eine Position relativ zum Anfang des String, negative Indizes eine Position relativ zum Ende des Strings. (0;3) referenziert die ersten drei Zeichen des Strings, (-3;0) die letzten drei.
  • Wird MultipleChoice direkt in SUBSTRING verwendet, wird die Liste in einen String umgewandelt, d.h. sind die Optionen 1,2,3 und es ist die erste und dritte Option ausgewählt, wird aus der Liste der String "[1, 3]" und SUBSTRING(0,2) also die ersten zwei Zeichen entspricht "[1"

SUM

Funktionsweise: Summenbildung vom Inhalt der referenzierten Felder. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = SUM ( <entry1> ; <entry2> ; ... )
  • = SUM ( <evaluation> ; <entry1> ; <entry2> ; ... )
  • = SUM ( <referenceList> )
  • = SUM ( <evaluation> ; <referenceList> )
Beispiele:
  • = SUM ( CHILDREN@Umsatz )
  • = SUM ( @UmsatzNetto ; @Steuer )

SUMIF

Funktionsweise: Summenbildung vom Inhalt der referenzierten Felder, wenn die Bedingung wahr ist. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt. 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 (abhängig vom referenzierten Feld): Syntax:
  • = SUMIF ( <entry1> ; <entry2> ; ... | <condition> )
  • = SUMIF ( <evaluation> ; <entry1> ; <entry2> ; ... | <condition> )
  • = SUMIF ( <referenceList> | <condition> )
  • = SUMIF ( <evaluation> ; <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. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? AND ( <booleanEntry1> ; <booleanEntry2> ; ... )
  • ? AND ( <evaluation> ; <booleanEntry1> ; <booleanEntry2> ; ... )
  • ? AND ( <referenceList> )
  • ? AND ( <evaluation> ; <referenceList> )
Beispiele:
  • ? AND ( @Auftrag freigegeben ; @Umsatz > 0 )

CONTAINS

Funktionsweise: Überprüft, ob der angegebene Text in einem referenzierten Feld enthalten ist.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? CONTAINS ( <entry> | <text> )
Beispiele:
  • ? CONTAINS ( @Name | Müller )

HAS_FILELOCKS

Funktionsweise: Mit der Funktion HAS_FILELOCKS kann überprüft werden, ob in irgendeinem FileLinks-Feld dieses Elements eine Datei gesperrt ist.
Rückgabewert: Syntax:
  • ? HAS_FILELOCKS

HAS_VALUE

Funktionsweise: Mit der Funktion HAS_VALUE kann überprüft werden, ob ein Formularfeld einen gültigen Wert enthält.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? HAS_VALUE ( <entry> )
  • ? HAS_VALUE ( <entry> | STRICT )
Beispiele:
  • ? HAS_VALUE ( @EndeDatum )
Anmerkung:
  • Wenn in einem Feld eine Formel hinterlegt ist und das Ergebnis leer ist, gibt HAS_VALUE normalerweise true zurück, im strict-Mode hingegen false.

IF

Funktionsweise: Wenn die Bedingung wahr ist, gilt der erste Wert, ansonsten der zweite. 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 IF-Formel ist, muss vor das referenzierte Feld ein THIS vorangestellt werden.
Erlaubte Referenzen: Rückgabewert (abhängig vom referenzierten Feld): Syntax:
  • = IF ( <entry> | <condition> )
  • = IF ( <evaluation> | <condition> )
  • = IF ( <entry1> ; <entry2> | <condition> )
  • = IF ( <evaluation> ; <entry> | <condition> )
Beispiele:
  • = IF ( (@netto * 1.07) ; (@netto * 1.19) | @reduzierte MwSt)

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. Nicht auswertbare Einträge der Parameterliste werden hierbei nicht beachtet, es sei denn die Auswertung wird durch den ersten Eintrag der Liste auf STRICT gesetzt.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • ? OR ( <booleanEntry1> ; <booleanEntry2> ; ... )
  • ? OR ( <evaluation> ; <booleanEntry1> ; <booleanEntry2> ; ... )
  • ? OR ( <referenceList> )
  • ? OR ( <evaluation> ; <referenceList> )
Beispiele:
  • ? OR ( @Auftrag freigegeben ; @EndeDatum < TODAY )

Verknüpfungen

ACCOUNTGROUPS

Funktionsweise: Listet auf dem Login-Element eines Accounts die Login-Elemente aller Account-Gruppen auf, deren Mitglied dieser Account ist.
Rückgabewert: Syntax:
  • = ACCOUNTGROUPS

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 )

GROUPMEMBERS

Funktionsweise: Listet auf dem Login-Element einer Account-Gruppe die Login-Elemente aller Gruppenmitglieder auf.
Rückgabewert: Syntax:
  • = GROUPMEMBERS
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 )
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: 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: Rückgabewert: Syntax:
  • = HOUR ( <dateEntry> )
  • = HOUR ( <dateEntry> - <dateEntry2> )
  • = HOUR ( <numberEntry> )
Mögliche Ergebnisse:
  • HOUR ( 1 day ) = 24 h
  • HOUR ( 691200000 ms ) = 192 h

MINUTE

Funktionsweise: Extrahiert aus dem referenzierten Datum die Minuten bzw. rechnet eine Zeitspanne in die Anzahl an Minuten um. Da ein Datum in Scope immer auf Mitternacht normiert wird, ergibt MINUTE bei einem Datum immer 0.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = MINUTE ( <dateEntry> )
  • = MINUTE ( <dateEntry> - <dateEntry2> )
  • = MINUTE ( <numberEntry> )
Mögliche Ergebnisse:
  • MINUTE ( 1 day ) = 1.440 min
  • MINUTE ( 691200000 ms ) = 11.520 min

MONTH

Funktionsweise: Extrahiert aus dem referenzierten Datum den Monat bzw. rechnet eine Zeitspanne in die Anzahl an Monaten um.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = MONTH ( <dateEntry> )
  • = MONTH ( <dateEntry> - <dateEntry2> )
  • = MONTH ( <numberEntry> )
Mögliche Ergebnisse:
  • MONTH ( 13.11.2014 ) = 11 month
  • MONTH ( 13.11.2014 - 5.09.2014 ) = 2 month
  • MONTH ( 5961600000 ms ) = 2 month

NOW

Funktionsweise: Repräsentiert immer Datum und Uhrzeit der Formelauswertung. Alle Formeln, die NOW enthalten werden neu ausgewertet, sooft der Scheduler Job UpdateIntradayClockChangeDependencies gestartet wird.
Rückgabewert: Syntax:
  • = NOW
  • = NOW + 1 minute
Mögliche Datumseinheiten zur Verrechnung sind: second, minute, hour, day, week, month, year (immer im Singular!).

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)
    • Date-Feld
    • Datum in ISO-Format (yyyy-mm-dd) als Freitext
    • Millisekunden seit Unix Epoch als Freitext
  • period (Intervall)
    • Number-Feld
    • Zahl mit Zeit-Einheit (day, workday, week, month, year)
Rückgabewert: Syntax:
  • = PERIODIC ( <base_date> | <period> )
Beispiele:
  • = PERIODIC ( @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 ( {2015-01-07} | 5 day ) = 17.01.2015
  • PERIODIC ( {2015-01-08} | 5 day ) = 13.01.2015
  • PERIODIC ( {2015-01-13} | 5 day ) = 13.01.2015
  • PERIODIC ( {2015-01-05} | 1 week ) = 19.01.2015
  • PERIODIC ( {2015-01-08} | 1 week ) = 15.01.2015
  • PERIODIC ( {2015-01-02} | 2 month ) = 02.03.2015
  • PERIODIC ( {2014-12-31} | 2 month ) = 28.02.2015
  • PERIODIC ( {2014-12-31} | 1 year ) = 31.12.2015
  • PERIODIC ( {2012-02-29} | 1 year ) = 28.02.2015

SECOND

Funktionsweise: Extrahiert aus dem referenzierten Datum die Sekunden bzw. rechnet eine Zeitspanne in die Anzahl an Sekunden um. Da ein Datum in Scope immer auf Mitternacht normiert wird, ergibt SECOND bei einem Datum immer 0.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = SECOND ( <dateEntry> )
  • = SECOND ( <dateEntry> - <dateEntry2> )
  • = SECOND ( <numberEntry> )
Mögliche Ergebnisse:
  • SECOND ( 1 day ) = 86.400 s
  • SECOND ( 691200000 ms ) = 691.200 s

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: 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

CALENDAR

Funktionsweise: Die CALENDAR-Formel kann in einem ViewButton verwendet werden, um dem Anwender den Aufruf eines Kalenders zu erleichtern.
Erlaubte Referenzen:
  • calendar (Name eines Kalenders)
  • condition
    • Vergleiche der Art <Referenz> <Vergleichsoperator> <Wert>
    • Boolesche Funktionen wie AND, OR und NOT mit beliebig vielen Vergleichen
  • Referenz
    • Feld-Referenz
    • NAME (Elementname)
    • STATE (Elementstatus)
    • STAGE (Layout-/Schrittname)
  • Wert
    • Freitext
    • Feldreferenz (Feld vom Element-Typ des Kalenders)
    • Feldreferenz mit THIS (Feld auf dem Datenblatt des ViewButton; darf nur auf der rechten Seite des Vergleichs verwendet werden)
    • absolute Feldreferenz
Aktion:
  • Ein (gefilterter) Kalender wird geöffnet.
Syntax:
  • = CALENDAR ( <calendar> )
  • = CALENDAR ( <calendar> | <condition> )
Beispiele:
  • = CALENDAR ( @Aufgaben )
  • = CALENDAR ( @Aufgaben | @Mitarbeiter = {Max Mustermann} )
Anmerkung:
  • Die im Filter referenzierten Datenfelder müssen sich auf dem Datenblatttyp des Kalenders befinden, allerdings nicht zwingend auf einem Layout sichtbar sein oder in der Kalenderdefinition verwendet sein.

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 (entfällt 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. Schließlich lässt sich der Status der erstellten Elemente festlegen und der Kopierumfang, der angibt, ob ein einzelnes Datenblatt oder eine ganze Struktur kopiert werden soll.
Erlaubte Referenzen:
  • sources (zu kopierendes Element; mehrfache Einträge möglich)
    • 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 (optional; Datenblatt, das zur Bearbeitung angeboten wird; dieses Datenblatt muss in der Struktur unterhalb von source liegen)
    • Aspekt
    • Knoten
  • value_element (optional; Datenblatt, von dem die Anwender-Eingaben übernommen werden; Felder mit Formeln, Action-Buttons und Signature-Felder werden dabei ignoriert)
    • Objekt
    • Prozess
    • Knoten
  • connectionTargets (wenn beim CopyButton das Anlegen von Beziehungen aktiviert ist und die Strategie auf selected steht, kann der Anwender aus dieser Liste eine Menge an Zielen auswählen; für jedes Ziel wird eine Kopie angelegt und mit diesem Ziel verbunden)
    • Objekt
    • Prozess
    • Aspekt
    • Knoten
    • Beim Kopieren eines Objekts oder Prozesses, wird diese Referenz leer gelassen.
  • state (Status der kopierten Elemente)
    • IMAGINARY
    • 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 ( <sources> ) ; LINKLIST ( <targets> ) ; LINKLIST ( <input_element> ) ; LINKLIST ( <value_element> ) ; LINKLIST ( <connectionTargets> ) | <state> ; <range> )
Beispiele:
  • = COPY ( LINKLIST ( @Aufträge@template Auftrag ) ; LINKLIST ( @Aufträge ) | ACTIVE ; SINGLE )
Anmerkung:

KANBAN

Funktionsweise: Die KANBAN-Formel kann in einem ViewButton verwendet werden, um dem Anwender den Aufruf einer Kanban-Tafel zu erleichtern. Sie beinhaltet die zu öffnende Kanban-Tafel und optional eine Filterung, nach der die Kanbankarten gefiltert werden soll.
Erlaubte Referenzen:
  • kanbanBoard (Name einer Kanban-Tafel)
  • condition
    • Vergleiche der Art <Referenz> <Vergleichsoperator> <Wert>
    • Boolesche Funktionen wie AND, OR und NOT mit beliebig vielen Vergleichen
  • Referenz
    • Feld-Referenz
    • NAME (Elementname)
    • STATE (Elementstatus)
    • STAGE (Layout-/Schrittname)
  • Wert
    • Freitext
    • Feldreferenz (Feld vom Element-Typ der Kanban-Tafel)
    • Feldreferenz mit THIS (Feld auf dem Datenblatt des ViewButton; darf nur auf der rechten Seite des Vergleichs verwendet werden)
    • absolute Feldreferenz
Aktion:
  • Eine (gefilterte) Kanban-Tafel wird geöffnet.
Syntax:
  • = KANBAN ( <kanbanBoard> )
  • = KANBAN ( <kanbanBoard> | <condition> )
Beispiele:
  • = KANBAN ( @Auftragsübersicht )
  • = KANBAN ( @Aufgaben | @Mitarbeiter = {Max Mustermann} )

PORTFOLIO

heißt jetzt TABLEVIEW

TABLEVIEW

Funktionsweise: Die TABLEVIEW-Formel definiert die Logik hinter einem ViewButton. Sie beinhaltet die zu öffnende Tabellenansicht und optional eine Filterung, nach der die Tabellenzeilen eingeschränkt werden soll.
Erlaubte Referenzen:
  • tableView (Name einer angelegten Tabellenansicht)
  • condition
    • Vergleiche der Art <Referenz> <Vergleichsoperator> <Wert>
    • Boolesche Funktionen wie AND, OR und NOT mit beliebig vielen Vergleichen
  • Referenz
    • Feld-Referenz
    • NAME (Elementname)
    • STATE (Elementstatus)
    • STAGE (Layout-/Schrittname)
    • USERHOME (Home-Knoten des Anwenders, der den Button drückt)
  • Wert
    • Freitext
    • Feldreferenz (Feld vom Element-Typ der Tabellensicht)
    • Feldreferenz mit THIS (Feld auf dem Datenblatt des ViewButton; darf nur auf der rechten Seite des Vergleichs verwendet werden)
    • absolute Feldreferenz
Aktion:
  • Eine (gefilterte) Tabellenansicht wird geöffnet.
Syntax:
  • = TABLEVIEW ( <tableView> )
  • = TABLEVIEW ( <tableView> | <condition> )
Beispiele:
  • = TABLEVIEW ( @Auftragsübersicht )
  • = TABLEVIEW ( @Auftragsübersicht | @Ansprechpartner = THIS@Ansprechpartner )
  • = TABLEVIEW ( @Auftragsübersicht | @Auftragsdatum < TODAY )
  • = TABLEVIEW ( @Auftragsübersicht | AND ( NOT ( STATE = ONHOLD ) ; NAME = {Produkt 1001} ; OR ( STAGE <> {Final} ; @entry = 4 ) ) )
Anmerkung:
  • Die im Filter referenzierten Datenfelder müssen sich auf dem Datenblatttyp der Tabellenansicht befinden, allerdings nicht zwingend als Spalten in der Tabelle angelegt sein.

TASKVIEW

Funktionsweise: Die TASKVIEW-Formel definiert die Logik hinter einem ViewButton. Sie beinhaltet die zu öffnende Aufgabenansicht und optional eine Filterung, nach der die Tabellenzeilen eingeschränkt werden soll.
Erlaubte Referenzen:
  • taskView (Name einer angelegten Tabellenansicht)
  • condition
    • Vergleiche der Art <Referenz> <Vergleichsoperator> <Wert>
    • Boolesche Funktionen wie AND, OR und NOT mit beliebig vielen Vergleichen
  • Referenz
    • Feld-Referenz
    • NAME (Elementname)
    • STATE (Elementstatus)
    • STAGE (Layout-/Schrittname)
  • Wert
    • Freitext
    • Feldreferenz (Feld vom Element-Typ der Aufgabenasicht)
    • Feldreferenz mit THIS (Feld auf dem Datenblatt des ViewButton; darf nur auf der rechten Seite des Vergleichs verwendet werden)
    • absolute Feldreferenz
Aktion:
  • Eine (gefilterte) Aufgabenansicht wird geöffnet.
Syntax:
  • = TASKVIEW ( <taskView> )
  • = TASKVIEW ( <taskView> | <condition> )
Beispiele:
  • = TASKVIEW ( @Aufgaben )
  • = TASKVIEW ( @Aufgaben | @Ansprechpartner = THIS@Ansprechpartner )
  • = TASKVIEW ( @Aufgaben | @Auftragsdatum < TODAY )
  • = TASKVIEW ( @taskView | AND ( NOT ( STATE = ONHOLD ) ; NAME = {Produkt 1001} ; OR ( STAGE <> {Final} ; @entry = 4 ) ) )
Anmerkung:
  • Die im Filer referenzierten Datenfelder müssen sich auf dem Datenblatttyp der Aufgabenansicht befinden, allerdings nicht zwingend in der Konfiguration der Aufgabenansicht referenziert sein.

Wertfunktionen

ATTACHMENTS

Funktionsweise: Listet alle E-Mail-Anhänge auf, die in einem EmailFiles-Feld enthalten sind.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = ATTACHMENTS ( <emails> )

BARCODE

Funktionsweise: Erzeugt aus einem referenzierten Wert ein Bild mit einem 1D- oder 2D-Barcode.
Erlaubte Referenzen:
  • barcodeContentEntry
  • barcodeType
    • AZTEC
    • CODABAR
    • CODE_39
    • CODE_93
    • CODE_128
    • DATA_MATRIX
    • EAN_8
    • EAN_13
    • ITF
    • MAXICODE
    • PDF_417
    • QR_CODE
    • RSS_14
    • RSS_EXPANDED
    • UPC_A
    • UPC_E
    • UPC_EAN_EXTENSION
  • width (Breite des erzeugten Bilds in Pixeln)
  • height (Höhe des erzeugten Bilds in Pixeln)
Rückgabewert:
  • Image (Barcode als png-Datei)
Syntax:
  • = BARCODE ( <barcodeContentEntry> ; <barcodeType> ; <width> ; <height> )
Beispiele:
  • = BARCODE ( @Beschreibung ; QR_CODE ; 250 ; 250 )

COUNTER

Funktionsweise: Gibt die nächste Zahl aus dem benannten Nummerkreis zurück.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNTER ( <counterNameEntry> )
  • = COUNTER ( <counter_name> )
Beispiele:
  • = COUNTER ( AuftragsNr )
  • = COUNTER ( @angelegt von )

COUNTERIF

Funktionsweise: Gibt die nächste Zahl aus dem benannten Nummerkreis zurück, wenn die Bedingung wahr ist. Damit kann man das Setzen der ID verzögern, bis alle notwendigen Informationen vorliegen. Z.B. kann der Name des Nummerkreises durch Zusammenfügen von Textbausteinen erfolgen, die aber erst zu einem späteren Zeitpunkt vollständig sind. Das Zusammenfügen von Text funktioniert aber auch dann, wenn nicht alle Textteile einen Wert enthalten. So würde verfrüht der Nummernkreis bestimmt werden und mit dem unvollständigen Text einfach ein neuer Nummernkreis angelegt werden.
Erlaubte Referenzen: Rückgabewert: Syntax:
  • = COUNTERIF ( <counterNameEntry> | <condition> )
Beispiel:
  • = COUNTERIF ( @angelegt von | @validCounter )

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

ELEMENTID

Funktionsweise: Gibt die Id des aktuellen Elements als String zurück.
Rückgabewert: Syntax:
  • = ELEMENTID

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:
  • spreadsheetEntry
  • worksheet (Arbeitsmappe innerhalb der Excel-Datei)
  • cell (Zelle innerhalb der Arbeitsmappe, Beispiel: B12)
Rückgabewert (abhängig vom Format der Zelle): Syntax:
  • = EXCEL ( <spreadsheetEntry> ; <worksheet> ! <cell> )
Beispiele:
  • = EXCEL ( @Projektauftrag ; Tabelle1!E4 )

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 )
Anmerkungen:
  • Das Ergebnis wird immer in Byte ausgegeben. Soll es in einer anderen Einheit zurückgegeben werden (zum Beispiel megabyte), geht das über folgende Formel:

    = ( FILESIZE(@FileLinks) ) megabyte

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.

NUMBERTOWORDS

Funktionsweise: Gibt die Zahl in Worten zurück.
Erlaubte Referenzen:
  • entry
  • expression (mit Zahlenwert als Ergebnis)
  • locale (optional)
Rückgabewert: Syntax:
  • = NUMBERTOWORDS ( <entry> )
  • = NUMBERTOWORDS ( <entry>  | locale )
  • = NUMBERTOWORDS ( <expression> )
  • = NUMBERTOWORDS ( <expression>  | locale )

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)
  • connection_type (Name des Beziehungstyps; optional)
  • state (Status der referenzierten Elemente; optional)
    • IMAGINARY
    • PLANNING
    • ACTIVE
    • ONHOLD
    • CLOSED
  • entry (Name des referenzierten Feldes)
Rückgabewert (abhängig vom referenzierten Feld):
  • Inhalt des referenzierten Feldes
Syntax:
  • = OTHERASPECTS ( <aspect_type> ) <entry>
  • = OTHERASPECTS ( <aspect_type> ; <connection_type> ) <entry>
  • = OTHERASPECTS ( <aspect_type> ; <connection_type> | <state1> ; <state2> ; ... ) <entry>
Beispiele:
  • = SUM ( OTHERASPECTS ( @aufträge ) @Umsatz )
  • = SUM ( OTHERASPECTS ( @aufträge ; @kunde2auftrag ) @Umsatz )
  • = SUMIF (OTHERASPECTS ( @aufträge | ACTIVE ) @Umsatz | @Auftrag abgeschlossen )
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.

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 - Ausgangsdatenblatt
    • OUT - Zieldatenblatt
Rückgabewert:
  • String (Bezeichner des referenzierten Elements)
Syntax:
  • = PARENTNAME
  • = PARENTNAME ( <direction> )
    bei Connections

PREV/NEXT

Funktionsweise: Zugriff auf Vorgänger- oder Nachfolger-Elemente. Für die Nutzung muss ein Vorgänger oder Nachfolger auf dem Datenblatt definiert, d.h. ein PrevLinks oder NextLinks Feld manuell (via UserSelectedLinks) oder automatisch via Formelsprache befüllt worden sein. Da der Rückgabewert eine Menge beinhaltet muss eine Aggregationsfunktion (SUM, MAX, etc) in Kombination verwendet werden.
Rückgabewert:
  • Inhalt des referenzierten Feldes
Syntax:
  • = PREV<reference>
  • = NEXT<reference>
Beispiele:
  • = SUM (PREV@Resturlaub)
  • = SUM (NEXT@Forecast)

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

Systemaktionen können nur beim Formeltyp Bedingung verwendet werden. Diese wird immer mit einem ? eingeleitet.

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: 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.

CONNECT

Funktionsweise: Erstellt Beziehungen zwischen allen Start- und Zielelementen.
Erlaubte Referenzen:
  • sources (Startelemente), targets (Zielelemente) - mehrfache Einträge möglich
  • connection_type (Name des Beziehungstyps)
  • connection_right (Recht, das durch die Beziehung erlangt wird)
    • NONE = kein Recht
    • READ = Leserecht
    • WRITE = Schreibrecht
    • ADMIN = Administrationsrecht
  • strategy (Strategie für vorhandene Beziehungen)
    • KEEP_EXISTING = behalte alle vorhandenen Beziehungen (Default)
    • DELETE_EXISTING_AT_SOURCE = lösche alle Beziehungen dieses Beziehungstyps, die von den Startelementen ausgehen
    • DELETE_EXISTING_AT_TARGET = lösche alle Beziehungen dieses Beziehungstyps, die zu den Zielelementen führen
  • bool_from, bool_to, delay (siehe Aktionsbedingungen)
Syntax:
  • ? <condition> : CONNECT ( <sources> ; <targets> ; <connection_type> ; <connection_right> )
  • ? <condition> : CONNECT ( <sources> ; <targets> ; <connection_type> ; <connection_right> ; <strategy> )
  • ? <condition> : CONNECT ( <sources> ; <targets> ; <connection_type> ; <connection_right> | <bool_from> ; <bool_to> )
Beispiele:
  • ? @Projektkosten > 5000 : CONNECT ( @Teamleiter ; LINKLIST(THIS) ; @Projektcontrolling ; WRITE | f ; t )
Aktion:
  • Alle Quellelemente werden mit allen Zielelementen verbunden.

DISCONNECT

Funktionsweise: Entfernt Beziehungen eines bestimmten Typs.
Erlaubte Referenzen:
  • connection_type (Name des Beziehungstyps)
  • direction (IN, OUT)
  • bool_from, bool_to, delay (siehe Aktionsbedingungen)
Syntax:
  • ? <condition> : DISCONNECT ( <connection_type> ; <direction> )
  • ? <condition> : DISCONNECT ( <connection_type> ; <direction> | <bool_from> ; <bool_to> ; <delay> )
Beispiele:
  • ? @Projektkosten < 5000 : DISCONNECT ( @Teamleiter ; IN | f ; t ; 4m3s )
Aktion:
  • Wenn die Projektkosten unter 5000 fallen, werden alle Beziehungen des Typs Teamleiter, die zum aktuellen Element hinführen, nach 4 Minuten und 3 Sekunden archiviert.

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: 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.

FILESYNC_MS

Funktionsweise: Synchronisiert die Dateien eines FileLinks-Felds mit einem Ordner in Microsoft 365 SharePoint.
Erlaubte Referenzen:
  • condition
  • file_links
  • coupling
    • SYNC - neue Dateien werden zu SharePoint übertragen, entfernte Dateien werden gelöscht
    • PUSH - neue Dateien werden zu SharePoint übertragen
  • tenant - GUID des Kunden von Microsoft
  • client_id - GUID von Microsoft Azure für die Scope-Installation
  • client_secret - die Authentifizierung bei Microsoft erfolgt über die Client-ID und ein Client Secret ohne den Account des Anwenders
  • site - Id der site bei SharePoint; diese ist aus einer Domain und zwei GUIDs zusammengesetzt und kann über den Graph-Explorer von Microsoft ermittelt werden.
  • drive - Id der Document Library bei SharePoint, optional, wird keine Document Library angegeben, werden die Dateien in die Standard-Library geschrieben
  • parent - GUID oder vollständiger Pfad des Verzeichnisses in der Site bei SharePoint, optional, wird kein Parent angegeben, werden die Dateien in das Wurzelverzeichnis geschrieben
  • bool_from, bool_to, delay (siehe Aktionsbedingungen)
Syntax:
  • ? <condition> : FILESYNC_MS ( <file_links> ; <coupling> ; <tenant> ; <client_id> ; <client_secret> ; <site> ; <drive> )
  • ? <condition> : FILESYNC_MS ( <file_links> ; <coupling> ; <tenant> ; <client_id> ; <client_secret> ; <site> ; <drive> ; <parent> )
  • ? <condition> : FILESYNC_MS ( <file_links> ; <coupling> ; <tenant> ; <client_id> ; <client_secret> ; <site> ; <drive> ; <parent> | <bool_from> ; <bool_to> )
Beispiele:
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : FILESYNC_MS ( @Unterlagen ; SYNC ; {e238cc56-7fb1-923e-2a93-e289f2340df6} ; {d0a923fb-d6af-3496-a63c-0bc23488293d} ; {DCH3S~tHERFcbCV93N8wERyCVghpYEfc4fbgd} ; {rewoogmbh.sharepoint.com,e943d234-43f2-93a2-1f76-1d832cb23f4e,2d023be2-2ccf-92f1-8da4-83ce29ece4f2} ; {b!VtWQ2_loqUiPeR8yWER_XuSbYI1WEVJUjaQkzjns1fIVWXQ83SDcRLnCQI4wLc2o} ; {/Sonstige Unterlagen} | f ; t )
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : FILESYNC_MS ( @Unterlagen ; SYNC ; @TenantId ; @ClientId ; @ClientSecret ; @SiteId ; | f ; t )
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : FILESYNC_MS ( @Unterlagen ; SYNC ; @TenantId ; @ClientId ; @ClientSecret ; @SiteId ; @DriveId | f ; t )
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : FILESYNC_MS ( @Unterlagen ; SYNC ; @TenantId ; @ClientId ; @ClientSecret ; @SiteId ; ; {01QM4V6L5AN5BT73EUGRA35WOITFD5UXXF} | f ; t )
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : FILESYNC_MS ( @Unterlagen ; SYNC ; @TenantId ; @ClientId ; @ClientSecret ; @SiteId ; @DriveId ; @Parent | f ; t )
Aktion:
  • Die Dateien des FileLinks-Felds werden mit einem Ordner bei SharePoint synchronisiert.

FREEZE

Funktionsweise: Entfernt die Formeln aus den referenzierten Feldern und verhindert so weitere Änderungen an den Werten.
Erlaubte Referenzen: Syntax:
  • ? <condition> : FREEZE ( <entry1> ; <entry2> ; ... )
  • ? <condition> : FREEZE ( <entry1> ; <entry2> ; ... | <bool_from> ; <bool_to> )
Beispiele:
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : FREEZE ( @Inspektionstermin | f ; t )
Aktion:
  • Bei allen referenzierten Feldern werden die Formeln entfernt.

MESSAGE

Funktionsweise: Verschickt abhängig von einer Bedingung eine Nachricht an alle Benutzer, die mindestens Lese-Recht auf das Datenblatt besitzen.
Erlaubte Referenzen: 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> )
Beispiele:
  • ?( DAY ( @Inspektionstermin-TODAY ) < 11 ) : MESSAGE ( time ; {Inspektionstermin ist in 10 Tage} | f ; t )
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. Sollen in diesem Zusammenhang Elemente archiviert oder verworfen werden, sollte die unter Problemfälle hinterlegten Hinweise beachtet werden.
Erlaubte Referenzen: 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.

Aktionsbedingungen

Bei allen Systemaktionen kann nach der Pipe festgelegt werden, unter welchen Bedingungen diese Aktion ausgeführt wird.
  • bool_from (legt fest, welcher alte Wert zur Aktion führt; optional)
    • f oder false
    • t oder true
    • c oder create
    • schedule (wird jede Nacht ausgewertet und ausgeführt, sofern der Folgezustand übereinstimmt)
    • * = true, false, create, schedule
  • bool_to (legt fest, welcher neue Wert zur Aktion führt; optional)
    • f oder false
    • t oder true
    • * = true, false
  • delay (verzögert die Ausführung; optional)
    • s Sekunden
    • m Minuten
    • h Stunden
    • d Tage
    • w Wochen
    • M Monate
    • y Jahre
Syntax:
  • ? <condition> : ACTION ( ... | <bool_from> ; <bool_to> ; <delay> )
Beispiele:
  • ? @Auftrag abgeschlossen : SETSTATE ( CLOSED | f ; t ; 5h30m )
Aktion:
  • Wenn der Auftrag abgeschlossen ist (der Wert Feldes @Auftrag abgeschlossen ändert sich von falsch auf wahr) wird der Status nach 5 Stunden und 30 Minuten auf CLOSED gesetzt.

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: 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³, mL (Milliliter), L (Liter), gal (Galone), m³, km³
  • Dauer: ms, s, min, h, day, workday, week, month, year
  • Geschwindigkeit: m/s, km/h, mph (Meilen/Stunde), kn (Knoten), Mach
  • Beschleunigung: m/s², grav (Gravitation)
  • Kraft: N (Newton)
  • Leistung: W (Watt), hp (Pferdestärke)
  • Masse: g, lb (Pfund), kg
  • Energie: J (Joule)
  • Temperatur: K (Kelvin), °F (Fahrenheit), °R (Rankine)
  • Druck: bar, atm, Pa (Pascal)
  • Elektrizität: A (Ampere), V (Volt), F (Farad), Ω (Ohm), S (Siemens), C (Coulomb)
  • 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, US-Dollar, Yen und Britisches Pfund auch das jeweilige Währungszeichen) verwendet werden. Achtung: Unterschiedliche Währungen können nicht automatisch miteinander verrechnet werden.

Beispiele unterstützter Währungen:

  • EUR oder €
  • USD oder $
  • GBP oder £
  • CHF
  • JPY oder ¥

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³

Bestimmte Einheit erzwingen

Möchte man einen Wert mit Einheit in einer anderen Einheit anzeigen (beispielsweise in cm statt m), ist dies über folgende Wege in der Formelsprache zu erzwingen:

= @Feldname <einheit>

Bei der Verrechnung mehrerer Felder, die zu einer neuen Einheit führt (Das Beispiel hier setzt voraus, dass @Länge und @Breite Werte in Zentimetern haben, die durch die Multiplikation automatisch in cm² umgerechnet wird, per Formelsprache aber in ausgegeben werden soll):

= ( @Länge * @Breite ) m²

Bei Ergebnissen einer Formel gehört die Formel in Klammern, die Einheit nach die Klammer gesetzt:

= ( FILESIZE(@FileLinks) ) megabyte

Zu beachten ist, dass dies nur bei verrechenbaren Einheiten funktioniert.

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; es werden alle Unterelemente und über Beziehungen verbundenen Elemente mitkopiert
    = COPY ( SOURCE )
  2. Kopieren eines TLE mit initialem Bearbeiten des TLE Formulars; das kopierte Element wird in den angegebenen Status versetzt; der Kopierumfang wird durch RANGE vorgegeben
    = COPY ( SOURCE | STATE ; RANGE )
  3. Kopieren eines TLE mit initialem Bearbeiten des angegebenen Formulars; es werden alle Unterelemente und über Beziehungen verbundenen Elemente mitkopiert
    = COPY ( SOURCE ; ; DATASHEET )
  4. Kopieren eines TLE mit initialem Bearbeiten des TLE Formulars und Übernahme der vom Anwender eingegebenen Werte eines anderen TLE; es werden alle Unterelemente und über Beziehungen verbundenen Elemente mitkopiert
    = COPY ( SOURCE ; ; ; DATASHEET )
  5. Kopieren eines TLE mit initialem Bearbeiten des Formulars A und Übernahme der vom Anwender eingegebenen Werte des Formulars B; es werden alle Unterelemente und über Beziehungen verbundenen Elemente mitkopiert
    = COPY ( SOURCE ; ; DATASHEET A ; DATASHEET B )
  6. Kopieren eines TLE mit initialem Bearbeiten des angegebenen Formulars; das kopierte Element wird in den angegebenen Status versetzt; der Kopierumfang wird durch RANGE vorgegeben, darf aber nicht SINGLE sein, da das zu bearbeitende Formular Teil der Kopiermenge sein muss
    = COPY ( SOURCE ; ; DATASHEET | STATE ; RANGE )
  7. Kopieren eines Aspektformulars
    = COPY ( SOURCE ; TARGET )
  8. Kopieren eines Aspektformulars; das kopierte Element wird in den angegebenen Status versetzt; der Kopierumfang wird durch RANGE vorgegeben
    = COPY ( SOURCE ; TARGET | STATE ; RANGE )
  9. Kopieren eines Aspektformulars mit initialem Bearbeiten eines untergeordneten Formulars
    = COPY ( SOURCE ; TARGET ; DATASHEET )
  10. Kopieren eines Aspektformulars mit Übernahme der vom Anwender eingegebenen Werte eines anderen Formulars
    = COPY ( SOURCE ; TARGET ; ; DATASHEET )
  11. Kopieren eines Aspektformulars mit initialem Bearbeiten eines untergeordneten Formulars A und Übernahme der vom Anwender eingegebenen Werte des Formulars B
    = COPY ( SOURCE ; TARGET ; DATASHEET A ; DATASHEET B )
  12. Kopieren eines Aspektformulars mit initialem Bearbeiten des untergeordneten Formulars A; das kopierte Element wird in den angegebenen Status versetzt; der Kopierumfang wird durch RANGE vorgegeben, darf aber nicht SINGLE sein, da das zu bearbeitende Formular A Teil der Kopiermenge sein muss
    = COPY ( SOURCE ; TARGET ; DATASHEET A | 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.

Formel-Abhängigkeiten

Durch das Erstellen von Formeln wird in REWOO Scope intern ein Abhängigkeitsnetzwerk aufgebaut. Dieses beschreibt, welche Auswirkungen gewisse Aktionen auf andere Teile der modellierten Welt haben. Beispielsweise wird der Inhalt eines Feldes "Mehrwertsteuer" mit der Formel =(@Rechnungsbetrag / 100) * 19 nicht nur einmalig berechnet, auch alle zukünftigen Änderungen am Feld "Rechnungsbetrag" führen zu einer automatischen Neuauswertung des Feldes "Mehrwertsteuer". Dies wird durch eine Abhängigkeit vom Feld "Rechnungsbetrag" zum Feld "Mehrwertsteuer" ausgedrückt.

Abhängigkeitstypen

Der Abhängigkeitsgraph besteht aus Änderungs-Knoten der folgenden Typen, die sich direkt aus den Möglichkeiten der Formelsprache ergeben:

  • Wertänderung - Neuberechnung eines Feldwerts. Diese wird durch das manuelle Eintragen eines Werts oder durch "einfache" Feldreferenzen verursacht.
  • Statusänderung - Änderung eines Element-Status. Dieser kann über STATE- und SETSTATE-Ausdrücke in die Formelsprache einfließen.
  • Namensänderung - Der Elementname ändert sich. Dieses Ereignis kann z. B. über PARENTNAME in das Modell einfließen.
  • Uhrzeitänderung - Die aktuelle Uhrzeit oder das Datum haben sich geändert. Dies kann in der Formelsprache, z. B. über TODAY, abgefragt werden.
Hinweis

Für gewöhnlich ist es für den Modellierer nicht von Bedeutung, aus welchen konkreten Änderungs-Knoten der Abhängigkeitsgraph besteht. Es gibt jedoch einige Sonderfälle, bei denen ein gewisses Grundverständnis der Abhängigkeitsarten hilft, das Verhalten des Modells zu erklären. Auf diese wird nachfolgend eingegangen.

Regeln bei der Abarbeitung des Abhängigkeitsnetzwerks

Der Abhängigkeitsgraph wird topologisch sortiert abgearbeitet, d.h. es wird immer der Änderungsknoten als nächstes ausgewertet, der von keiner anderen Änderung mehr abhängig ist. Kommt es dabei zu einer Situation, dass zwei oder mehr Änderungsknoten von keiner anderen Änderung abhängig sind, ist die Auswertungsreihenfolge prinzipiell zufällig, Statusänderungen werden jedoch grundsätzlich bevorzugt behandelt.

Dies zeigt exemplarisch die folgende Abbildung, welche ein Datenblatt zusammen mit seinem Abhängigkeitsgraph bei Änderungen des Feldes "Schließen" zeigt. Beim Setzen des Boolean-Felds "Schließen" wird sowohl eine Statusänderung (durch die SETSTATE-Formel im Feld "Abschluss") als auch eine Wertänderung (durch die Datums-Formel im Feld "Abschlussdatum") verursacht. Durch die bereits erwähnte Präzedenz von Statusänderungen wird aber die SETSTATE-Formel zuerst ausgeführt. Eine Auswirkung auf die Berechnungsergebnisse hat die Regel in diesem Fall jedoch nicht. Dies ist erst im nächsten Beispiel der Fall.

Datenblatt mit Abhängigkeitsgraph
Problemfall: SETSTATE(ARCHIVED) / SETSTATE(REJECTED)

Sobald ein Element (oder einer seiner Väter) während einer Auswertung archiviert oder verworfen wird, werden keine weiteren Formeln auf dem Datenblatt mehr ausgewertet. Dies ist notwendig, da die Archivierung eines Elements möglichst den "aktuellen Zustand" des Datenblatts erhalten soll. Ohne Präzedenzregel würde dies im zuvor erläuterten Beispiel aber zu einem Problem führen, wenn die SETSTATE-Formel das Element archivieren würde, anstatt es zu schließen. Es wäre dann Zufall, ob das Feld "Abschlussdatum" ausgewertet und geschrieben werden würde oder nicht, je nachdem, ob zuerst die Wertänderung oder zuerst die Statusänderung durchgeführt werden würde. Die Präzedenzregel führt in diesem Fall zu einem klar vorhersagbaren Verhalten: Die Statusänderung wird der Wertänderung vorgezogen, das Abschlussdatum wird also nie gesetzt.

Die Präzedenzregel löst allerdings nicht alle Problemfälle auf. So ist es dem Modellierer immer noch möglich, die Statusänderung durch weitere Zwischenrechnungsschritte in der Auswertungsreihenfolge nach hinten zu schieben. Hiervon wird jedoch dringend abgeraten, da das Ergebnis des Auswertungslaufs dann nicht mehr vorhergesagt werden kann. Aus diesem Grund sollte die folgende Regel im Zusammenhang mit SETSTATE(ARCHIVED) und SETSTATE(REJECTED) beherzigt werden:

Wird per Formel ein Element in die Zustände ARCHIVED oder REJECTED versetzt, so sollten keine weiteren Formeln auf demselben Datenblatt direkt oder indirekt auf das Feld verweisen, welches die Statusänderung initial hervorruft. Andernfalls kann es zu unvorhersagbaren Ergebnissen bei der Auswertung der Formeln kommen.

Best Practice

Buttons

§ Filtern mit dem ViewButton 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: ViewButton)
    = 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: TrafficLight)
    ? [@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. 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: 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. Ampel (Typ: TrafficLight)
  2. Feld für die Prüfung (Typ: Boolean)
    ? NOT (AND ( @Ampel[0] ; @Ampel[1] ; @Ampel[2] ))
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 (z. B. @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.