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.
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 |
Option |
Rückgabewert |
Verhalten |
Kein Wert ($null) |
unerheblich |
Standardwert |
Der Standardwert wird als Fallback-Wert bereitgestellt. Ohne Konfiguration (Standard) wird "Kein Wert" ($null) zurückgegeben. |
leerer String ("") |
|
||
|
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. |
|
►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. |
|
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
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:
|
|
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:
Firmentyp "Auftraggeber" (AAL)
oder - sofern keine Adresse für den "Auftraggeber" angegeben ist -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:
|
|
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:
|
|
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:
|
|
►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.