Mit dem Ausdruck-Designer können Ausdrücke zusammengestellt werden, die während der Laufzeit dynamisch aufgelöst oder berechnet werden.
Dabei wird generell unterschieden, ob ActiveSkin einen Textausdruck erwartet, oder einen berechneten Ausdruck.
Bei einem Textausdruck werden die in dem Text in der Schreibweise ${Variablenname} enthaltenen Variablen aufgelöst und in den restlichen Text eingesetzt. Der daraus entstehende Gesamttext wird als Ergebnis des Ausdrucks verwendet.
Wird im unteren Teil der Maske der Schalter "Berechneter Ausdruck" eingeschaltet, wird der Ausdruck als eine Folge von Rechenoperationen interpretiert. (Siehe "Berechnete Ausdrücke" unten). Da sich das Ergebnis für ActiveSkin aber weiter um einen Text handelt, können weitere Optionen zur Darstellung des Textes gewählt werden. Es kann also eingestellt werden, ob Tausender-Trennpunkte erzeugt werden sollen und wieviele Nachkommastellen ausgegeben werden.
In Ausdrücken können Referenzen auf Felder erfolgen. Diese Referenzen beziehen sich je nach dem aktuellem Kontext endweder auf ein Objekt (Datenbankobjekt), oder auf eine Maske. Eine Referenz wird begonnen mit ${ und beendet mit }. Eine Referenz auf das Kundenstammfeld m_klimit wäre also ${m_klimit}.
Ist ein Datenbankobjektbezug hergestellt, so können hier auch Relationen genutzt werden. Dadurch ist es dann auch möglich Metadaten zu nutzen!
Verwenden Sie die Schaltfläche "Datenfeld" um ein Datenfeld aus dem aktuellen Datenobjekt auszuwählen.
In berechneten Ausdrücken können Operatoren und Funktionen benutzt werden. Folgende Operatoren stehen zur Verfügung:
Addition oder Text aneinander hängen.
Subtraktion
Multiplikation
Division
Ermittelt den Prozentsatz eines Ausdrucks "Prozentwert % Grundwert"
Beispiel: 10 % 200
Zu lesen als: 10 in Prozent von 200
Ergebnis: 5
Klammer auf
Klammer zu
Rundet den vor dem Operator angegebenen Ausdruck auf die nach dem Operator angegebene Anzahl Nachkommastellen.
Beispiel: 2/3 # 4
Ergebnis: 0.6667
Vergleichsoperatoren.
Bool-Operator und.
Bool-Operator und.
Erstellt eine Werteliste, z. B. zur Übergabe mehrerer Werte an eine Funktion.
Ruft eine Funktion auf, und übergibt die angegebenen Parameter.
Wird in einem berechneten Ausdruck ohne Klammerung gearbeitet, ergibt sich die Reihenfolge der Berechnung durch die Wertigkeit der Operatoten. Höherwertige Operatoren werden zuerst aufgelöst (Punktrechnung vor Strichrechnung), gleichwertige Operatoren von links nach rechts.
Die Wertigkeit der Operatoren entnehmen Sie der nachfolgenden Tabelle:
( ) |
Funktionsaufruf |
% |
* / |
+ - |
< <= > >= == != |
&& |
|| |
; |
Die Liste der möglichen Funktionen finden sie als Unterpunkte dieses Hilfepunktes.
Die Interpretation von null-Werten als Parameter an Funktionen obliegt der Funktion selbst.
Numerische Funktionen liefern dabei im allgemeinen als Ergebnis null, sofern einer der übergebenen Parameter null ist.
Konstanten können als Zahlen oder als Texte definiert werden. Geben Sie innerhalb einer Zahl das Komma durch "," oder "." an. Tausender Trennpunkte durch nicht geschrieben werden.
Für andere Datentypen stehen Parse-Funktionen zur Verfügung, die aus einem Text z. B. ein Datum oder eine Zeitspanne machen können.
123 == Die Zahl 123
123.45 == Die Zahl 123,45
123,45 == Die Zahl 123,45
'123' == Der Text '123'
Folgende figurative Konstante stehen zur Verfügung:
Bool-Wert "Wahr"
Bool-Wert "Unwahr"
Aktuelle Objekt
Null-Zeiger
NULL- und Leerwerte in Operatoren
Diverse Operatoren wie +, -, * usw. betrachten NULL als numerische 0.
Sollte die gesamte Bedingung eines ifelse NULL liefern, so wird auch NULL zurück gegeben.
Beim Vergleich auf Gleichheit (== und !=) steht die leere Zeichenkette '' für den Defaultwert des anderen Wertes. Hintergrund: Die Oberfläche zeigt Defaultwerte - die Zahl 0, ein leeres Datum, eine leere Zeitspanne - als leeres Feld an.
${Datumsfeld} == '' ist also wahr, solange das Datumsfeld leer ist, und ${Zahlfeld} == '' ist wahr, solange die Zahl 0 ist.
Ebenfalls bei == und != gilt die Zahl 0 als leeres Datum bzw. als leere Zeitspanne, denn die Oberfläche stellt ein leeres Datums- oder Zeitfeld auch als 0 dar: ${Datumsfeld} == 0 ist wahr, solange das Datumsfeld leer ist.
Beides gilt nur, wenn '' bzw. 0 unmittelbar im Ausdruck stehen. Stammt der Vergleichswert aus einem Feld, einer Funktion oder einer Rechnung, wird ohne Sonderbehandlung verglichen: ${Datumsfeld} == ${Textfeld} ist auch dann nicht wahr, wenn beide Felder leer sind.
Bei <, <=, > und >= gilt das alles nicht: Dort ist der Vergleich einer Zahl oder eines Datums mit einer Zeichenkette - auch mit '' - nicht zulässig, ebenso der Vergleich eines Datums oder einer Zeitspanne mit einer Zahl. Solche Vergleiche liefern kein Ergebnis, sondern einen Fehler.
Sollte für einen der in einem Ausdruck genutzten Werte kein Leserecht vorhanden sein (der Wert ist also unsichtbar), so werden Ergebnisse von Funktionen und Operatoren die diesen Wert nutzen auch unsichtbar.
Berechnete Ausdrücke verwenden generell die gleichen Datentypen, die auch intern in CSharp und .NET Programmen verwendet werden.
Einfach Datentype sind:
Ganzahl im Bereich 2147483647 bis -2147483648
Dezimalzahl im Bereich 79228162514264337593543950335 bis -79228162514264337593543950335
Dezimalzahlen sind für kaufmännische Berechnungen geeignet, da sie mit Nachkommastellen arbeiten, und ansolut präzise sind.
Zeichenketten beliebiger länge.
Datum oder Zeitpunkt. Jahr, Monat, Tag, Stunde, Minute, Sekunde und Tausenstel-Sekunde.
Zeitspanne. Anzahl Tage, Stunden, Minuten, Sekunden, Tausenstel-Sekunden.
Darüber hinaus werden auch alle SOG ERP (VACOS)-Datenobjekte u.ä. als eigene Datentypen geführt.
Kommentare in berechneten Ausdrücken
Kommentare innerhalb von berechneten Ausdrücken müssen mit der Zeichenfolge "{//" beginnen und mit "//}" beendet werden.
Beispiel:
1 + 2 - {// hier steht ein Kommentar //} 3
Verweis auf eine externe Datei
An Stelle eines Ausdrucks, kann auch ein Verweis auf eine externe Datei geschrieben werden, aus der der Ausdruck dann gelesen wird.
Beispiel:
include ${PROJ}\scr\Expression.Basis\BspAufgabenPrio.sogexpr
Der Ausdruck wird dabei aus der angegebenen Datei gelesen.
Es kann nur entweder eine include-Anweisung oder ein Ausdruck angegeben werden.
Eine Verschachtelung von include-Anweisungen ist nicht möglich.
Erweiterung durch eigene Funktionen
Das System der berechneten Ausdrücke kann über Scripting beliebig um eigene Funktionen erweitert werden.
Funktionen werden dabei in den Konfigurationsdateien ObjectExpression_vorort.xml, ObjectExpression_proj.xml und ObjectExpression_base.xml gesucht.
In diesen Konfigurationsdateien wird über das Attribut "DynObject" auf ein dynamisches Objekt verwiesen.
Beispiel für einen Konfigurationseintrag:
<Function Name="Script.Add" Text="Addiert 2 Dezimal-Zahlen" DynObject="Script.Script.ScriptFunktionen" Template="Zahl1 ; Zahl2"/>
Programmierte Quelle:
using System;
using SOG.Base.Exceptions;
using SOG.Base.ObjectExpression;
using SOG.ERP.Entity;
namespace Script
{
public class ScriptFunktionen : SOGObjectExpressionHandlerFunctionContainer
{
protected static SOGERPDatabase Dbs => SOGERPDatabase.Current;
/// <summary>
///
/// </summary>
public ScriptFunktionen(string dummy)
: base(null)
{
}
public override object GetValue(SOGObjectExpressionHandler parent)
{
switch (FktNameDef)
{
case "Script.Add":
{
// Sicherstellen, dass 1 Parameter vorhanden ist
EnsurePara(2);
decimal d1 = Convert.ToDecimal(GetObject(parent, 0));
decimal d2 = Convert.ToDecimal(GetObject(parent, 1));
return d1 + d2;
}
default:
throw new SOGException(Aph.FormatLog("Funktion {0} nicht bekannt!", FktNameDef));
}
}
}
}