Arbeiten mit "Verknüpften Positionen"
Zwischen zwei Positionen von Geschäftsobjekten kann eine Verknüpfung hergestellt werden, die durch ein Typisiertes Attribut vom Typ "Verknüpfte Position" (LinkedLineItemAttribute) definiert wird. Dieses Attribut muss genau einer der beiden zu verknüpfenden Positionen zugeordnet werden und wird im Kontext des zugehörigen Geschäftsobjekts gespeichert. Die Verknüpfung ist dadurch immer mindestens formal asymmetrisch, als auch falls die Beziehung zwischen den Positionen bzw. den übergeordneten Geschäftsobjekten in der Realität keinen "gerichteten" Charakter hat.
Die Dynamische Aufzählung Verknüpfter Positionstyp qualifiziert welche Subtypen für Typisierte Attribute "Verknüpfte Position" ausgewählt werden können. Dabei spezifiziert jeder Subtyp eine bestimmte Kombination von Geschäftsobjekttypen, deren Positionen verknüpft werden sollen. Dabei wird einerseits der Quell-Positionstyp festgelegt, dem der Verknüpfte Positionstyp gegenübersteht. Es ist auch zulässig Positionen zu verknüpfen, die in Geschäftsobjekten desselben Typs enthalten sind. Dann muss ein Subtyp angelegt werden, bei dem der Quell-Positionstyp mit dem Verknüpften Positionstyp übereinstimmt.
Anders als es die Bezeichnungen vielleicht vermuten lassen, beinhaltet die Definition für einen Verknüpfter Positionstyp keinen Bezug zu einem bestimmten Positionstyp. Dieser entsteht allerdings ggf. abhängig vom Design der Erfassungsmaske, wo ein "Verknüpfte Position"-Element innerhalb eines Positionen-Elements vorkommt, das sich zwangsläufig auf einen bestimmten Positionstyp bezieht, wodurch der Positionstyp der Quell-Position vordefiniert ist. Der Positionstyp der Verknüpften Position muss durch eine Zuordnung innerhalb der Service-Konfiguration für das Auswahlfeld/Combobox Verknüpfte Position eindeutig festgelegt werden. Derselbe Verknüpfter Positionstyp kann also verwendet werden um abhängig vom Kontext innerhalb einer Erfassungsmaske Verknüpfungen zwischen Positionen unterschiedlicher Positionstypen herzustellen, gibt aber den Typ für das übergeordnete Geschäftsobjekt an beiden Enden der Verknüpfung verbindlich vor.
Beispiel:
Eine Erfassungsmaske für Sendungen sieht hier vor, dass sich Direkte Positionen (mit Positionstyp "Standard") per Verknüpfung auf je eine Position einer bestimmten Bestellung beziehen können.
Im Screenshot wurde bereits eine Verknüpfte Bestellung ausgewählt, die hier nur durch die interne ID gekennzeichnet ist. Das Auswahlfeld/Combobox ist per Standard neutral mit "Verknüpftes Geschäftsobjekt" beschriftet.
Das Element Verknüpfte Bestellpostion, das per Standard neutral mit "Verknüpfte Position" beschriftet ist, zeigt daraufhin im Dropdown auswählbare Positionen der ausgewählten Bestellung.
Diese zweistufige Auswahl für das Verknüpfte Geschäftsobjekt und die Verknüpfte Position wird - im Beispiel nach Auswahl der Position 1.1.2 - in den Positionsdaten wie folgt manifestiert:
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<shp:Shipment xmlns:shp=
"SCM.SHIPMENT"
xmlns:ord=
"SCM.ORDER"
... >
...
<attributes/>
<lineItems>
<lineItem id=
"4851"
... >
<attributes>
<shp:ShipmentLineItemLinkedLineItem id=
"601"
creatorId=
"1901"
created=
"1569242860770.770000000"
ownerId=
"1902"
lastModified=
"1569242860770.770000000"
lastModifierId=
"1901"
>
<value linkedBtoId=
"3651"
linkedBtoType=
"ord:Order"
linkedLineItemId=
"3854"
linkedLineItemType=
"ord:OrderLineItem"
type=
"SHIPMENT_TO_ORDER"
/>
</shp:ShipmentLineItemLinkedLineItem>
</attributes>
</lineItem>
</lineItems>
</shp:Shipment>
Die Verknüpfung wird in einem ShipmentLineItemLinkedLineItem-Attribut gespeichert.
Das Verknüpfte Geschäftsobjekt wird über seine interne ID (linkedBtoId) und den Geschäftsobjekttyp (linkedBtoType) identifiziert.
Die Verknüpfte Position wird über ihre interne ID (linkedLineItemId) und die zum Geschäftsobjekttyp passenden Typ der Position (linkedLineItemType) identifiziert.
Der Subtyp des Typisierten Attributs erscheint im Feld type.
Alle weiteren Informationen zum verknüpften Geschäftsobjekt und der Verknüpften Position, die in den Beschriftungen der beteiligten Auswahlfelder erscheinen sollen, müssen jeweils innerhalb der Service-Konfiguration ausdrücklich beschafft und ggf. formatiert werden.
Für die Auswahl Verknüpfte Bestellung wurde hier die Standardkonfiguration unverändert beibehalten, obwohl dies in der Praxis eher selten akzeptabel sein wird:
Label-Ausdruck: {id} ... dieses Feld steht auch ohne zur Verfügung, wenn keine explizite Projektion konfiguriert ist.
Auf Angaben zu Join, Sucheinschränkung und Suchreihenfolge wurde ebenfalls verzichtet. Diese können analog zum nachfolgend erörterten Anwendungsfall für die "Verknüpfte Position" verwendet werden.
Für die Auswahl Verknüpfte Betellposition wurden folgende Einstellungen vorgenommen:
Die Suchreihenfolge soll auf Basis der automatisch vergebenen Positions Nr. (alphabetisch) aufsteigend erfolgen, was der intuitiven Erwartung des durchschnittlichen Benutzers entsprechen dürfte.
Für die Auswahl einer Position sollen neben der systematischen Positions Nr. auch die Warenbeschreibung und ein Hinweis auf das Kennzeichen Stapelbar enthalten sein. Während die Positions Nr. als Feld des Positionsobjekts direkt im Beschriftungsausdruck adressiert werden kann, stammen die anderen beiden Angaben aus Typisierten Attributen der Position, so dass deren Wert nur verwendet werden kann, wenn die Attribute per Join beschafft werden. Die Warenbeschreibung wird im Beispiel über das entsprechende Text-Attribut (GOODS_DESCRIPTION) per Alias t_goodsdesc verfügbar gemacht. Analog wird das Kennzeichenattribut Stapelbar (STACKABLE) per Alias f_stackable verknüpft:
Ausgehend von den per Join beschafften Inhalten kann jetzt im Register Projektion u. a. ein Beschriftungsausdruck zusammengestellt werden:
Der Label Ausdruck beginnt mit der systematischen Positions Nr. (lineItemId), auf die ein Pipe-Symbol zwischen zwei Leerzeichen folgt.
Als Durchsuchbare Projektionen werden rechts die Datenfelder goodsDescription und stackable definiert, die aus den per Join-Alias verfügbaren Datenobjekten aufgelöst werden.
Für die goodsDescription wird der Text (textValue) des Attributswerts (~.value.~) direkt verwendet.
Falls das Kennzeichen stackable gesetzt ist, soll abschließend der anwendbare lokalisierte Name für den betreffenden Kennzeichentyp eingeklammert erscheinen. Dies wird erreicht indem der Kennzeichenwert (flagValue) zunächst per Projektion aus dem Attributwert (~.value.~) aufgelöst wird. Dieser Wert wird innerhalb der Label Ausdruck Definition per Hilfsfunktion $if (Details s. Berechnungsausdruck) ausgewertet. Falls das Kennzeichen true liefert, wird die anwendbare Lokalisierung für den statisch definierten Kennzeichentyp gemäß Sprachverwaltung bzw. Firmenspezifische Sprachanpassungen (Resource STACKABLE im Bundle de.lobster.scm.base.bto.attribute.FlagType) abgefragt.
Das Register Verknüpfter Positionstyp beinhaltet spezifische Einstellungen für das Auswahlfeld Verknüpfte Position:
Die verpflichtende Auswahl Positionstyp schränkt auf genau einen Positionstyp ein. Hier wurde der Standardwert "Standard" (DEFAULT) beibehalten.
Unter Positionsebene(n) kann eine komma-separierte Positivliste für die Ebenen der Positionshierarchie angegeben werden, deren Positionen zur Auswahl stehen sollen.
Keine Eingabe (s. Bild) bedeutet dabei "Alle Ebenen".
Die Nummerierung der Ebenen erfolgt ganzzahlig aufsteigend mit dem Startwert 0 (Direkte Positionen des Geschäftsobjekts).
Weitere Einschränkungen für die Positionsauswahl können im Register Sucheinschränkung definiert werden:
Abweichend von der unbeschränkten Auswahl im Eingangsbeispiel wurde im Bild eine Bedingung konfiguriert, die nur noch Positionen mit gesetztem Kennzeichen Stapelbar zur Auswahl anbietet.
Diese Bedingung liefert im Kontext des Eingangsbeispiels folgende eingeschränkte Auswahl für die Verknüpfte Position:
►HINWEISE◄
Sofern ein Anwender in einer Erfassungsmaske Schreibzugriff auf die Auswahlfelder für die zweistufige Verknüpfung von Positionen hat, greift per Standard kein Mechanismus der das Löschen der Auswahl für das Verknüpfte Geschäftsobjekt verhindert, nachdem eine Position ausgewählt wurde. Damit kann der Anwender auch eine inkonsistente Kombination von Positionsauswahl und Geschäftsobjektauswahl herstellen. Diese Problematik kann im Bedarfsfall durch geeignete Vorkehrungen innerhalb der Erfassungsmaske kontrolliert werden, etwa indem beim Ändern oder Löschen der Geschäftsobjektauswahl durch den Benutzer eine bestehende Auswahl für die Verknüpfte Position gelöscht wird.
Eine Sucheinschränkung für ein Verknüpfte Position Auswahlfeld kann bedingen, dass eine Anwender keine auswählbaren Positionen angezeigt werden, wenn dieser ein Geschäftsobjekt auswählt, das über keine Position verfügt, die den Bedingungen der Sucheinschränkung entspricht. Das interaktive Verknüpfen von Positionen kann in diesem Fall unterstützt werden, indem auf dem Auswahlfeld für das Verknüpfte Geschäftsobjekt eine Sucheinschränkung hinzugefügt wird, die nur Geschäftsobjekte zur Auswahl anbietet, die über mindestens eine auswählbare Position verfügen. Allerdings ist dabei zu berücksichtigen, dass das Hinzufügen einer ggf. komplexen Restriktion zu einer Suche über eine große Grundmenge an Geschäftsobjekten inkl. deren Positionen sich ungünstig auf die Performance der Suche auswirken kann.