Wertauflöser - Kurzfassung
Zweck: Liefert den serverseitigen (persistierten) Datenstand der Entität im Eingabewert, sofern dieser existiert.
Tooltip
Verwendung: Der Wertauflöser liefert den serverseitigen Datenstand einer als Eingabewert vorliegenden Entität, sofern dieser existiert. Dieses Originalobjekt kann z. B. für Vergleiche mit einem abweichenden volatilen Stand der Entität genutzt werden.
Hinweise:
Falls es sich beim Eingabewert nicht um Daten einer Entität handelt, wird der Eingabewert zurückgegeben.
Existiert die Entität im Eingabewert nicht, weil sie noch nicht gespeichert wurde, dann lautet der Rückgabewert $null.
Warnung: Der Original-Objekt-Wertauflöser kann in einem Client Workflow zwar ausgewählt werden, ist aber effektiv nutzlos, da er immer nur den volatilen Stand der Entität im Eingabewert zurückgibt und nicht das nur serverseitig verfügbare "Original".
Siehe auch: Wert geändert (Vergleichstyp)
Der Original-Objekt-Wertauflöser liefert den serverseitigen (persistierten) Datenstand der Entität im Eingabewert, sofern dieser existiert.
Handelt es sich beim Eingabewert dem Typ nach um Daten einer Entität, die aber noch nicht erstellt ist, dann wird "kein Wert" ($null) zurückgegeben.
Handelt es sich beim Eingabewert dem Typ nach nicht um eine Entität, dann wird der Eingabewert zurückgegeben.
Der Zugriff auf das Originalobjekt ermöglicht den Abgleich zwischen serverseitig gespeicherten Daten einer Entität und einem volatilen, "bearbeiteten" Stand.
►HINWEIS◄ Der Original-Objekt-Wertauflöser kann grundsätzlich auch für "nicht-eigenständige" Entitäten wie Attribute verwendet werden. Allerdings ist es in der Praxis meist sinnvoller, Vergleiche von Attributen ausgehend vom Attributbesitzer (und dessen Originalobjekt) anzustellen. Diese Vorgehensweise demonstriert das zweite Beispiel unten ("Komplexerer Anwendungsfall: ...").
►WARNUNG◄ Der Original-Objekt Wertauflöser kann in einem Client Workflow zwar ausgewählt werden, ist in diesem Kontext aber effektiv nutzlos, da er immer nur den volatilen Stand der Entität im Eingabewert zurückgibt und nicht das nur serverseitig verfügbare "Original".
►WICHTIG◄ Wirkung von "Lazy Loading" auf Entität und "Original-Objekt"
Im Allgemeinen greift im Server-Kontext (z. B. beim Verarbeiten von Zuordnungskriterien oder Ereignisbehandlungen) für Daten, die in einer (1:n)-Beziehung zu einer Entität stehen und deshalb im Datenobjekt der Entität über Listenfelder gehandhabt werden, das Lazy Loading-Prinzip.
Was bedeutet Lazy Loading?
Unabhängig davon, ob eine Entität als Eingabewert vorliegt oder durch einen Eingabeobjekt (Typsicher)-Wertauflöser in den Ausführungskontext einbezogen wurde, wird der ggf. bereits persistierte Bestand für in Listenfeldern gespeicherte Daten nur bei Bedarf aus der Datenbank von Lobster Data Platform / Orchestration abgerufen.
Änderungen an "Listendaten" einer Entität, die außerhalb des gegebenen Ausführungskontexts verursacht und zeitlich vor dem lazy ausgeführten Abruf persistiert werden, gelangen also ggf. "nachträglich" in den Ausführungskontext.
Der Datenstand im Ausführungskontext kann also Kombinationen von Kopf- und Detaildaten enthalten, die in dieser Form nie in der Datenbank persistiert wurden (oder werden).
Als "Bedarf" gilt dabei ein beliebiger Zugriff auf das jeweilige Listenfeld für die Entität oder das zugehörige Original-Objekt, sofern die Daten nicht bereits abgerufen wurden.
Die folgenden konkreten Beispiele verdeutlichen das Prinzip:
Ein Lesezugriff auf die Anzahl der Einträge in der Liste aller Attribute (attributes.length) der Entität führt zum Abruf aller Attribute der Entität von der Datenbank, sofern diese noch nicht im Ausführungskontext vorliegen.
Jeder direkte oder indirekte Zugriff auf Einträge des Listenfelds für Positionen (lineItems) - z. B. per Liste modifizieren-Ereignisaktion, den Listenwert-Wertauflöser oder den Direkte Positionen-Wertauflöser - löst den Abruf der gesamten Positionshierarchie der Entität aus.
►HINWEIS◄ Beim Abrufen von Positionen zu einer Entität werden ausnahmsweise deren Attribute (attributes) automatisch "mitgeliefert". Auf dieser Ebene findet also kein Lazy Loading statt.
Was bedeutet Lazy Loading für den Original-Objekt-Wertauflöser?
Der Original-Objekt-Wertauflöser liefert für "Listendaten" (z. B. Attribute oder Positionen) einer Entität denjenigen Datenstand, den die Datenbank zum Zeitpunkt des ersten Bedarfs im Ausführungskontext per Lazy Loading bereitgestellt hat.
Falls die betreffende "Liste" im Ausführungskontext zuvor noch nicht geladen wurde, löst ein Listenzugriff für das Original-Objekt ggf. auch das gemeinsame Lazy Loading für die Liste der Entität und das Original-Objekt aus.
Solange Listendaten während der Ausführung nicht verändert werden, liefert ein Lesezugriff auf Listendaten für das Original-Objekt immer dieselben Daten wie der direkte Zugriff auf die Daten der Entität im Cache des Ausführungskontexts.
ACHTUNG
Unter Umständen gibt das Original-Objekt für lazy nachgeladene Listendaten nicht unbedingt den Datenbankstand wieder, der vorlag als die Ausführung gestartet bzw. die Entität dem Ausführungskontext als Eingabeobjekt (Typsicher) hinzugefügt wurde, sondern ggf. einen außerhalb des Ausführungskontexts gespeicherten abweichenden Stand zum Zeitpunkt des Abrufs per Lazy Loading.
Das folgende konkrete Laufzeit-Szenario verdeutlicht den Zusammenhang:
Eine Ereignisbehandlung (s. Ereignisbehandlungen) "holt" eine eine Entität vom Typ "Bestellung" (s. Bestellungen) ausgehend von einer als Long-Wert gegebenen ID (id) über den Eingabeobjekt (Typsicher)-Wertauflöser in den Ausführungskontext.
Unmittelbar anschließend soll eine Benutzer-Rückfrage-Ereignisaktion vom Benutzer eine Ja/Nein-Entscheidung zur Ausführung eines optionalen Prozessschritts (hier: Schritt 4) abfragen.
Während der Benutzer noch überlegt, ändert ein anderer Benutzer über eine Erfassungsmaske ein Attribut der fraglichen Bestellung - z. B. indem er den Wert eines benutzerdefiniertes Kennzeichenattributs (s. Kennzeichentyp) "Priority" setzt - und speichert die Bestellung ab.
In dem zustimmungspflichtigen Prozessschritt müssen im Kontext einer Fallunterscheidung per Wenn Dann Sonst-Ereignisaktion einige Kennzeichenattribute der Bestellung (darunter auch das "Priority"-Kennzeichen) ausgewertet werden.
Beim ersten Lesezugriff auf ein beliebiges Attribut werden sämtliche Attribute der Bestellung von der Datenbank abgerufen.
Für diese Auswertung gilt im konkreten Beispiel das "Priority"-Kennnzeichen also als gesetzt, auch wenn es beim Start der Ereignisbehandlung noch als "nicht gesetzt" (bzw. nicht vorhanden) gegolten hätte.
Sofern in der "fremden" Sitzung noch andere Attribute geändert wurden, werden diese der Entität im Ausführungskontext ebenfalls on-the-fly "zugeschrieben".
►HINWEISE◄
Falls die Auswertungslogik per Objekt-Feld-Regel prüfen soll, ob der Wert des "Priority"-Kennzeichens gegenüber dem Original-Objekt verändert wurde, wird diese im beschrieben Szenario keine Änderung anzeigen. Der nach der Benutzer-Rückfrage abgerufene Datenstand für die Attribute wird direkt nach dem Abruf auf die Bestellung und das zugehörige Original-Objekt abgebildet, so dass für Attribute nur nachträgliche Änderungen gegenüber diesem Stand erkannt werden.
Falls dagegen zu Beginn der Ereignisbehandlung ein Lesezugriff auf ein beliebiges Attribut der Bestellung oder auch nur Anzahl der Attribute (attributes.length) ausgeführt wird, erfolgt der Abruf der Attributdaten von der Datenbank bereits zu diesem Zeitpunkt. Dann gilt das "Priority"-Kennzeichen für Bestellung und Original-Objekt als "nicht gesetzt" (bzw. nicht vorhanden) und eine Veränderung in einer "fremden" Sitzung (s. Schritt 3) wird im Ausführungskontext nicht berücksichtigt, weil die Attribute einer Entität nur einmalig abgerufen werden.
Ein Speichern der Bestellung innerhalb der Ereignisbehandlung (z. B. per Änderungen später speichern) wird in jedem Fall durch den Schreibkonflikt mit der in Schritt 3 persistierten Aktualisierung unmöglich.
Konfiguration
Der Wertauflöser erwartet eine Entität als Eingabewert und verwendet keine Parameter.
Beispiele
Einfacher Anwendungsfall: Eine konkrete Wertänderung für ein Feld prüfen
Ein Zuordnungskriterium (s. Zuordnungskriterien) soll im Kontext einer Sendung (s. Sendungen) feststellen, ob in den im Datenkontext gegebenen volatilen Daten für diese Entität eine geringere "Anzahl Packstücke" (numberOfPackages) angegeben wird, als im serverseitig (zuletzt) gespeicherten Stand.
Konfiguration:
Das Zuordnungskriterium stellt zunächst per Typprüfung fest, ob der Datenkontext eine Sendung als Eingabewert bereitstellt.
Ist dies der Fall, wird die UND-verknüpfte Objekt-Feld-Regel ausgewertet:
Auf der linken Seite des Vergleichs (s. Vergleiche mit (Formulardesigner)) wird der Wert für das Feld "Anzahl Packstücke" (numberOfPackages) in den volatilen Daten der Sendung gelesen.
Auf der rechten Seite wird zunächst über den Original-Objekt-Wertauflöser der serverseitige Stand der Sendung beschafft. Per Verkettung wird anschließend (wie links) auf das Feld "Anzahl Packstücke" (numberOfPackages) zugegriffen.
Der "< (kleiner)"-Vergleich bewirkt, dass für das Zuordnungskriterium insgesamt "Regel bestanden" gilt, wenn die "Anzahl Packstücke" für den volatilen Stand der Sendung geringer ist als serverseitig gespeichert.
|
|
►ANMERKUNG◄ Die Auswertung dieses Zuordnungskriteriums ist nur in einem Kontext sinnvoll, indem überhaupt ein volatiler Stand der betreffenden Sendung vorliegen kann. Es könnte z. B. als Sub-Zuordnungskriterium in der Prüfenden Regel einer Ereignisbehandlung ausgewertet werden, die auf das "Ändern"-Ereignis (s. Allgemein (Ereignisse) reagiert und Aktionen beinhaltet, die nur dann relevant sind, wenn die "Anzahl Packstücke" einer Sendung im Zuge einer per Schnittstelle oder interaktiv ausgelösten Aktualisierung der Sendungsdaten reduziert wurde.
Komplexerer Anwendungsfall: Prüfen, ob sich (singuläre) Referenzattribute unterscheiden
Ein Zuordnungskriterium (s. Zuordnungskriterien) soll im Kontext einer Sendung (s. Sendungen) feststellen, ob sich die in Referenzattributen angegebenen Referenz-Werte gegenüber dem serverseitigen Stand geändert haben.
Konfiguration:
Die Aufgabenstellung erfordert eine paarweise Überprüfung der Referenz-Werte in Referenzattributen mit demselben Referenztyp zwischen dem volatilen Datenstand und dem zugehörigen Originalobjekt, das den serverseitigen Stand repräsentiert.
Die folgende Konfiguration geht vereinfachend von den folgenden vereinfachenden Annahmen aus:
Alle im Kontext von Sendungen verwendeten Referenzattribute sind im Referenztyp als nicht-plural (="singulär") definiert. Für jeden Referenztyp existiert damit genau ein oder kein Referenzattribut in den Sendungsdaten.
Im volatilen Stand der Sendung wurden gegenüber dem serverseitigen Stand keine Referenzattribute entfernt, sodass jeder serverseitig durch ein Referenzattribut repräsentierte Referenztyp auch im volatilen Stand vorhanden ist (ggf. mit leerem Referenz-Wert "").
Unter diesen Voraussetzungen lässt sich das Kriterium im Sinn der Aufgabenstellung wie folgt formulieren: "Die Regel im Zuordnungskriterium soll als bestanden gelten, wenn der volatile Stand der Sendung mindestens ein Referenzattribut enthält, dessen Referenz-Wert sich vom Referenz-Wert des dem Referenztyp nach korrespondierenden Referenzattributs im serverseitig gespeicherten Stand unterscheidet."
Die folgende Konfiguration setzt diese Logik um.
Der Wert als Variable speichern-Wertauflöser speichert einen Verweis auf den volatilen Stand der Sendung in der Variablen shipment, damit auf diesen innerhalb des Kriteriums im unterhalb folgenden Regel-Listen Resolver zugegriffen werden kann.
Der verkettete Alle Attribute eines Typs-Wertauflöser liefert die Liste aller Referenzattribute in den volatilen Sendungsdaten, also die Basis für den paarweisen Abgleich der Referenz-Werte.
Der verkettete Regel-Listen Resolver verwendet eine Objekt-Feld-Regel, für den paarweisen Abgleich der Referenz-Werte:
Auf der linken Seite des Vergleichs wird zunächst ein Wert als Variable speichern-Wertauflöser eingesetzt, um einen Verweis auf das gerade relevante Referenzattribut in der Variable attribute zu speichern. Dieser wird benötigt, damit sich der "innere" Regel-Listen Resolver der auf der rechten Seite den Vergleichswert ermitteln soll, auf den Referenztyp dieses Attributs beziehen kann. Anschließend wird auf das Feld "Referenz" (reference) dieses Attributs zugegriffen, das den "volatilen" Stand für den zu prüfenden Referenzwert liefert.
Auf der rechten Seite wird eingangs auf die Variable shipment zugegriffen, damit der verkettete Original-Objekt-Wertauflöser das Originalobjekt, also den serverseitigen Stand der Sendung beschaffen kann.
Unterhalb löst ein Alle Attribute eines Typs zunächst alle Referenzattribute im serverseitigen Stand der Sendung auf.
Der verkettete Regel-Listen Resolver soll aus dieser Liste das zur linken Seite "passende", dem Referenztyp nach korrespondierende Referenzattribut liefern (sofern vorhanden). Details hierzu sind unten ersichtlich.
Der verkettete Objekt-Feld-Wertauflöser greift auf das Feld "Referenz" (reference) in dem für den paarweisen Vergleich aus dem Originalobjekt zugeordneten Referenzattribut zu.
Der negierte Ist Gleich-Matcher im Regel-Listen Resolver definiert in Verbindung mit der abgewählten Option Alle Werte als Liste, dass die Suche den ersten Treffer "mit Unterschied" zurückgibt oder "kein Wert" (falls keine Unterschiede festgestellt wurden).
Der negierte Ist leer-Matcher der äußeren Objekt-Feld-Regel definiert, dass die Regel als bestanden gilt, wenn der Regel-Listen Resolver beim paarweisen Abgleich einen Unterschied bei den Referenz-Werten gefunden hat.
|
|
Die Abbildung rechts zeigt die rechte Seite aus der Objekt-Feld-Regel im äußeren Regel-Listen Resolver aus der vorherigen Ansicht. Dabei ist die Konfiguration für den inneren Regel-Listen Resolver aufgeklappt, um Details der enthaltenen Objekt-Feld-Regel sichtbar zu machen:
Auf der linke Seite der Objekt-Feld-Regel wird auf das Feld "Typ" (referenceType) zugegriffen, das den Referenztyp des serverseitigen Referenzattributs angibt, das mit dem Referenztyp aus dem äußeren Regel-Listen Resolver abgeglichen werden soll.
Auf der rechten Seite der Objekt-Feld-Regel wird über die Variable attribute auf das im äußeren Regel-Listen Resolver "aktuelle" Referenzattribut und - per Verkettung - auf dessen "Typ"-Feld zugegriffen.
Da die Option Alle Werte als Liste abgewählt ist, liefert der Regel-Listen Resolver den ersten Treffer für ein serverseitiges Referenzattribut, dessen Referenztyp mit dem Typ des in der Variable attribute referenzierten Referenzattribut aus den volatilen Sendungsdaten übereinstimmt - sofern dieser Referenztyp serverseitig überhaupt schon bekannt ist.
►HINWEIS◄ Sofern Sendungen mindestens einen pluralen Referenztyp verwenden können, verkompliziert das den Abgleich potenziell erheblich. Man könnte zwar im Kontext einer UND-Verknüpfung zusätzlich zum "Typ" auch noch das Feld "index" abgleichen, das für plurale Referenzattribute die Rangfolge der Attribut-Instanzen definiert. Allerdings ist es eventuell gar nicht zielführend für einen paarweisen Vergleich, wenn dieser die Indexposition einbezieht. Eventuell sollen die Referenz-Werte für ein plurales Referenzattribut ohne Beachtung der Reihenfolge der Attribut-Instanzen abgeglichen werden. Das würde eine spezielle Auswertung für jedes relevante plurale Referenzattribut erfordern. Dessen Instanzen müssten dann über zusätzliche Regel-Listen Resolver (für den Rückgabewert des Alle Attribute eines Typs-Resolver) aus dem paarweisen Vergleich ausgeschlossen werden, etwa indem gefordert wird, dass das index-Feld leer sein soll.
|
|