Ausdrücke
Ausdrücke arbeiten mit folgenden Datentypen:
- „Boolean“ (analog VB/VBA wird False durch 0 und True durch -1 repräsentiert, andere Werte werden als True ausgewertet)
- „Int32“
- „Decimal“
- „Date“
- „DateTime“
- „Time“
- „String“
Der Datentyp „Int16“ ist ebenfalls erlaubt, wird allerdings vor Berechnungen automatisch in „Int32“ konvertiert.
Datentypen werden bei Bedarf wie folgt konvertiert (recht restriktiv, um Fehler auszuschließen):
- „Boolean“ wird
- automatisch in „Int32“ bzw. „Decimal“ konvertiert (False wird zu 0, True wird zu -1)
- nicht in „Date“ konvertiert
- nicht in „DateTime“ konvertiert
- nicht in „String“ konvertiert
- „Int32“ wird
- automatisch in „Boolean“ konvertiert (0 wird zu False, alle anderen Werte werden zu True)
- automatisch in „Decimal“ konvertiert
- nicht in „Date“ konvertiert
- nicht in „DateTime“ konvertiert
- nicht in „String“ konvertiert
- „Decimal“ wird
- automatisch in „Boolean“ konvertiert (0 wird zu False, alle anderen Werte werden zu True)
- automatisch in „Int32“ gerundet
- nicht in „Date“ konvertiert
- nicht in „DateTime“ konvertiert
- nicht in „String“ konvertiert
- „Date“ wird
- automatisch in „DateTime“ konvertiert
- nicht in „Boolean“ konvertiert
- nicht in „Int32“ konvertiert
- nicht in „Decimal“ konvertiert
- nicht in „String“ konvertiert
- „DateTime“ wird
- automatisch in „Date“ konvertiert, wenn die Uhrzeit „00:00:00“ ist
- nicht in „Boolean“ konvertiert
- nicht in „Int32“ konvertiert
- nicht in „Decimal“ konvertiert
- nicht in „String“ konvertiert
- „String“ wird nicht automatisch konvertiert
Ergebnisse werden wiederum entsprechend dem Ziel konvertiert, wobei anstelle von „Int32“-Konvertierungen bei Bedarf auch „Int16“-Konvertierungen vorgenommen werden.
Ausdrücke enthalten einen berechenbaren Ausdruck, der aus folgenden Elementen bestehen kann:
- Feldreferenzen zum Referenzieren von Werten in den aktuell geladenen Daten (siehe Kapitel Feldreferenzen)
- numerische Werte, bestehend aus Ziffern, optionalem Plus- oder Minus-Vorzeichen und optionalem Punkt als Dezimalzeichen
- numerische Operatoren:
- „+“, „-“, „*“ und „/“
- „\“ (ganzzahlige Division)
- „%“ (Modulo)
- MOD (ganzzahliger Modulo)
- „^“ (Potenz)
- Klammern („(“ und „)“)
- Vergleichsoperatoren („<“, „>“, „<=“, „>=“, „=“ und „<>“; diese liefern als Ergebnis False und True)
- logische Operatoren („NOT“, „AND“, „OR“ und „XOR“)
- soweit bei „NOT“ der Operand vom Typ „Boolean“
bei „AND“, „OR“ und „XOR“ beide Operanden vom Typ „Boolean“ sind,
liefern die Operatoren als Ergebnis False oder True - ansonsten wird bei „NOT“ der Operand nach entsprechender „Integer“-Konvertierung bitweise negiert
werden bei „AND“, „OR“ und „XOR“ die Operanden nach „Integer“-Konvertierung bitweise verknüpft
(Ergebnis ist immer vom Typ „Integer") - bei "AND", "OR" und "XOR" werden immer beide Seiten des Operators ausgewertet
- soweit bei „NOT“ der Operand vom Typ „Boolean“
- Strings, eingeschlossen in Anführungszeichen ( “ )
- String-Verkettung mit „&“
- Datums-Konstanten im ISO-Format („yyyy-mm-dd“ bzw. „yyyy-mm-ddThh:mm:ss“) in Abgrenzungszeichen ( „#“ )
- Beispiel: „#2014-12-24#“ bzw. „#2014-12-24T18:45:00#“
- Zeit-Konstanten analog zu Datums-Konstanten („Thh:mm:ss“) in Abgrenzungszeichen ( „#“ )
- Beispiel: „#T18:45:00#“
- Konstanten:
- False und True (entsprechen 0 und -1)
- CRLF (Zeilenumbruch für Texte)
- numerische Funktionen:
- „ABS(parameter)“ (Betrag)
- „ACOS(parameter)“ (Arcus Cosinus)
- „ASIN(parameter)“ (Arcus Sinus)
- „ATAN(parameter)“ und „ATN“ (Arcus Tangens)
- „ATN2(parameter1,parameter2)“ Winkel im Bogenmaß (Radiant) zwischen der positiven X-Achse und dem Strahl vom Ursprung zum Punkt (x, y))
- Parameter 1: Wert x des Punktes
- Parameter 2: Wert y des Punktes
- „CEILING(parameter)“ (kleinste Ganzzahl, die größer oder gleich dem übergebenen Ausdruck ist)
- „COS(parameter)“ (Cosinus)
- „COT(parameter)“ (Cotangens)
- „DEGREES(parameter)“ (Umwandlung Winkel im Bogenmaß in Gradmaß)
- „EXP(parameter)“ (e-Funktion)
- „FIX(parameter)“ (ganzzahliger Anteil)
- „FLOOR(parameter)“ (größte ganze Zahl, die kleiner oder gleich dem übergebenen Ausdruck ist)
- „IIF(parameter1,parameter2,paramter3)“ (in Abhängigkeit von Parameter 1 wird Parameter 2 (bei True) oder Parameter 3 (bei False) zurückgegeben)
- „INT(parameter)“ (identisch zu „FLOOR“)
- „LOG(parameter)“ (natürlicher Logarithmus)
- „LOG10(parameter)“ (Logarithmus zur Basis 10)
- „PI()“ (Konstante Pi; Funktion ohne Parameter)
- „POWER(parameter1,parameter2)“ (Potenzfunktion; identisch zu <parameter1>^<parameter2>)
- „RADIANS(parameter)“ (Umwandlung Winkel im Gradmaß in Bogenmaß)
- „ROUND(parameter1,parameter2)“ bzw. „ROUND(parameter1,parameter2,parameter3)“ (Runden eines numerischen Ausdrucks gemäß IEEE-754-Standard; d.h. wenn die Ziffer an der ersten wegfallenden Dezimalstelle lediglich eine 5 oder eine 5, auf die nur Nullen folgen, ist, wird derart gerundet, dass die letzte beizubehaltende Ziffer gerade wird)
- Parameter 1: zu rundender Wert
- Parameter 2: Anzahl der gewünschten Nachkommastellen (negative Werte runden auf der linken Seite des Kommas)
- Parameter 3 (optional): Angabe, ob gerundet (0; Standard) oder gekürzt (alle anderen Werte) werden soll
- ROUNDC(parameter1,parameter2)“ (Kaufmännisches Runden eines numerischen Ausdrucks gemäß DIN 1333; d.h. wenn die Ziffer an der ersten wegfallenden Dezimalstelle eine 0, 1, 2, 3 oder 4, dann wird abgerundet und bei 5, 6, 7, 8 oder 9, dann wird aufgerundet.
- Parameter 1: zu rundender Wert
- Parameter 2: Anzahl der gewünschten Nachkommastellen (negative Werte runden auf der linken Seite des Kommas)
- „SGN(parameter)“ (Vorzeichenfunktion; 1 bei positiven Werte, -1 bei negativen Werten und 0 bei Null)
- „SIGN(parameter)“ (identisch zu „SGN“)
- „SIN(parameter)“ (Sinus)
- „SQR(parameter)“ (Quadratwurzel)
- „SQRT(parameter)“ (identisch zu „SQR“)
- „SQUARE(parameter)“ (Quadratfunktion)
- „TAN(parameter)“ („Tangens“)
- Datum-Zeit-Funktionen:
- „DATEADD(parameter1,parameter2,parameter3)“ (Addition von Zeiteinheiten auf einen Datum-Zeit-Wert)
- Parameter 1: Einheit (String)
- „year“ oder „yyyy“ oder „yy“ für Jahr
- „quarter“ oder „qq“ oder „q“ für Quartal
- „month“ oder „mm“ oder „m“ für Monat
- „day“ oder „dd“ oder „d“ für Tag
- „week“ oder „wk“ oder „ww“ für Woche
- „hour“ oder „hh“ für Stunde
- „minute“ oder „mi“ oder „n“ für Minute
- „second“ oder „ss“ oder „s“ für Sekunde
- Parameter 2: Anzahl (Int32)
- Parameter 3: Datum (Date)
- Parameter 1: Einheit (String)
- „DATEDIFF(parameter1,parameter2,parameter3)“ (Differenz zwischen zwei Datum-Zeit-Werten)
- Parameter 1: Einheit (String) analog „DATEADD“
- Parameter 2: Startwert
- Parameter 3: Endwert
- „DATESERIAL(parameter1,parameter2,parameter3)“ („Date“ aus Integer-Werten erzeugen)
- Parameter 1: Jahr
- Parameter 2: Monat
- Parameter 3: Tag
- „DAY(parameter)“ (Tag des Datum-Zeit-Wertes)
- „GETDATE()“ (aktuelles Systemdatum ohne Uhrzeit)
- „GETDATETIME()“ (aktuelles Systemdatum mit Uhrzeit)
- „MONTH(parameter)“ (Monat des Datum-Zeit-Wertes)
- „TIMESERIAL(parameter1,parameter2,parameter3)“ („Time“ aus Integer-Werten erzeugen)
- Parameter 1: Stunden
- Parameter 2: Minuten
- Parameter 3: Sekunden
- „YEAR(parameter)“ (Jahr des Datum-Zeit-Wertes)
- „DATEADD(parameter1,parameter2,parameter3)“ (Addition von Zeiteinheiten auf einen Datum-Zeit-Wert)
- String-Funktionen:
- „LEFT(parameter1,parameter2)“ (linker Teil eines Strings mit Angabe der gewünschten Zeichenanzahl)
- Parameter 1: String
- Parameter 2: gewünschte Zeichenzahl
- „LEN(parameter)“ (String-Länge)
- „LOWER(parameter)“ (Konvertierung des Strings in Klein-Buchstaben)
- „LTRIM(parameter)“ (Abschneiden von Leerzeichen auf der linken Seite)
- „REPLACE(parameter1,parameter2,parameter3)“ (Ersetzen einer Zeichenfolge durch eine andere)
- Parameter 1: String
- Parameter 2: gesuchte und zu ersetzende Zeichenfolge
- Parameter 3: Zeichenfolge, durch die die Zeichenfolge in Parameter 2 ersetzt werden soll
- „RIGHT(parameter1,parameter2)“ (rechter Teil eines Strings mit Angabe der gewünschten Zeichenanzahl)
- Parameter 1: String
- Parameter 2: gewünschte Zeichenzahl
- "ISREGEXMATCH(parameter1,paramater2)" (Prüfung, ob Parameter 1 dem regulären Ausdruck in Parameter 2 entspricht; Ergebnis ist True bzw. False;
- „LEFT(parameter1,parameter2)“ (linker Teil eines Strings mit Angabe der gewünschten Zeichenanzahl)
Hinweise:
Funktionalität gleicht der der .NET-Funktion "Regex.IsMatch", siehe auch https://msdn.microsoft.com/de-de/library/sdx2bds0(v=vs.110).aspx)
Es wird der ECMAScript-Standard unterstützt, siehe https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-options , Abschnitt "ECMAScript Matching Behavior"
- Verwendete Tools zur Erstellung eines RegEx-Musters sollten entsprechend konfiguriert werden. z.B. auf https://regex101.com/ "FLAVOR" = "ECMAScript (JavaScript)" verwenden
- „RTRIM(parameter)“ (Abschneiden von Leerzeichen auf der rechten Seite)
- „SUBSTRING(parameter1,parameter2,parameter3)“ (Teil eines Strings)
- Parameter 1: String
- Parameter 2: Start (Int32)
- Parameter 3: Länge (Int32)
- „ToDecimal(parameter)“ (Gibt die in einer Zeichenfolge enthaltene Zahl als numerischen Wert mit Decimal-Datentyp zurück. Ergibt das Ergebnis keine Zahl, wird 0 ermittelt. Es können keine Laufzeitfehler auftreten.)
- "ToString(parameter)" (Darstellung von Werten in Frontend-Texten mit den aktuellen Kultureinstellungen für Dezimaltrennzeichen, Datumsformat, etc.; keine Server-seitige Verwendung (Laufzeitfehler))
- Numerische Werte werden angelehnt an den numerischen Formatbezeichner ("N") des .NET-Frameworks formatiert (siehe auch https://docs.microsoft.com/de-de/dotnet/standard/base-types/standard-numeric-format-strings#the-numeric-n-format-specifier). Das Format wird per Doppelpunkt von der Zahl separiert und als großes "N" angegeben. Die Angabe ist optional.
Dabei gilt:- Bei negativen Zahlen wird ein Minuszeichen ("-") vorangestellt.
- Es wird ein Tausendertrennzeichen verwendet.
- Dezimalstellen werden mit einem Dezimaltrennzeichen separiert.
- Die Anzahl der Nachkommastellen wird nachfolgend zum "N" angegeben. Bei fehlender Angabe wird 2 angenommen.
- Datumswerte müssen im ISO Format "yyyy-mm-dd" angegeben werden.
- Ist der Wert bereits ein String, bleibt er unverändert.
- Boolean-Werte sind nicht erlaub.
- Beispiele (bei Client mit deutscher Kultur):
ToString(1234.56) -> Ergebnis: 1.234,56
ToString(1234.56:N4) -> Ergebnis: 1.234,5600
ToString(2021-10-09) -> Ergebnis: 09.10.2021
- Numerische Werte werden angelehnt an den numerischen Formatbezeichner ("N") des .NET-Frameworks formatiert (siehe auch https://docs.microsoft.com/de-de/dotnet/standard/base-types/standard-numeric-format-strings#the-numeric-n-format-specifier). Das Format wird per Doppelpunkt von der Zahl separiert und als großes "N" angegeben. Die Angabe ist optional.
- „TRIM(parameter)“ (Abschneiden von Leerzeichen auf der beiden Seiten)
- „UPPER(parameter)“ (Konvertierung des Strings in Groß-Buchstaben)
- Ergänzende Funktionen
- "GetDirectory(parameter)" (Ermittlung von bestimmten lokalen Verzeichnissen)
- Steht nur auf dem Client zur Verfügung. Auf dem AppServer wird ein Fehler ausgelöst.
- Die Rückgabe erfolgt immer ohne Backslash am Ende.
- Die folgenden Parameter sind gültig, alle anderen führen zu einem Fehler (Groß-/Kleinschreibung spielt keine Rolle):
- "Temp" => z.B. "C:\Users\<Benutzername>\AppData\Local\Temp"
- "InstallDir" => z.B. "C:\Program Files (x86)\Sage\Sage 100\9.0"
- "UserDocuments" => z.B. "C:\Users\<Benutzername>\Documents"
- "GetFileExtension(parameter)" (Dateinamenerweiterung eines Dateinamens ermitteln ("pdf", "xml", etc.))
- "GetFollowUpParams(parameter1, parameter2)" (Erstellung eines Parameterstrings für eine Datensatzwiedervorlage)
- Parameter 1: Vollständiger Name des Daten-Edit-Elements, das bei Ausführung der Wiedervorlage angezeigt werden soll
- Parameter 2: Schlüsselinformationen des Datensatzes, für den die Wiedervorlage erzeugt werden soll; mehrere Schlüsselelemente (z.B. Artikelnummer und Ausprägungs-ID) werden durch „#*#“ (ohne Anführungszeichen) getrennt (z.B. "12345678#*#43")
- "IsLegacyClient()" prüft, ob es sich beim Client um den Access-Client handelt (True) Ansonsten handelt es sich um den neuen Client (False).
- "GetDirectory(parameter)" (Ermittlung von bestimmten lokalen Verzeichnissen)
Ergänzende Funktionen mit eingeschränktem Einsatzbereich:
Funktion | Erläuterung | Daten-Edit-Element | Multi-Daten-Edit-Element | Selektions-Element | Listen-Element und Baum-Element | Datenklassen-Feld | Weitere Einsatzzwecke |
GetActiveNavigationPartName() | Gibt in Daten-Edit-Elementen mit Navigationselement den Namen des gerade aktiven Navigations-Elements zurück. Gibt es kein Navigations-Element oder ist es kein Daten-Edit-Element, wird stattdessen ein Leerstring zurück gegeben. | ||||||
GetDataRefValue(feldreferenz, spaltenname) | Gibt den Wert der angegebenen Spalte einer Datenreferenz eines Felds bzw. der Auswahl eines Listen-Sub-Elementes zurück. | ||||||
GetDropFormat() Ab Version 9.0.3 | Ruft im "OnDrop"-Ereignis den Formatnamen der Drag&Drop-Aktion ab. Mögliche Formate analog zum Attribut "DropFormats" des Elementes. | ||||||
GetDropValue() | Ruft im "OnDrop"-Ereignis den Inhalt der Drag&Drop-Aktion ab. Bei den Drop-Formaten "FileDrop", "FileDrop-Multi", "EMail" und "EMail-Multi" (siehe Attribut "DropFormats") sind dies ein oder mehrere Datei-Pfadnamen (dann mit Semikolon getrennt). Die Datei-Pfad-Namen sind in Anführungsstriche eingeschlossen. | ||||||
GetKeyFieldValue(schlüsselfeldnummer) | Liefert den Wert eines Schlüsselfeldes. Diese Funktion wird verwendet, wenn kein anderer Datenkontext vorhanden ist und deshalb Feldreferenzen nicht aufgelöst werden können:
| Datenstruktur: Ereignisse "BeforeDelete" und "AfterDelete" | |||||
GetMatchcodeFieldValue(schlüsselfeldnummer) | Liefert den Wert eines Matchcode-Feldes einer Datenklasse. Diese Funktion wird verwendet, wenn kein anderer Datenkontext vorhanden ist und deshalb Feldreferenzen nicht aufgelöst werden können:
| ||||||
ExistsVariable(dialogvariable) (Ab Version 9.0.2) | Prüft die Existenz einer lokalen Makro-Variable (beginnend mit einem Unterstrich) oder die Existenz einer Dialog-Variable (beginnend mit zwei Unterstrichen).
Zum Setzen eines Feldes auf "leer", steht der Makro-Befehl "FestlegenFeldLeer" zur Verfügung. | ||||||
IsEmpty(feldreferenz) | Enthält das referenzierte Feld einen leeren String ("") bzw. keinen Wert (Null oder Nothing in .Net Sprachen)?
| ||||||
IsEnabled(feldreferenz) | Ist das referenzierte Feld aktiv (enabled)?
Das komplementäre Makro-Kommando ist "FestlegenFeldAktiv". | ||||||
IsFromField() | Ist das aktuelle Feld das Von-Feld eines Von-Bis-Feldes (Metadaten-Eigenschaft „IsFromTo“)?
Szenario:
| ||||||
IsReadOnly(feldreferenz) | Ist das referenzierte Feld schreibgeschützt?
Das komplementäre Makro-Kommando ist "FestlegenNurLesen". | ||||||
IsRecordInsert() | Ist das laufende Makro wegen „Datensatz einfügen“ aufgerufen worden?
Nur gültig im „BeforeUpdate“-Ereignis eines Datensatzes bzw. einer Datenstruktur. Das Ereignis tritt sowohl bei „Insert“, als auch bei „Update“ auf. | ||||||
IsRunningOnServer() | Wird das laufende Makro auf dem Server ausgeführt?
Szenario:
| ||||||
IsToField() | Analog zu „IsFromField“ für das Bis-Feld. | ||||||
IsVisible(feldreferenz) | Ist das referenzierte Feld sichtbar?
Das komplementäre Makro-Kommando ist "FestlegenFeldSichtbar". | ||||||
ItemCount(feldreferenz) | Gibt die Anzahl der Positionen zurück, wenn <feldreferenz> ein Multi-Data-Edit-Element adressiert, sonst ungültig (Laufzeitfehler). | ||||||
MyFieldnameInParent() | Gibt den Feldnamen zurück, unter dem das aktuelle Element im übergeordneten Element geführt wird. Szenario:
| ||||||
Pagename() | Gibt den Namen der aktuellen Seite eines Selektions-Elementes zurück, der als Assistenten-Dialog eingesetzt wird. | ||||||
PartGuid() | Gibt im Selektions-Element den Konfigurations-Schlüssel des aufrufenden Dialogs zurück. Sonderfall: Erfolgt der Aufruf aus einem Master-Detail Element, wird der Konfigurations-Schlüssel des Master-Elementes zurückgegeben, falls ein Master vorhanden ist. Szenario:
Siehe auch Platzhalter "$[PartGuid]" für SQL und Funktions-Parameter. Dieser gibt die gleiche ID zurück. | ||||||
IsMultiSelect(feldreferenz) | Liegt eine Mehrfachauswahl vor (anstatt Von-Bis-Werten)? Nur für Von-Bis-Felder (siehe Metadaten-Eigenschaften "IsFromTo" und "AllowMultiselect" der Datenstruktur).
| ||||||
IsMultiSelectField() | Gibt zurück, ob die Mehrfachauswahl-Suche eines Von-Bis Feldes ausgeführt wird (anstelle der Suche aus Von- bzw. Bis-Feld).
Nur für Von-Bis-Felder (siehe Metadaten-Attribute "IsFromTo" und "AllowMultiselect" der Datenstruktur). Anders als "IsMultiSelect([Feldreferenz])" wird "IsMultiSelectField()" nur im "BeforeSearch"- und im "AfterSearch"-Makro eines Von-Bis Feldes ausgewertet, d.h. in anderen Feldern bzw. Makros wird immer False zurückgegeben. Das Ergebnis wird unabhängig vom Feldinhalt ermittelt, d.h. auch wenn das Feld noch keinen Semikolon-separierten Wert enthält (z.B. bei erster Ausführung des "BeforeSearch"- bzw. "AfterSearch"-Makros) kann mit "IsMultiSelectField()" ermittelt werden, ob die Mehrfachauswahl-Suche ausgeführt wird. | ||||||
|
Ein explizites Zuweisungszeichen („=“) ist nicht vorgesehen.
Werden in komplexen Ausdrücken mehrere Operatoren verwendet, so wird die Reihenfolge der Auswertung durch den Rang der Operatoren gemäß der folgenden Liste festgelegt. Die unären Operatoren der ersten Zeile sind die am stärksten bindenden Operatoren:
- unäre Operatoren „+“ und „-“ (Vorzeichen)
- „^“ (Potenz)
- „*“, „/“, „\“ (ganzzahlige Division), „%“ (Modulo), „MOD“ (ganzzahliger Modul)
- „+“, „-“, String-Verkettung („&“)
- Vergleichsoperatoren („=“, „<“, „>“, „<=“, „>=“, „<>“)
- logischer Operator „NOT“
- logischer Operator „AND“
- logischer Operator „OR“
- logischer Operator „XOR“
Bei gleichem Rang erfolgt die Auswertung von links nach rechts. Die Rangfolge wird durch Klammerung überschrieben.
Ausdrücke können Platzhalter enthalten, die beim Download vom Server ersetzt werden. Hierdurch können z.B. Lizenzinformationen und Landabfragen genutzt werden.
Alle Werte in den Ausdrücken werden kulturunabhängig verarbeitet.
- Abgerufene Feldwerte (über in eckigen Klammern angegebene Feldnamen) erzeugen eine kulturunabhängige Textdarstellung).
- Konstante Werte müssen in kulturunabhängiger Formatierung angegeben werden.
Beispiele für kulturunabhängige Formatierungen:
- Datumswerte werden im ISO-Format ("JJJJ-MM-TT") ohne Zeit formatiert.
- Beispiel: Der "27.05.2020" wird dargestellt als "2020-05-27".
- Nummerische Werte haben als Dezimaltrennzeichen den Punkt.