Standardwert

Wertauflöser - Kurzfassung

Zweck: Definiert einen Fallback-Wert, der über die im Parameter Standardwert konfigurierten Wertauflöser genau dann ermittelt wird, wenn zur Laufzeit als Eingabewert "kein Wert" ($null)oder ein aufgrund der Parametrierung als gleichwertig betrachteter Wert vorliegt.

images/download/attachments/113286124/image2022-10-11_12-0-19-version-1-modificationdate-1665482420125-api-v2.png

Der Standardwert-Wertauflöser definiert einen Fallback-Wert, der über die im Parameter Standardwert konfigurierten Wertauflöser per Standard genau dann ermittelt wird, wenn zur Laufzeit als Eingabewert "kein Wert" ($null) oder ein aufgrund der Parametrierung als gleichwertig betrachteter Wert vorliegt. Für das Laufzeitverhalten sind folgende Fälle zu unterscheiden:

Eingabewert
zur Laufzeit

Option
"Auch bei leeren String"

Rückgabewert
zur Laufzeit

Verhalten

Kein Wert ($null)

unerheblich

Standardwert

Der Standardwert wird als Fallback-Wert bereitgestellt.

Ohne Konfiguration (Standard) wird "Kein Wert" ($null) zurückgegeben.

leerer String ("")

images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/check.svg ausgewählt

images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/error.svg nicht ausgewählt (Standard)

Eingabewert

Der Eingabewert wird bereitgestellt.

Wertauflöser für den Standardwert werden nicht ausgeführt.

Jeder andere Wert

unerheblich

WICHTIG◄ Eine leere Liste ([]) gilt nicht als gleichwertig mit "Kein Wert" ($null).

►HINWEIS◄ Besonders häufig wird der Standardwert-Wertauflöser per Verkettung nach einem anderen Wertauflöser eingesetzt, für dessen Rückgabewert er bei Bedarf den Fallback-Wert bereitstellen soll. Das ist allerdings nicht verpflichtend. Wie üblich gilt das Bezugsobjekt im Kontext als Eingabewert, wenn kein verketteter Vorgänger existiert. Der Standardwert-Wertauflöser kann bei Bedarf. auch verwendet werden, um ein "fehlendes" Bezugsobjekt (z. B. über den Erzeuge Instanz-Wertauflöser oder den Listenwert-Wertauflöser) zu generieren.

Konfiguration

Der Parameter Standardwert sieht optional die Konfiguration von einem oder mehreren verketteten Wertauflösern vor, die zur Laufzeit genau dann verarbeitet werden, wenn als Eingabewert "kein Wert" ($null) vorliegt.

  • Falls für den Parameter Standardwert keine Konfiguration vorliegt lautet der Rückgabewert "kein Wert" ($null) .
    HINWEIS◄ Mit $null als Fallback-Wert ist der Standardwert-Wertauflöser allerdings effektiv wirkungslos, sofern die Option Auch bei leerem String ausgewählt ist.

WICHTIG◄ Da eine Wertauflöser-Konfiguration für den Standardwert zur Laufzeit nur relevant ist, wenn "kein Wert" ($null) als Eingabewert vorliegt, beziehen sich für den Standardwert konfigurierte Wertauflöser im Kontext der Konfiguration auch nicht auf dessen Datentyp. Auch das im Kontext des Wertauflösers ggf. vorliegende Bezugsobjekt gilt nicht automatisch für im Parameter Standardwert konfigurierte Wertauflöser. Sofern der Standardwert ausgehend von einem Bezugsobjekt ermittelt werden soll, muss dieses explizit spezifiziert werden. Typischerweise kommt dazu ein Variable-Wertauflöser am Anfang der Wertauflöserkette zum Einsatz. Über die systemseitig automatisch befüllte Variable entity kann so auch das Bezugsobjekt aus dem Kontext des Wertauflösers adressiert werden.

Die Option Auch bei leerem String ist per Standard abgewählt.

Wird die Option (s. Bild rechts) ausgewählt, dann kommt der ggf. konfigurierte Standardwert auch dann zum Tragen, wenn als Eingabewert ein leerer String vorliegt.

Im Beispiel rechts würde ein leer String im Eingabewert durch "Kein Wert" ($null) ersetzt, weil kein Standardwert konfiguriert ist.

images/download/attachments/113286124/image2022-10-11_16-42-28-version-1-modificationdate-1665499348582-api-v2.png

HINWEIS◄ Sofern für den Standardwert mindestens ein Wertauflöser konfiguriert ist, übersteuert dessen Datentyp den ggf. abweichenden Datentyp des Eingabewerts im Kontext der Konfiguration. Konkret bedeutet dies z. B., dass die Konfiguration "nachfolgender" Wertauflöser (z. B. per Verkettung) immer den Standardwert als Rückgabewert "unterstellt".

Das folgende sehr einfache Beispiel illustriert den Effekt:

Im Kontext eines nicht näher bestimmten Textattributs greift der Parameter Objekt Resolver in einer Ausführen mit-Ereignisaktion auf dessen Feld "Text" (textValue) zu, dessen Wert als String definiert ist. Der verkettete Standardwert-Wertauflöser soll als Fallback den Long-Wert 404 zurückgeben, falls aus dem Attribut kein Text geliefert wird, etwa weil es überhaupt nicht existiert.

Zur Laufzeit kann der zurückgegebene Datentyp effektiv sowohl String als auch Long sein. Für den Kontext der Konfiguration wird allerdings rein formal immer Long angenommen, da dieser Datentyp technisch am Ende der Kette steht.

Soll im Kontext der Konfiguration die Wertauflöserkette noch um einen Wertauflöser aus der Kategorie Textverarbeitung (Wertauflöser) erweitert werden, führt der Bezug zum Datentyp Long dazu, dass z. B. der Wertauflöser Teilstring in der Kategorie "Unpassend" erscheint.

In der Praxis können solche Einschränkungen oft einfach ignoriert werden, sofern - wie im Beispiel der Datentyp Long (nach einer automatischen String-Umwandlung) in Verbindung mit dem Teilstring-Wertauflöser - die erwarteten Ergebnisse erzielt werden. Das ist allerdings nicht immer so gewährleistet.

ANMERKUNG◄ Wenn sich die Konfiguration formal vorrangig am Datentyp des Werts "oberhalb" des Standardwert-Wertauflösers orientieren soll, ist es unter Umständen vorteilhaft, zunächst auf den Standardwert-Wertauflöser zu verzichten und diesen erst zu ergänzen, wenn die Konfiguration für den im Normalfall (Eingabewert ist nicht $null) erwarteten Datentyp abgeschlossen ist. Jedenfalls sollte abschließend durch Tests sichergestellt werden, dass auch ein Standardwert mit einem abweichenden Datentyp problemlos und mit den erwarteten Ergebnissen verarbeitet wird.

images/download/attachments/113286124/image2022-10-11_16-57-5-version-1-modificationdate-1665500225850-api-v2.png

Beispiele

Einfacher Anwendungsfall: Geleertes Textfeld einer Entität aus XML entfernen

Die Erfassungsmaske für Rollen bietet unter anderem ein Textfeld-Element zum editieren des Felds "Rollenbeschreibung" (roleDescription) an, in dem optional eine informative Beschreibung für die Rolle hinterlegt werden kann.

Wenn der serverseitig gespeicherte Stand einer Rolle bereits eine "Rollenbeschreibung" enthält und in der Erfassungsmaske alle Textzeichen entfernt werden, wird beim Speichern der Rolle der Rollenbeschreibung ein "leerer String" zugewiesen.

Im XML-Format bleibt daraufhin ein leeres roleDescription-Element zurück:

XML-Export (gekürzt) einer Rolle mit
<?xml version="1.0" encoding="UTF-8"?>
<base:Role ... active="true">
<roleName>myRole</roleName>
<roleDescription></roleDescription>
<parentRole>1001</parentRole>
...
</base:Role>

Über die Erfassungsmaske kann der Benutzer nicht erreichen, dass das roleDescription-Element komplett wegfällt, nachdem das Feld der Entität einmal gespeichert wurde.

In einer Ereignisbehandlung, die beim "Ändern" einer Rolle ausgeführt wird, kann dem Feld "Rollenbeschreibung" (roleDescription) dagegen automatisch "Kein Wert" ($null) zugewiesen werden, um das Feld komplett zu löschen.

Konfiguration:

Die rechts abgebildete Ereignisbehandlung reagiert auf das Ereignis "Ändern" (s. Allgemein (Ereignisse)) als Auslösendes Ereignis.


Die Prüfende Regel stellt per Typprüfung sicher, dass die folgenden Ereignisaktionen nur im Kontext einer "Rolle" (Role) ausgeführt werden.


Als einzige Aktion bei bestandener Regel wird eine Setze Wert-Ereignisaktion ausgeführt:

  • Die linke Seite definiert das Feld "Rollenbeschreibung" (roleDescription) als Ziel der Zuweisung.

  • Die rechte Seite greift über den Objekt-Feld-Wertauflöser lesend auf dieses Feld zu. Der verkettete Standardwert-Wertauflöser soll genau dann aktiv werden, falls das Feld einen leeren String enthält. Dann soll der Standardwert "Kein Wert" ($null) zugewiesen werden, damit das Feld gelöscht wird und auch aus dem XML "verschwindet".

    • Die Option Auch bei leeren String wurde ausgewählt, um die gewünschte Ersetzung zu gewährleisten, falls der Benutzer die "Rollenbeschreibung" in der Erfassungsmaske geleert hat.

    • Existiert das Feld "Rollenbeschreibung" noch nicht, weil es noch nie gefüllt war, wird der Eingabewert ($null) durch den Standardwert ($null) ersetzt. Die Zuweisung ist dann "wertneutral".

    • Jeder andere von $null verschiedene Wert für die "Rollenbeschreibung" wird diesem Feld unverändert zugewiesen. Damit ist die Zuweisung ebenfalls "wertneutral".

images/download/attachments/113286124/image2022-10-11_18-13-4-version-1-modificationdate-1665504784902-api-v2.png

Typischer Anwendungsfall: Im Kontext einer Zuweisung einen Fallback-Wert für den Quellwert definieren

Innerhalb einer Sendung (s. Sendungen) soll die "Rechnungsadresse" (genauer: die Adresse in einem "Firmen- und Adressattribut" für den Firmentyp "Rechnungsempfänger"/INV) automatisch mit einer bestehenden Adressangabe für einen anderen Firmentyp initialisiert werden.

Als Quelle für die Vorbelegung kommen zwei Firmentypen in Frage:

  1. Firmentyp "Auftraggeber" (AAL)
    oder - sofern keine Adresse für den "Auftraggeber" angegeben ist -

  2. Firmentyp "Ablieferadresse" (DDA)

Konfiguration:

Die gewünschte Vorrangregelung beim Initialisieren der "Rechnungsadresse" kann mit dem Standardwert-Wertauflöser elegant und übersichtlich gelöst werden:

Zu Vorbereitung werden durch zwei Setze Wert-Ereignisaktionen die Adressen aus den beiden Firmen- und Attributen in Variablen übertragen, die Kandidaten für die Initialisierung sind. Das ist technisch nicht erforderlich, ermöglicht aber eine übersichtlichere Darstellung und vereinfacht den Zugriff auf den Fallback-Wert im Standardwert-Wertauflöser, für den die Sendung als Bezugsobjekt nicht automatisch zur Verfügung steht (s. Hinweis im Abschnitt "Konfiguration").

Als Variablenname wird dabei der interne Name für den jeweiligen Firmentyp (AAL, DDA) verwendet.

HINWEIS◄ Sofern für den betreffenden Firmentyp keine Adresse angegeben ist, wird der Variablen "kein Wert" ($null) zugewiesen.

Die dritte Setze Wert-Ereignisaktion kann mit den beiden Variablen operieren, um die eigentliche Wertzuweisung für die "Rechnungsadresse" (auf der linken Seite der Zuweisung) zu definieren. Auf der rechten Seite der Zuweisung werden zu diesem Zweck zwei Wertauflöser verkettet:

  • Der erste Variable-Wertauflöser greift zunächst den höher priorisierten Quellwert aus der Variablen AAL zu.

  • Der verkettete Standardwert-Wertauflöser gibt die AAL-Adresse aus dem Eingabewert zurück, sofern diese existiert (also: nicht $null ist). Falls keine AAL-Adresse vorliegt, wird "ersatzweise" auf die DDA-Adresse zurückgegriffen. Existiert auch diese nicht, wird keine Adresse zugewiesen (bzw. eine ggf. bestehende Zuweisung gelöscht).

images/download/attachments/113286124/image2022-10-11_17-2-47-version-1-modificationdate-1665500568065-api-v2.png

Komplexerer Anwendungsfall: Kaskadierende Prüfung von mehreren Fallback-Werten

Manchmal kommen mehrere Quellen für eine Wertzuweisung in Frage, die als Kaskade von Fallback-Werten stufenweise abgeprüft werden sollen, bis ein Wert gefunden wird.

In einem konkreten Anwendungsfall soll der Benutzer der Session in einer Benachrichtigung über das erste ausgefüllte Feld aus der folgenden Liste angesprochen werden:

  • "Name 3" aus der Adresse (address.name3) ... oder falls nicht ausgefüllt ...

  • "Name 2" aus der Adresse (address.name2) ... oder falls nicht ausgefüllt ...

  • "Name 1" aus der Adresse (address.name1) ... oder falls nicht ausgefüllt ...

  • "Benutzername" (username)

ANMERKUNG◄ Da der "Benutzername" für ein Benutzerkonto immer ausgefüllt sein muss, stellt dieses Feld den idealen Abschluss für die Fallback-Kaskade dar.

Laufzeitbeispiele:

Benutzername

Name 1

Name 2

Name 3

Effektive Anrede

georg

Georg

<leer>

<leer>

Georg

gbusch

Georg

Busch

<leer>

Busch

gwbusch

Georg

Wilhelm

Busch

Busch

import

<leer>

<leer>

<leer>

import

Konfiguration:

In der Konfiguration kann eine Fallback-Kaskade mit zwei unterschiedlichen Methoden erreicht werden:

  • Verketten mehrerer Instanzen des Standardwert-Wertauflösers

  • Verschachteln mehrerer Instanzen des Standardwert-Wertauflösers

In beiden Fällen ist zu berücksichtigen, dass das Bezugsobjekt (hier: das als Benutzer der Session identifizierte Benutzerkonto) in jeder Instanz des Standardwert-Wertauflösers erneut adressiert werden muss, um im Parameter Standardwert auf dessen Felder zuzugreifen.

Lösungsvariante 1: Verketten mehrerer Instanzen des Standardwert-Wertauflösers

Die rechts abgebildete Konfiguration zeigt wie die "Fallback-Kaskade" durch das Verketten von Instanzen des Standardwert-Wertauflösers abgebildet werden kann:

  • Der Benutzer der Session-Wertauflöser liefert in Verbindung mit dem Eingabeobjekt (Typsicher)-Wertauflöser das aktuell angemeldete Benutzerkonto.

  • Per Wert als Variable speichern wird dieses Benutzerkonto in der Variable USER gespeichert, um den wiederholten Zugriff durch die diversen Instanzen des Standardwert-Wertauflösers zu vereinfachen.

  • Der verkettete Objekt-Feld-Wertauflöser greift auf das Feld address.name3 zu, dem die höchste Priorität für die Berücksichtigung als Anrede zukommt.

  • Die nachfolgend verketteten Instanzen des Standardwert-Wertauflösers greifen soweit erforderlich, weil noch kein Eingabewert vorliegt gemäß der geforderten Hierarchie auf weitere Quellfeld-Kandidaten zu.

    Im Parameter Standardwert muss dabei zunächst das in der Variable USER gespeicherte Benutzerkonto als Bezugsobjekt gesetzt werden.

    ANMERKUNG Wäre das Benutzerkonto als Bezugsobjekt (z. B. innerhalb einer Ausführen mit-Ereignisaktion) gegeben, könnte auf den Wert als Variable speichern-Wertauflöser verzichtet werden, wenn im Standardwert anstelle der Variablen USER die vom System automatisch befüllte Variable entity angegeben wird.

images/download/attachments/113286124/image2019-4-8_10-18-41-version-1-modificationdate-1665482363777-api-v2.png

Lösungsvariante 2: Verschachteln mehrerer Instanzen des Standardwert-Wertauflösers.

Die oben gezeigten Verkettung der Standardwert-Wertauflöser führt dazu, dass zur Laufzeit immer alle drei Instanzen des Wertauflösers "seriell" durchlaufen werden, auch wenn bereits ein Wert für die Anrede gefunden wurde. Der Standardwert wird dabei jeweils nur "aufgelöst", solange noch kein Wert für die Anrede gefunden ist. Aber die Kette muss rein technisch bis zum letzten Wertauflöser schrittweise abgearbeitet werden, obwohl das Endergebnis bereits feststeht.

In der rechts abgebildeten alternativen Konfiguration wird durch die Verschachtelung der Instanzen des Standardwert-Wertauflösers erreicht, dass die Fallback-Kaskade nur so weit durchlaufen werden muss, bis ein Ergebnis vorliegt:

  • Bis zur ersten Instanz des Standardwert-Wertauflösers ist die Konfiguration mit dem obigen Beispiel identisch.

  • Die zweite Instanz des Standardwert-Wertauflösers wird dagegen nun nicht am Ende der gesamten Verkettung angehängt, sondern an die Wertauflöserkette im Parameter Standardwert der ersten Instanz angehängt. An dieser Position wird die Instanz nur dann verarbeitet, falls das Feld address.name3 keinen Wert enthält.

  • Die Wertauflöserkette im Standardwert der zweiten Instanz wird nur dann ausgeführt, wenn auch address.name2 keinen Wert enthält. Nur dann wird die darin enthaltene dritte Instanz des Standardwert-Wertauflösers überhaupt verarbeitet, um zu prüfen, ob der Zugriff auf address.name1 einen Rückgabewert liefert.

  • Die Wertauflöserkette im Standardwert der dritten Instanz wird nur dann ausgeführt, wenn keines der zuvor geprüften Felder einen Wert enthält. Dann wird der Benutzername (username) als Anrede zugewiesen, der definitionsgemäß für jedes Benutzerkonto ausgefüllt sein muss.

images/download/attachments/113286124/image2019-4-8_10-30-18-version-1-modificationdate-1665482363782-api-v2.png

ANMERKUNG◄ Auch wenn der verschachtelte Gebrauch des Standardwert-Wertauflösers in der Lösungsvariante 2 die logisch konsequentere Konfiguration darstellt und mit zunehmender Anzahl an "Eskalationsstufen" theoretisch einen minimalen Performance-Vorteil verspricht, erscheint die Lösungsvariante 1 schon für eine nur dreistufige Kaskade deutlich transparenter und besser "lesbar". Sie ist außerdem pflegeleichter, falls die Reihenfolge der Stufen in der Kaskade nachträglich angepasst werden soll.