Wenn Sie zum Lesen oder Schreiben auf den Inhalt einer Nachricht zugreifen möchten, verwenden Sie Struktur und Anordnung der Elemente in der Baumstruktur, die der Parser aus dem Eingabebitstrom erstellt. Folgen Sie den relevanten übergeordneten und untergeordneten Beziehungen im Baum abwärts, bis Sie das erforderliche Element erreicht haben.
Sie müssen diese verschiedenen Korrelationsnamen verwenden, da ein Datenbank- oder Filterknoten nur auf eine Nachricht verweisen kann. Sie können in diesen Knoten keine neue Ausgabenachricht erstellen. Verwenden Sie dafür einen Rechenknoten.
Stellen Sie sich vor, Sie haben einen Nachrichtenfluss erstellt, der die Nachricht "Rechnung" (Invoice) aus der Abbildung unter ESQL schreiben bearbeitet. Wenn Sie nun beispielsweise das Element CardType aus einem Rechenknoten abfragen möchten, verwenden Sie dazu folgende Anweisung:
IF InputBody.Invoice.Payment.CardType='Visa' THEN DO; -- weitere ESQL -- END IF;
Wenn Sie denselben Test in einem Datenbank- oder Filterknoten ausführen möchten (mit Referenz auf einer einzelne Eingabenachricht), verwenden Sie folgenden Code:
IF Body.Invoice.Payment.CardType='Visa' THEN DO; -- weitere ESQL -- END IF;
Wenn Sie ein Element aus einer XML-Eingabenachricht in eine Ausgabenachricht im Rechenknoten kopieren möchten, ohne es zu verändern, verwenden Sie folgende ESQL:
SET OutputRoot.XML.Invoice.Customer.FirstName = InputBody.Invoice.Customer.FirstName;
Wenn Sie ein Element aus einer XML-Eingabenachricht in eine Ausgabenachricht kopieren und aktualisieren möchten, beispielsweise durch Umsetzen in Großbuchstaben oder durch Berechnen eines neuen Wertes, verwenden Sie folgenden Code:
SET OutputRoot.XML.Invoice.Customer.FirstName = UPPER(InputBody.Invoice.Customer.FirstName); SET OutputRoot.XML.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;
Wenn Sie für ein STRING-Element einen konstanten Wert angeben möchten, verwenden Sie folgenden Code:
SET OutputRoot.XML.Invoice.Customer.Title = 'Mr';
Sie können auch die entsprechende Anweisung verwenden:
SET OutputRoot.XML.Invoice.Customer.Title VALUE = 'Hr.';
Wenn Sie den Datentyp INTEGER oder DECIMAL ändern möchten, beispielsweise das Element TillNumber mit dem Wert 26, verwenden Sie folgende Zuordnung (nur gültig im Rechenknoten):
SET OutputRoot.MRM.Invoice.TillNumber=26;
Der Datentyp INTEGER speichert Zahlen unter Verwendung der 64-Bit-Zweierkomplementform. Gültige Zahlen liegen dabei zwischen -9223372036854775808 und 9223372036854775807. Sie können für Ganzzahlen sowohl die Hexadezimalschreibweise als auch das normale Ganzzahl-Literalformat angeben. Die hexadezimalen Buchstaben A bis F können groß oder klein geschrieben werden, desweiteren das X nach der ersten Null, was erforderlich ist. Das nachfolgende Beispiel erzeugt dasselbe Ergebnis wie das oben gezeigte Beispiel:
SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;
Die folgenden Beispiele zeigen SET-Anweisungen für Elementtypen, die nicht in der Rechnungs-Beispielnachricht vorkommen.
Sie setzen ein FLOAT-Element mit folgendem Code auf einen nicht-Integer-Wert:
SET OutputRoot.MRM.FloatElement1 = 1.2345e2;
Sie setzen ein BINARY-Element mit folgendem Code auf einen konstanten Wert:
SET OutputRoot.MRM.BinaryElement1 = X'F1F1';
Bei BINARY-Werten müssen Sie das Anfangszeichen X (groß oder klein geschrieben) verwenden und die hexadezimalen Zeichen (ebenfalls groß oder klein geschrieben) wie gezeigt in einfache Anführungszeichen setzen.
Verwenden Sie folgenden Code, um ein BOOLEAN-Element auf einen konstanten Wert zu setzen (der Wert 1 ergibt "true" (wahr), 0 ergibt "false" (falsch)):
SET OutputRoot.MRM.BooleanElement1 = true;
oder
SET OutputRoot.MRM.BooleanElement1 = 1;
Sie können mit der SELECT-Anweisung Datensätze aus Eingabenachrichten filtern, ohne sie dabei neu zu formatieren und ohne das vollständige Format jedes Datensatzes zu kennen. Beispiel:
-- Lokale Variable deklarieren DECLARE CurrentCustomer CHAR 'Schmidt'; -- Schleifendurchlauf durch die Eingabenachricht SET OutputRoot.XML.Invoice[] = (SELECT I FROM InputRoot.XML.Invoice[] AS I WHERE I.Customer.LastName = CurrentCustomer );
Dieser Code schreibt alle Datensätze aus der Rechnungs-Eingabenachricht in die Ausgabenachricht, wenn die WHERE-Bedingung (LastName = Schmidt) erfüllt wird. Sämtliche Datensätze, die die Bedingung nicht erfüllen, werden nicht von der Eingabe in die Ausgabe kopiert. "I" wird als Alias für den Korrelationsnamen "InputRoot.XML.Invoice[]" verwendet.
Die deklarierte CurrentCustomer-Variable wird mit der DECLARE-Anweisung initialisiert. Dies ist die effizienteste Methode, eine Variable zu deklarieren, deren Anfangswert bekannt ist.
Sie können diese Alias-Technik für andere SELECT-Anweisungen verwenden. Wenn Sie beispielsweise alle Datensätze der Rechnungs-Eingabenachricht auswählen und einen weiteren Datensatz erstellen möchten:
-- Schleifendurchlauf durch die Eingabenachricht SET OutputRoot.XML.Invoice[] = (SELECT I, 'Kunde' || I.Customer.LastName AS ExtraField FROM InputRoot.XML.Invoice[] AS I );
Sie könnten auch eine AS-Klausel einschließen, um Datensätze in einem Unterordner in der Nachrichtenbaumstruktur zu speichern:
-- Schleifendurchlauf durch die Eingabenachricht SET OutputRoot.XML.Invoice[] = (SELECT I AS Order FROM InputRoot.XML.Invoice[] AS I );
Wenn Sie Elemente abfragen oder festlegen, die (möglicherweise) Nullwerte enthalten, sollten Sie folgende Überlegungen berücksichtigen:
Sie können beispielsweise mit folgender Anweisung überprüfen, ob eine Rechnungsnummer in der aktuellen Rechnungsnachricht enthalten ist:
IF InputRoot.XML.Invoice.InvoiceNo IS NULL THEN DO; -- weitere ESQL -- END IF;
Sie können auch eine ESQL-Referenz verwenden, wie das folgende Beispiel zeigt.
DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo; IF LASTMOVE(cursor) = FALSE THEN SET OutputRoot.MRM.Analysis = 'Rechnungsnummer nicht in logischer Baumstruktur vorhanden'; ELSEIF FIELDVALUE(cursor) IS NULL THEN SET OutputRoot.MRM.Analysis = 'Rechnungsnummer nicht in logischer Baumstruktur vorhanden, aber als MRM-NULL-Wert definiert'; ELSE SET OutputRoot.MRM.Analysis = 'Rechnungsnummer ist vorhanden und hat einen Wert'; END IF;
Weitere Informationen zum Deklarieren und Verwenden von Referenzen finden Sie unter Dynamische Feldverweise erstellen. Eine Beschreibung der Funktionen LASTMOVE und FIELDVALUE erhalten Sie unter Funktion LASTMOVE und Funktion FIELDTYPE.
Befindet sich die Nachricht in der MRM-Domäne, müssen Sie weitere Überlegungen zum Abfragen von Nullelementen, die vom physischen Format abhängen, berücksichtigen. Ausführliche Informationen hierzu finden Sie unter Nullwerte in einer Nachricht in der MRM-Domäne abfragen.
SET OutputRoot.XML.Invoice.Customer.Title = NULL;
Befindet sich die Nachricht in der MRM-Domäne, müssen Sie weitere Überlegungen bezüglich Nullwerten, die vom physischen Format abhängen, berücksichtigen. Ausführliche Informationen hierzu finden Sie unter Nullwerte in einer Nachricht in der MRM-Domäne festlegen.
Man nennt dies implizite Nullverarbeitung.
SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;
SET OutputRoot.XML.Invoice.Customer.Title = NULL;
Befindet sich die Nachricht in der MRM-Domäne, hängt der Inhalt des Ausgabebitstroms von den Einstellungen der Eigenschaften zum Null-Handling des physischen Formats ab. Ausführliche Informationen hierzu finden Sie unter Nullwerte in einer Nachricht in der MRM-Domäne festlegen.
Man nennt dies explizite Nullverarbeitung.
Wenn Sie ein komplexes MRM-Element oder ein übergeordnetes XML-, XMLNS- oder JMS-Element ohne das VALUE-Schlüsselwort auf NULL setzen, werden das Element und alle untergeordneten Elemente in der logischen Baumstruktur gelöscht.