SQL-Abfrage ausführen

Siehe auch: Wert aus SQL-Abfrage

Ereignisaktion - Kurzfassung

Zweck: Führt eine native SQL-Abfrage in der Lobster_data-Abfragesyntax aus.

Die Ereignisaktion SQL-Abfrage ausführen übergibt ein einzelnes natives SQL-Statement an eine Datenbank, die für den Lobster Data Platform / Orchestration-Server über einen "Alias" erreichbar sein muss.

Während für lesende Zugriffe alternativ der Wert aus SQL-Abfrage-Wertauflöser eingesetzt werden kann, ermöglicht die Ereignisaktion auch schreibende (bzw. löschende) Zugriffe soweit für die per Alias adressierte Datenbank entsprechende Berechtigungen bestehen.

Der Rückgabewert des SQL-Statements wird in eine Ergebnisvariable geschrieben. Dabei sind abhängig vom Typ des SQL-Statements zwei Fälle zu unterscheiden:

  1. Die von einem SELECT-Statement zurückgegebenen Zeilen werden als Liste von Client-Objekten, deren Felder die Spalten der Abfrage widerspiegeln, in die Ergebnisvariable geschrieben. Abhängig vom Datenbanksystem erscheinen die Spaltennamen dabei entweder einheitlich in Großbuchstaben, einheitlich in Kleinbuchstaben oder unter Berücksichtigung von Groß- und Kleinschreibung. In jedem Fall muss die jeweilige Schreibweise bei Zugriff auf die Datenfelder in Lobster Data Platform / Orchestration (z. B. über einen Objekt-Feld-Wertauflöser) exakt ("case-sensitiv") übereinstimmen.
    HINWEIS◄ Falls eine Abfrage keine Zeilen zurückgibt, enthält die Ergebnisvariable eine leere Liste, die eine Prüfung per Ist leer erfüllt, aber nicht einen Vergleich wie "Ist Gleich 'kein Wert'" (s. erstes Beispiel unten).'

  2. Alle anderen SQL-Statements geben die Anzahl der "betroffenen Zeilen" (affected rows) als Ganzzahl in die Ergebnisvariable zurück. Der Wert lautet auch dann 0, wenn das Statement dem Typ nach keine Zeilen betrifft (z. B. DROP TABLE ...).

Das SQL-Statement kann die Werte von Variablen aus dem Kontext der aktuellen Ereignisbehandlung über typsichere Platzhalter entsprechend der Lobster_data Abfragesyntax einbeziehen.

Konfiguration

images/download/attachments/177911946/image-2024-9-17_15-51-20-version-1-modificationdate-1726581080120-api-v2.png

Im Parameter Ergebnis speichern als kann als statischer Text der Name der Ergebnisvariablen angegeben werden, in die Rückgabewert der Datenbank geschrieben werden soll. Die Angabe ist grundsätzlich optional. Beim Ausführen eines SELECT-Statements ist der Verzicht auf die Ergebnisvariable allerdings begrenzt sinnvoll, sofern es nicht nur darum geht, festzustellen ob es ohne Fehler ausgeführt werden kann.

Der Parameter Alias kann als statischer Text oder als Rückgabewert eines Wertauflösers bestimmt werden. Er muss auf eine Datenbank verweisen, auf die der Lobster Data Platform / Orchestration-Server zugreifen kann.

Der Parameter SQL-Query definiert das auszuführende SQL-Statement in der nativen Syntax der per Alias adressierten Datenbank, ggf. unter Berücksichtigung von typischeren Platzhaltern, an deren Stelle zur Laufzeit der Wert je einer Variablen aus dem Kontext der Ereignisbehandlung eingesetzt wird.

  • Für die Definition dieser Platzhalter greift die Lobster_data Abfragesyntax mit der Struktur @<index>:<typ>@, also etwa @1:s@ für einen String-Wert oder @2:t@ für einen Timestamp.

  • Der <index> muss dabei eine positive Ganzzahl sein, die auch als Variablenname innerhalb der Konfiguration verwendet wird. Die verwendeten Werte müssen dabei nicht lückenlos und aufsteigend vergeben werden.

  • Als <typ> muss ein Kennbuchstabe für einen Datentyp angegeben werden ( "l" long, "s" string, ... komplette Liste s. Lobster_data Abfragesyntax), der zum Verwendungszweck für den Platzhalter passen muss.

  • Für alle in der SQL Query verwendeten Platzhalter muss explizit ein korrespondierender Variablenname mit einem Wertauflöser konfiguriert werden, dessen Rückgabewert dem Datentyp des Platzhalters entsprechen oder zumindest geeignet konvertierbar sein muss.

  • Derselbe Variablenname kann von mehreren Platzhaltern referenziert werden, die bei Bedarf sogar unterschiedliche Datentypen spezifizieren können, solange jeder zur Laufzeit auftretende Wert in alle Ziel-Datentypen konvertiert werden kann.

ANMERKUNG◄ Platzhalter können ausschließlich an Positionen des SQL-Statements verwendet werden, die Werte betreffen und nicht etwa, um Feld- oder Tabellennamen oder Schlüsselwörter der Syntax dynamisch zuzuordnen. Allerdings kann der Wert für den Parameter SQL Query insgesamt dynamisch aufgebaut werden (z. B. per Textverkettung), um entsprechende Flexibilität zu erreichen.

Beispiele

HINWEIS◄ Die SQL-Statements in den folgenden Beispiele beziehen sich auf eine PostgreSQL-Datenbank.

Abfragen von Daten aus einer bestehenden Tabelle

Die Standardinstallation von Lobster_data stellt über den Alias hub den Zugriff auf Datenbanktabellen bereit. Zu diesen zählt auch die Tabelle dw_log zählt, in der Protokolleinträge auflaufen.

Für das folgende Demonstrationsbeispiel soll die Tabelle dw_log nach Einträgen durchsucht werden, die bei einem Neustart von Lobster_data geschrieben wurden. Mit der folgenden SQL-Abfrage wird nach der Spalte msg (Meldungstext) gefiltert und die Spalte date_at (Anzahl der Millisekunden seit dem 01.01.1970) für alle "Treffer" zurückgegeben:

SELECT date_at FROM dw_log
WHERE msg like '%Lobster data%started'
ORDER BY date_at DESC

Da die Ergebniszeilen absteigend nach dem Zeitstempel (date_at) sortiert werden, repräsentiert der erste Treffer den jüngsten protokollierten Neustart von Lobster_data. Erfüllt kein Protokolleintrag das Prüfkriterium für den Meldungstext (msg) , enthält die Ergebnisliste keine Elemente.

Immer wenn sich ein Benutzer mit der Rolle "Super user limited" am Client anmeldet, soll eine Benachrichtigung mit dem Zeitpunkt des letzten Neustarts erschienen.

Konfiguration:

Eine Ereignisbehandlung wird wie rechts abgebildet konfiguriert:


  • Als Prüfende Regel wird eine Rollenregel für die Rolle "Super user limited" geprüft.


  • Unter den Aktionen bei bestandener Regel wird zunächst die Ereignisaktion SQL-Abfrage ausführen ausgeführt, die ihr Suchergebnis in der per Ergebnis speichern als angegebenen Variablen records speichern soll.

  • Der Alias hub, wird hier als statischer Text angegeben. Er definiert den Kontext, in dem das per Parameter SQL-Query definierte Statement ausgeführt werden soll. Dieses wird ebenfalls als statischer Text definiert, beinhaltet aber abweichend von der oben angegebenen Version den Platzhalter @1:s@, der den letzten Abschnitt der zu prüfenden Zeichenfolge "variabel macht". Dies soll einerseits den Einsatz eines Platzhalters demonstrieren, vereinfacht aber auch eine Anpassung des Statements, falls ein anderes Schlüsselwort als "started" -z. B. "stopped" - gesucht werden soll.

  • In der vorliegenden Konfiguration wird der Wert für den Platzhalter als statischer Text für den Variablennamen 1 definiert.

  • Anschließend folgt eine Ereignisbehandlung vom Typ Hinweis anzeigen (Popup), die das in der Variable records gespeicherte Ergebnis des SELECT-Statements für eine Benachrichtigung wie die folgende aufbereitet (Details s. u.):

images/download/attachments/177911946/image2021-4-20_10-22-2-version-1-modificationdate-1726581070027-api-v2.png



images/download/attachments/177911946/image2021-4-20_14-31-49-version-1-modificationdate-1726581070016-api-v2.png

  • Die Benachrichtigung soll als Notification vom Typ "Info" (also zeitweise am rechten Bildschirmrand eingeblendet) erscheinen.

  • Der Titel Content-Builder definiert einen statischen Text, für die Überschrift der Benachrichtigung.
    ANMERKUNG◄ Hier wäre in der Praxis eigentlich ein Wertauflöser vom Typ Wert aus Sprachverwaltung zu bevorzugen, der einen geeigneten Lokalisierungseintrag liefert.

  • Im Meldung Content-Builder regelt eine Verkettung von Wertauflösern den Zugriff auf die "Nutzlast" aus dem Rückgabewert des SELECT-Statements:

    • Zunächst liest ein Variable-Wertauflöser die Variable records, deren Wert immer als Liste (s. Option Ist Liste von) von Client-Objekten (s. Typ) mit einem einzigen Datenfeld (date_at) erwartet wird, die ggf. auch leer sein kann.

    • Da die verwendete Abfrage mehrere "Trefferzeilen" liefern kann, muss der ausschlaggebende Treffer an der ersten Listenposition explizit per Listenwert-Wertauflöser mit Modus "Wert (vom Anfang)" und Offset 0 adressiert werden.

    • Innerhalb der so ermittelten "Ergebniszeile" greift der folgende Objekt-Feld-Wertauflöser auf das einzige Feld (latest_ts) mit dem gesuchten Zeitstempel zu. Dieser wird für die Ausgabe noch per Datum formatieren aufbereitet, damit der Benutzer nicht mit der Anzahl der Millisekunden konfrontiert wird.

    • Die Verkettung von Wertauflösern schließt hier noch ein Standardwert-Wertauflöser ab, der einen statisch definierten Text für den Fall ausgibt, dass der gesuchte Protokolleintag überhaupt nicht gefunden wird. Dann enthält die Variable records eine leere Liste und der Listenwert-Wertauflöser für den ersten Listenwert liefert "kein Wert".

images/download/attachments/177911946/image2021-4-21_7-7-15-version-1-modificationdate-1726581070003-api-v2.png

Alternative Konfiguration mit "bedingter Benachrichtigung"

Die rechts aufgezeigten Variante für die Konfiguration führt die Benachrichtigung per Hinweis anzeigen (Popup)-Ereignisaktion nur dann aus, wenn in der Protokolltabelle ein geeigneter Eintrag gefunden wurde. Anderenfalls gibt die Variable records nach dem Ausführen der SQL-Abfrage ausführen-Ereignisaktion eine Listenobjekt ohne Einträge zurück.

Der innerhalb der Objekt-Feld-Regel verwendete Vergleichstyp Ist leer wird hier negiert, so dass die im Dann-Block platzierte Hinweis anzeigen (Popup)-Ereignisaktion nur ausgeführt wird, wenn das Protokoll einen "Treffer" liefert.

ANMERKUNG◄ Auf den in der obigen Konfiguration für die Benachrichtigung eingesetzten Standardwert-Wertauflöser kann innerhalb dieser Fallunterscheidung verzichtet werden, wenn vorausgesetzt werden kann, dass die Spalte date_at in der Datenbanktabelle für jeden Protokolleintrag einen Zeitstempel enthält.

images/download/attachments/177911946/image2021-4-20_11-34-41-version-1-modificationdate-1726581070022-api-v2.png

Löschen von Einträgen aus einer bestehenden Tabelle

Als Beispiel für einen "Schreibzugriff" soll hier das Löschen von spezifischen Einträgen aus einer Schnittstellentabelle mit dem Namen who_is_who demonstriert werden, das immer dann ausgelöst werden soll, wenn bestimmten Typen von Allgemeinen Geschäftsobjekten der Arbeitsstatus "Abgeschlossen" zugewiesen wird.

DELETE FROM who_is_who WHERE obj_ref=@1:l@ AND obj_type=@2:s@

Die zu löschenden Einträge sollen anhand einer Kombination aus Referenznummer (obj_ref als Long-Wert) und Objekttyp (als String) identifiziert werden, für die hier bereits Platzhalter eingesetzt sind.

Sofern Einträge gelöscht werden, soll der Benutzer über deren Anzahl benachrichtigt werden.

Laufzeitbeispiel:

Einem Allgemeinen Geschäftsobjekt vom Typ "Los/Charge" (LOT) mit der Kennung "1402" als Refernzwert (reference) des Referenzattributs "Beleg-Nr." (RECEIPT_NO) wird der Arbeitsstatus "Abgeschlossen" zugewiesen. Daraufhin werden alle Einträge in der Schnittstellentabelle who_is_who geschlöscht, die dieses Objekt betreffen (DELETE FROM who_is_who WHERE obj_ref=1402 AND obj_type='LOT') und eine Benachrichtigung wie folgende erscheint:

images/download/attachments/177911946/image2021-4-20_20-53-39-version-1-modificationdate-1726581070011-api-v2.png

Konfiguration:

Eine Ereignisbehandlung wird wie rechts abgebildet konfiguriert:

  • Die Ereignisbehandlung reagiert auf das Auslösende Ereignis "Abgeschlossen" (s. Arbeitsstatus (Ereignisse)), das ausgelöst wird, wenn einem Geschäftsobjekt der Arbeitsstatus "Abgeschlossen" zugewiesen wird.


  • Die Löschung in der Schnittstellentabelle soll nur für Allgemeine Geschäftsobjekte bestimmter Typen ausgeführt werden. Dazu werden (im Bild zugeklappt) eine Typprüfung (auf "Allgemeines Geschäftsobjekt) und eine Objekt-Feld-Regel für das Feld "Geschäftsobjekt-Typ" UND-verknüpft, die prüft ob der Typ des Eingabeobjekts in einer Positivliste genannt wird.


  • Ist die Löschung relevant, wird unter den Aktionen bei bestandener Regel zunächst eine Ereignisaktion vom Typ SQL-Abfrage ausführen ausgeführt, die das DELETE-Statement an die Datenbank übergibt und die zurückgemeldete Anzahl der gelöschten Datensätze in der Variaben deleted speichert. Detail hierzu werden unten ausgeführt.

  • Anschließend wird anhand des Rückgabewerts per Wenn Dann Sonst geprüft, ob Datensätze gelöscht wurden (deleted > 0).

  • Nur wenn Datensätze gelöscht wurden, wird der Benutzer über die ausgeführte Löschung per Hinweis anzeigen (Popup) benachrichtigt. Auf eine detaillierte Beschreibung der Konfiguration für diese Ereignisaktion wird hier verzichtet. Im Wesentlichen werden die für die Ausgabe relevanten Komponenten per Textverkettung zusammengefügt. Dabei wird unter anderen auf den Wert der Variablen deleted zugegriffen, die die Anzahl der gelöschten Datensätze enthält.

images/download/attachments/177911946/image2021-4-20_21-4-41-version-1-modificationdate-1726581070008-api-v2.png

Die Ereignisaktion SQL-Abfrage ausführen wird wie rechts abgebildet parametriert:

  • Der Rückgabewert soll in der per Parameter Ergebnis speichern als benannten Variablen deleted gespeichert werden.

  • Die Datenbank mit der Schnittstellentabelle who_is_who soll für den Lobster Data Platform / Orchestration-Server über den zu diesem Zweck eingerichteten Alias omnibus erreichbar sein. An diese Datenbank wird die im Parameter SQL Query definierte Löschabfrage gesendet.

  • Zur Laufzeit werdend die in der SQL Query definierten Platzhalter @1:l@ und @2:s@ mit den Werten der unterhalb definierten Variablen mit den Variablennamen 1 und 2 ersetzt.

  • Dem Platzhalter @1:l@ wird dabei die Referenz reference aus dem Referenzattribut "Beleg-Nr." (RECEIPT_NO) des soeben abgeschlossenen Geschäftsobjekts zugewiesen. Diese wird über den verketteten Eingabeobjekt (Typsicher)-Wertauflöser vorher vom Typ String in Long umgewandelt, den der Platzhalter passend zur Spaltendefinition der Schnittellentabelle spezifiziert.

    HINWEIS◄ Man kann auf diese explizite Typumwandlung auch verzichten. Allerdings tritt dann ein Fehler (ggf. mit Abbruch und Rollback), wenn das Referenzattribut zur Laufzeit eine Zeichenfolge enthält, für die die automatische Typumwandlung in Long fehlschlägt. Dagegen liefert die explizite Typumwandlung in diesem Fall den Wert null. Ob dieser anstelle des Platzhalters einen Fehler, keine Wirkung oder unerwünschte Effekte verursacht, hängt dann vom konkreten Inhalt der SQL Query ab. Bei Bedarf kann in der Definition für den Variablennamen noch ein Standardwert-Wertauflöser verkettet werden, der im Fall eines Konvertierungsproblems einen konkreten Wert mit dem Datentyp des Platzhalters zuweist.

  • Platzhalter @2:s@ wird der interne Name des Geschäftsobjekt-Typs zugewiesen, dem das soeben abgeschlossenen Geschäftsobjekt angehört. Im Laufzeitbeispiel ist das Textwert LOT für den Typ "Los/Charge".

images/download/attachments/177911946/image2021-4-20_21-19-25-version-1-modificationdate-1726581070006-api-v2.png