SOG-Helpcenter Logo SOG Business - Software

Ausdruck Designer


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.

#berechneteausdruecke

Textausdrücke


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.

Referenzen auf Felder


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.

Berechnete Ausdrücke


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.

funktion( Parameter ; ... )

Ruft eine Funktion auf, und übergibt die angegebenen Parameter.

Wertigkeit der Operatoren


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

 %

 * /

 + -

 # 

 < <= > >= == !=

&&

||

;

Funktionen


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.

Konstante


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'

Figurative Konstante


Folgende figurative Konstante stehen zur Verfügung:

 

true

Bool-Wert "Wahr"

false

Bool-Wert "Unwahr"

this

Aktuelle Objekt

null

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.

 

Unsichtbare Werte

 

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.

 

Verwendete Datentypen


Berechnete Ausdrücke verwenden generell die gleichen Datentypen, die auch intern in CSharp und .NET Programmen verwendet werden.
Einfach Datentype sind:

 

int

Ganzahl im Bereich 2147483647 bis -2147483648

decimal

Dezimalzahl im Bereich 79228162514264337593543950335 bis -79228162514264337593543950335
Dezimalzahlen sind für kaufmännische Berechnungen geeignet, da sie mit Nachkommastellen arbeiten, und ansolut präzise sind.

string

Zeichenketten beliebiger länge.

DateTime

Datum oder Zeitpunkt. Jahr, Monat, Tag, Stunde, Minute, Sekunde und Tausenstel-Sekunde.

TimeSpan

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));

            }

        }

    }

}