An vielen Stellen innerhalb der Anwendungskonfiguration ist es möglich, Programmlogik zu hinterlegen. An allen diesen Stellen wird die Formelsprache verwendet. Diese basiert auf der „Criteria Language” von DevExpress.

Eine Erläuterung zur Syntax der Formelsprache ist hier zu finden: https://docs.devexpress.com/CoreLibraries/4928/devexpress-data-library/criteria-language-syntax

Wenn die Formelsprache in Ansichten oder Kalenderansichten verwendet wird, wird sie in genau eine Datenbankabfrage („SQL-Select”) umgewandelt und durch den Datenbankserver ausgeführt. An allen anderen Stellen wird sie innerhalb der Anwendung selbst ausgeführt. Dadurch ergeben sich einige grundsätzliche Unterschiede zwischen dem Ergebnis von Formeln in Ansichten oder Kalenderansichten sowie an allen anderen Stellen. In Ansichten kann es außerdem je nach Datenbankserver ebenfalls unterschiedliche Ergebnisse geben. Einige bekannte Unterschiede werden hier aufgeführt.
Werden Formel innerhalb der Anwendung ausgeführt, können diese zu mehreren Datenbankabfragen führen. Diese sind aus Gründen der Performance zu minimieren. Hinweise hierzu finden sich ebenfalls hier.

Formeln erlauben den Zugriff auf Datensätze, die sich im Papierkorb befinden. Über die Eigenschaft „IsInRecycleBin” kann ihr Lösch-Status abgefragt werden. Zum Löschen gibt es hier weitere zusammenhängende Informationen.

Innerhalb der Formelsprache kann auf Konfigurationselemente – speziell Datentabellen und Spalten aus Datentabellen – zugegriffen werden. Die korrekte Gross-Kleinschreibung ist hierbei wichtig.

Element Beispiel
Datentabelle
Ausgeliefert OrmCompany
Selbst erstellt OrmMyTableCustom
Datenspalten
Spalte [Name]
Angepasste Spalte [Custom_Location]
Gemeinsame Spalte [Common_Subject]
Relationsdefinitionen
Ausgeliefert [RelatedCreatedBy]
Selbst erstellt [RelatedCustom_MyRelationDef]

Für einige oft benötigte Aufgabenstellungen gibt es eine Reihe von BA Funktionen.

Beispielformeln

Allgemeine Beispiele

Formel Erklärung
AddHours(LocalDateTimeNow(), 4) In ein Feld das aktuelle Datum/Uhrzeit + 4h eintragen
Iif(!BAIsEqualEnumValue([Status], ‘Opportunity states’, ‘Offen’), [Subject] + ‘ ‘ + BATranslateEnum([Status]), [Subject]) In einem Feld: Betreff + (Status (Auswahlliste!)) wenn Status <> “Offen”, sonst nur Betreff
[ExpectedTurnover] * BAGetEnumValueDecimalField([Probability], ‘Opportunity probabilities’, ‘NumericValue’) In ein Feld Umsatz*Wahrscheinlichkeit (in%) eintragen.
BAIsEqualEnumValue([OrmType], ‘Data sources’, ‘Brief’) || (BAIsEqualEnumValue([OrmType], ‘Data sources’, ‘Serienbrief’) && BAIsEqualEnumValue([ActivityState], ‘Activity: States’, ‘Mass letter’)) Filter: Alle Briefe, inklusive der Serienbriefe, aber ohne die Statusdatensäze, für die es noch gar keinen Brief gib.
IsInstanceOfType(This, ‘OrmLetter’) || (IsInstanceOfType(This, ‘OrmMassLetterStatus’) && BAIsEqualEnumValue([ActivityState], ‘Activity: States’, ‘Mass letter’)) Filter: Alle Briefe, inklusive der Serienbriefe, aber ohne die Statusdatensäze, für die es noch gar keinen Brief gib. Alternative Lösung.
!BAIsEqualEnumValue([Status], ‘Follow-up status’, ‘Erledigt’) AND [EndDate] > AddYears(LocalDateTimeToday(), -1) AND [EndDate] < AddYears(LocalDateTimeToday(), 1) Filter: Alle offenen Wiedervorlagen für den Zeitraum Heute – 1 Jahr und Heute + 1 Jahr
BACurrentUser() = [CreatedBy] Filter: Alle Wiedervorlagen, die ich erstellt habe.
BAGetPrimarySource(’‘, ‘RelatedParents’, ‘Nearest’, ‘‘, BAGetPrimarySource(’‘, ‘RelatedResponsiblePerson’, ?, ?)) = BACurrentUser() Alle Wiedervorlagen, irgendwo in der Hierarchie zu Firmen, deren Betreuer ich bin.
[Subject] + ‘ (’ + BATranslateEnum([Status]) + ‘) ‘ + ToStr(GetDay(BAToCurrentTimeZone([Created]))) + ‘.’ + ToStr(GetMonth(BAToCurrentTimeZone([Created]))) + ‘.’ + ToStr(GetYear(BAToCurrentTimeZone([Created]))) Betreff + “(” + Auswahllistenwert + “)” + Erstelldatum (Ohne Zeit)
Iif(IsNull([EndDate]), AddHours(BAToCurrentTimeZone([Created]), 2), [EndDate]) Wenn Enddatum leer: Erstelldatum + 2h

Beispiele für Teildatensätze

Formel Erklärung
[Addresses][[SortOrder] = 0].Single([City]) Ausgabe der Datenspalte „City” des ersten Teildatensatzes.
[Addresses][[SortOrder] = 1].Single(BATranslateEnum([AddressType])) Ausgabe des Auswahllistenwertes in Benutzersprache aus der Datenspalte „AddressType” des zweiten Teildatensatzes.
[Addresses][BAIsEqualEnumValue([AddressType], ‘Address types’, ‘Hauptanschrift’)].Single([City]) Ausgabe der Datenspalte „City” aus dem Teildatensatz mit dem Adresstyp „Hauptanschrift”.
[Addresses][[AddressType] = {eb7852ef-9ba5-47f6-ab68-82fb891a2943}].Single([City]) Ausgabe der Datenspalte „City” aus dem Teildatensatz mit einem über GUID bestimmten Adresstyp.