Suche (Ereignisaktion)
Siehe auch: Abfragekonfigurator, Such API, Suche (Formulardesigner), Tupel Suche (Formulardesigner)
Ereignisaktion - Kurzfassung
Zweck: Sucht Daten in der Datenbank von Lobster Data Platform / Orchestration und speichert das Ergebnis in einer Variablen.
Eine Suche (Ereignisaktion) "sucht" über die Such API Daten von Entitäten in der Datenbank von Lobster Data Platform / Orchestration und speichert abhängig vom ausgewählten "Modus", den ersten Treffer (sofern vorhanden) oder eine Datenstruktur mit mehreren Rückgabewerten in einer Variablen.
Hintergrund zur Such-API
Im Unterschied zu einem direkten Zugriff auf die Datenbank, der über die Ereignisaktion SQL-Abfrage ausführen auch realisiert werden kann, berücksichtigt die Such API Zugriffsrechte für einen spezifischen Anmeldekontext, der entweder durch die Sitzung oder - im Kontext einer Ausführen als-Ereignisaktion - abweichend von der aktuellen Sitzung definiert ist. Die Such API unterstützt außerdem die Abfragedefinition per Editor mit grafischen Benutzerschnittstellen für Projektionen, Einschränkungen, Joins, Wertauflöser usw.) was den Umgang mit den intern oft über mehrere Tabellen verteilten Daten effizient ermöglicht, ohne dass dazu SQL-Code erstellt, das interne Datenmodell im Detail verstanden oder Eigenheiten des verwendeten Datenbanksystems berücksichtigt werden müssten. Da die Such API auch in anderen Kontexten verwendet wird (Abfragekonfigurator, Eigene Übersichten, Verhalten, usw.) können außerdem bestehende Konfigurationen "Abfragen" (oder Teile davon) bei Bedarf durch Kopieren und Einfügen ausgetauscht werden.
Konzeptionelle Parallelen zwischen einer Datenbankabfrage (per SELECT in SQL) und der Struktur einer "Suche" spiegeln sich auch im Sprachgebrauch rund um die "Suche".
►ANMERKUNG◄ Gerade vor dem Hintergrund vordergründiger Ähnlichkeiten ist Aufmerksamkeit für Unterscheide angebracht und Skepsis gegenüber ungeprüften Annahmen zu empfehlen!
Funktional sind für die Suche (Ereignisaktion) drei unterschiedliche Suchtypen (Parameter Suche) relevant: Suche, Tupel-Suche und CSV Suche
In Verbindung mit drei Auswahlmöglichkeiten für den Parameter Modus (bzgl. Rückgabewert) ergibt sich die folgende Kombinatorik von Einsatzszenarien für eine Suche (Ereignisaktion):
↓ Modus / Suche → |
|||
Erstes Ergebnis |
eine einzelne Entität Beispiel: eine Adressbuch-Entität (base:Addressbook) Wert (value) der Ergebnisvariablen
< value id = "1312" ... name = "Consignee" xsi:type = "base:AddressBook" > < types > < type >CNE</ type > </ types > </ value > |
ein Tupel-Datenobjekt (eine "Zeile" einer Liste) Beispiel: ID und Name einer Adressbuch-Entität Wert (value) der Ergebnisvariablen
< value xsi:type = "object" > < property name = "name" > < value xsi:type = "xsd:string" >Consignee</ value > </ property > < property name = "id" > < value xsi:type = "xsd:long" >1321</ value > </ property > </ value > |
erster Tupel als CSV-Zeile Beispiel: ID und Name einer Adressbuch-Entität Wert (value) der Ergebnisvariablen
< value xsi:type = "xsd:string" >id,name 1321,Consignee </ value >
|
Suchwert |
eine Liste von Entitäten Beispiel: zwei Adressbuch-Entitäten (base:AddressBook) Wert (value) der Ergebnisvariablen
< value xsi:type = "list" > < entry id = "1312" ... name = "Consignee" xsi:type = "base:AddressBook" > < types > < type >CNE</ type > < types > </ entry > < entry id = "801" ... name = "XF_CUSTOMERS" xsi:type = "base:AddressBook" > < types > < type >DPA</ type > < type >CNE</ type > </ types > </ entry > </ value > |
mehrere Tupel-Datenobjekte ("Zeilen" einer Liste) Beispiel: ID und Name zweier Adressbuch-Entitäten (base:AddressBook) Wert (value) der Ergebnisvariablen
< value xsi:type = "list" > < entry xsi:type = "object" > < property name = "name" > < value xsi:type = "xsd:string" >Consignee</ value > </ property > < property name = "id" > < value xsi:type = "xsd:long" >1321</ value > </ property > </ entry > < entry xsi:type = "object" > < property name = "name" > < value xsi:type = "xsd:string" >XF_CUSTOMERS</ value > </ property > < property name = "id" > < value xsi:type = "xsd:long" >801</ value > </ property > </ entry > </ value > |
mehrere CSV-Zeilen Beispiel: ID und Name einer Reihe von Adressbuch-Entitäten (base:AddressBook) Wert (value) der Ergebnisvariablen
< value xsi:type = "xsd:string" >id,name 1312,Consignee 1201,TEST 1151,XF_PRINCIPALS 1051,INTL_APTS 851,ZX_SPECIAL_CUSTOMERS 803,VX_CUSTOMERS 802,ZX_CUSTOMERS 801,XF_CUSTOMERS </ value > |
Suchergebnis |
Datenobjekt vom Typ "Suchergebnis"(search:SearchResult) Beispiel: zwei Adressbuch-Entitäten (base:AddressBook) Wert (value) der Ergebnisvariablen
< value count = "2" xsi:type = "core:SearchResult" > < base :AddressBook id = "1312" ... name = "Consignee" > < types > < type >CNE</ type > </ types > </ base :AddressBook> < base :AddressBook id = "801" ... name = "XF_CUSTOMERS" > < types > < type >DPA</ type > < type >CNE</ type > </ types > </ base :AddressBook> </ value > |
Datenobjekt vom Typ "Ergebnis Tupelsuche"(search:TupleSearchResult) Beispiel: zwei Adressbuch-Entitäten (base:AddressBook) Wert (value) der Ergebnisvariablen
< value count = "2" xsi:type = "core:TupleSearchResult" > < columns > < name xsi:type = "xsd:string" >id</ name > < name xsi:type = "xsd:string" >name</ name > </ columns > < result > < row > < item xsi:type = "xsd:long" >1321</ item > < item xsi:type = "xsd:string" >Consignee</ item > </ row > < row > < item xsi:type = "xsd:long" >801</ item > < item xsi:type = "xsd:string" >XF_CUSTOMERS</ item > </ row > </ result > </ value > |
Datenobjekt vom Typ "CSV-Suchergebnis"(search:CsvSearchResult) Beispiel: ID und Name einer Reihe von Adressbuch-Entitäten (base:AddressBook) Wert (value) der Ergebnisvariablen
< value count = "12" xsi:type = "core:CsvSearchResult" > < result >id,name 1321,Consignee 1201,TEST 1151,XF_PRINCIPALS 1051,INTL_APTS 851,ZX_SPECIAL_CUSTOMERS 803,VX_CUSTOMERS 802,ZX_CUSTOMERS 801,XF_CUSTOMERS </ result > </ value > |
Konfiguration
Unabhängig von anderen Parametern muss im Parameter Ergebnis speichern als ein Variablenname angegeben werden, über den nach fehlerfreiem Verlauf der Suche auf den Rückgabewert zugegriffen werden kann.
Der Datentyp des Rückgabewerts variiert abhängig von den Einstellungen für Modus und Suche (s. Matrix oben). Im Fall einer Suche ist zusätzlich die Auswahl für die Entität relevant.
Für jede Suche muss der Typ einer Entität ausgewählt werden, die als primäres Ziel der Suche betrachtet wird.
Ähnlich wie im FROM-Abschnitt des SELECT-Statements in einer Datenbankabfrage können über die Such API zusätzlich Daten von Entitäten anderer Typen über Joins eingebunden werden.
Auch Einschränkungen und - soweit anwendbar - Projektionen können direkt oder über Joins auf Daten "fremder" Entitäten zugreifen und diese in Beziehung zur primären Entität setzen.
Als Modus muss eine der folgenden Optionen für die Übergabe der Suchergebnisse in die Variable ausgewählt werden:
Erstes Ergebnis (Standard) begrenzt die Rückgabe auf den ersten "Treffer", sofern es überhaupt einen gibt.
Suchwert gibt alle Ergebnisse der Suche als Liste zurück, z. B. eine Liste von Sendungen, falls eine Suche nach dieser Entität ausgeführt wird.
Suchergebnis gibt alle Ergebnis der Suche als Suchergebnis-Objekt zurück. Dieses Objekt enthält die Ausgabe von Modus Suchwert im Objekt-Feld result und weitere Informationen zur Suche in anderen Feldern (z. B. count).
Die Auswahl für Suche definiert den Typ der Suche: Suche, Tupel-Suche oder CSV Suche.
Sobald für den Parameter Suche eine Auswahl getroffen ist, erscheinen unterhalb weitere Parameter, mit denen die Suche analog zum im Abfragekonfigurator definiert werden kann.
Über das im Bild rechts oben eingeblendete Kontextmenü für den Parameter Suche kann die komplette Konfiguration über die Lobster Data Platform / Orchestration-Zwischenablage kopiert oder ausgeschnitten und in einem beliebigen Kontext, der sich auf die Such API bezieht, wieder eingefügt werden. Die Option Einfügen erscheint nur, wenn die Zwischenablage bereits eine Suchdefinition enthält. Diese spezielle Zwischenablage ermöglicht nicht nur den Austausch von Suchdefinitionen, z. B. für Tests mit dem Abfragekonfigurator. Sie kann auch verwendet werden, um beim Editieren einen bestimmten Änderungsstand "einzufrieren", damit dieser bei Bedarf später wiederhergestellt werden kann. Außerdem können natürlich auch einzelne Komponenten wie Projektionen, Joins oder Einschränkungen ausgeschnitten, kopiert und eingefügt werden, sofern Quell- und Zielkontext kompatibel sind. |
|
Beispiel
Bei der Anlage von Sendungen soll über ein Verknüpfte-Entitätsattribut (vom Typ "Sendung zu Bestellposition") im Kopf der Sendung ein eindeutiger Bezug zu genau einer Position einer Bestellung identifiziert werden können, auf die sich diese Sendung bezieht.
Das Löschen von Bestellungen soll unzulässig sein, solange Sendungen existieren, die sich auf Positionen der zu löschenden Bestellung beziehen. Beim Versuch eine solche Bestellung zu löschen soll eine Meldung wie die folgende ausgegeben und das "Löschen" unterbunden werden:
Konfiguration:
Eine Ereignisbehandlung wird wie rechts abgebildet konfiguriert:
|
|
|
Die einleitende Suche (Ereignisaktion) wird wie folgt konfiguriert:
|
|
Aktionsblock "Suche anpassen"
Im Block "Suche anpassen" können Ereignisaktionen konfiguriert werden, die vor dem Ausführen der Suche ausgeführt werden. Dabei gilt die Suche als Bezugsobjekt, sodass ihre Definition "angepasst" werden kann.
Typisches Anwendungsbeispiel: Paging
Eine typische Verwendung zum Anpassen der Suche ist das Manipulieren der Parameter "Erstes Ergebnis" und "Maximale Ergebnisse", um über die Suche (Ereignisaktion) ein Paging für umfangreiche Datenmengen zu realisieren.
Für die folgende Konfiguration gehen wir davon aus, dass zwei Variablen firstResult und maxResults im Ausführungskontext für die Suche (Ereignisaktion) mit Long-Werten gefüllt sind, um das "Blättern" in einer umfangreichen Anzahl von Treffern zu ermöglichen.
Konfiguration:
Die rechts abgebildete Setze Werte-Ereignisaktion wurde dem "Suche anpassen"-Bock über das Kontextmenü für das
►HINWEIS◄ Da kein Zielobjekt definiert ist, beziehen sich die Objekt-Feld-Wertauflöser für die Zielwerte (links im Bild) auf die konfigurierte "Suche", die das Bezugsobjekt im "Suche anpassen"-Block gilt. Der Entitätstyp dieses Bezugsobjekts hängt davon ab, welche der Sucharten im Parameter "Suche" (s. oben) ausgewählt ist. Die Beschriftung im Kopf des "Suche anpassen"-Blocks variiert entsprechend ("Suche anpassen", "Tupel-Suche anpassen" oder "CSV-Suche anpassen"). |
|
Besonderes Anwendungsbeispiel: "Nachrüsten" einer Bedingung
Eine CSV Suche im Kontext einer Suche (Ereignisaktion) sieht per Standard keine "Bedingung" vor. Im Block "Suche anpassen" soll allerdings ausgehend von zwei Textwerten aus Variablen (propertyName und beginsWith)eine Einfache Feld-Einschränkung als "Bedingung" generiert werden.
Dafür soll folgende Konvention gelten:
Die Variable propertyName benennt einen validen "Datenfeldpfad" für die gesuchte Entität, z. B. name für das "Name"-Feld.
Die Variable beginsWith definiert eine Zeichenfolge, die ohne Beachtung der Groß-/Kleinschreibung am Beginn des Werts im betreffenden Datenfeld (propertyName) erwartet wird, etwa TEST.
Konfiguration:
Der Screenshot rechts zeigt die Konfiguration für Ereignisaktionen im "Suche anpassen"-Block einer Suche (Ereignisaktion), die eine "CSV-Suche" ausführen soll:
►HINWEIS◄ Falls die Konfiguration für die "Bedingung" der CSV-Suche doch eine oder mehrere (statische) Einschränkungen vorsehen sollte, überschreibt unsere Zuweisung diese komplett. Soll die erzeugte Einschränkung zusätzlich zu bestehenden Einschränkungen berücksichtigt werden, muss eine Such-Verknüpfung angepasst oder erzeugt werden, um je nach Bedarf entweder eine UND- oder eine ODER-Beziehung herzustellen. |
|
Besonderes Anwendungsbeispiel: Generieren eines "Suche"-Objekts
Über die Öffne View (Aktion) kann eine Übersicht für eine Entitätstyp mit einer "Suche" (bzw. "CSV-Suche" oder "Tupel-Suche")-Objekt anstelle von "Formulardaten" geöffnet werden. Dann wirkt die "Bedingung" aus der Suche wie eine "Einschränkung" für Eigene Übersichten. Falls es sich bei der geöffneten View um eine Eigene Übersicht handelt, wird die "Bedingung" aus der Suche mit der ggf. konfigurierten Einschränkung der Übersicht UND-verknüpft.
Da das Erstellen einer Bedingung per Automatisierung schnell aufwändig und unübersichtlich werden kann, wenn es um mehr als eine Einfache Feld-Einschränkung (s. oben) geht, kann eine Suche (Ereignisaktion) "missbraucht" werden, um das benötigte "Suche"-Objekt für Öffne View (Aktion) zu erzeugen.
Konfiguration:
Der Screenshot rechts zeigt die Konfiguration für eine Suche (für die Entität Firmen) innerhalb einer Suche (Ereignisaktion), die eigentlich nur dazu dient, im Kontext einer Ereignisbehandlung ein Search-Objekt zu erzeugen, das anschließend einer Öffne View (Aktion) als Filterbedingung für die zu öffnende View genutzt werden soll. ►ANMERKUNG◄ Da die Ausführung der Suche nicht verhindert werden kann wir sie hier so konfiguriert, dass sie möglichst wenig Daten erzeugt. Als Modus ist deshalb "Erstes Ergebnis" ausgewählt, sodass in die Variable dummy als Rückgabewert nur ein oder kein Firmenkonto gespeichert wird.
►WICHTIG◄ In der nachfolgenden Öffne View (Aktion)-Ereignisaktion wird auf das Search-Objekt als Ganzes zugegriffen. Dabei wird die im where-Feld definierte Bedingung nicht direkt als Einschränkung für die geöffnete Übersicht übernommen. Vielmehr wird aus der Definition der Suche insgesamt eine Sub-Suche-Einschränkung erstellt, die mit einer ggf. bestehenden "Einschränkung" für die zu öffnende View (s. Eigene Übersichten) UND-verknüpft wird. Diese Vorgehensweise mag unnötig kompliziert erscheinen, stellt aber u. a. sicher, dass die Bedingung in der übergebenen Suche auch Einschränkungen verwenden kann, die Felder aus Joins adressieren. Auch die einschränkende Wirkung von INNER Joins kann nur indirekt - per "Umweg" über die Sub-Suche-Einschränkung - auf die Zu öffnende View übertragen werden. |
|
Die rechts abgebildete Öffne View (Aktion)-Ereignisaktion öffnet eine Standard-"Firmenübersicht", für die die "Bedingung" aus dem Search-Objekt in der Variablen mySearch als "Einschränkung" gilt, wenn im Parameter Formulardaten der Wert dieser Variablen als Search-Objekt aufgelöst wird. ►WICHTIG◄ Falls in der Suche (Ereignisaktion) in der Variablen mySearch anstelle der Suche eine Tupel-Suche oder CSV Suche definiert wäre, würde die adressierte Firmenübersicht geöffnet aber nicht auf Grundlage der Suche eingeschränkt. Es ist wichtig zu verstehen warum: Öffne View (Aktion) versucht nur dann aus dem Parameter Formulardaten eine Restriktion für die Zu öffnende View abzuleiten, wenn sein Wert dem Typ "Suche" (Search) oder "Sucheinschränkung" (ISearchRestriction) entspricht. Ein TupleSearch-Objekt würde diesen Test nicht bestehen. Die dann anwendbare Standardbehandlung für Formulardaten (s. Öffne View (Aktion) ergibt keine Auswahl (mangels ID-Feld auch keine unbeabsichtigte) einer Entität im Kontext der geöffneten Übersicht. |
|
►HINWEIS◄ Für alle relevanten Sucharten (Suche, Tupel-Suche und CSV Suche) besteht die Möglichkeit im Parameter Formulardaten auf das where-Feld innerhalb der Suche zuzugreifen. Dann wird versucht, die dort definierte Bedingung direkt (und falls nötig UND-verknüpft) als Einschränkung für die Zu öffnende View zu berücksichtigen. Dies gelingt allerdings nur, sofern innerhalb der Sucheinschränkung nicht auf Joins zugegriffen wird, die nicht über eine Verkettete Projektion komplett in die "Bedingung" integriert sind.