Quando si desidera accedere al contenuto di un messaggio, per leggere o scrivere, utilizzare la struttura e la disposizione degli elementi nella struttura ad albero creata a partire dal flusso di bit di input dal programma di analisi. Seguire le relazioni parent e child a cui si è interessati partendo dall'alto della struttura ad albero verso il basso, fino a raggiungere l'elemento richiesto.
E' necessario utilizzare nomi di correlazione diversi perché esiste solo un messaggio a cui fare riferimento in un nodo Database o Filter; non è possibile creare un nuovo messaggio di output in questi nodi. Utilizzare un nodo Compute per creare un nuovo messaggio di output.
Ipotizziamo di aver creato un flusso di messaggi che gestisce il messaggio Invoice, mostrato nella figura contenuta nella sezione Scrittura di ESQL. Se, ad esempio, si desidera interrogare l'elemento CardType dall'interno di un nodo Compute, utilizzare la seguente istruzione:
IF InputBody.Invoice.Payment.CardType='Visa' THEN DO; -- ulteriore ESQL -- END IF;
Se si desidera eseguire lo stesso test in un nodo Database o Filter (dove il riferimento è a un singolo messaggio di input), codificare:
IF Body.Invoice.Payment.CardType='Visa' THEN DO; -- ulteriore ESQL -- END IF;
Se si desidera copiare un elemento da un messaggio XML di input in un messaggio di output nel nodo Compute senza modificarlo, utilizzare il seguente ESQL:
SET OutputRoot.XML.Invoice.Customer.FirstName = InputBody.Invoice.Customer.FirstName;
Se si desidera copiare un elemento da un messaggio XML di input in un messaggio di output e aggiornarlo, ad esempio compilando in maiuscolo o calcolando un nuovo valore, codificare:
SET OutputRoot.XML.Invoice.Customer.FirstName = UPPER(InputBody.Invoice.Customer.FirstName); SET OutputRoot.XML.Invoice.InvoiceNo = InputBody.Invoice.InvoiceNo + 1000;
Se si desidera impostare un elemento STRING su un valore costante, codificare:
SET OutputRoot.XML.Invoice.Customer.Title = 'Mr';
E' possibile anche utilizzare l'istruzione equivalente:
SET OutputRoot.XML.Invoice.Customer.Title VALUE = 'Mr';
Se si desidera aggiornare un INTEGER o DECIMAL, ad esempio l'elemento TillNumber, con il valore 26, utilizzare la seguente assegnazione (valida solo nel nodo Compute):
SET OutputRoot.MRM.Invoice.TillNumber=26;
Il tipo di dati integer memorizza i numeri utilizzando il formato in complemento a due a 64-bit, consentendo numeri che vanno da -9223372036854775808 a 9223372036854775807. E' possibile specificare l'annotazione esadecimale per i numeri interi così come per il formato letterale del numero intero normale. Le lettere esadecimali dalla A alla F si possono scrivere in maiuscolo o minuscolo, così come la X dopo lo zero iniziale, che è richiesta. L'esempio riportato di seguito produce lo stesso risultato dell'esempio mostrato sopra:
SET OutputRoot.MRM.Invoice.TillNumber= 0x1A;
I seguenti esempi mostrano le istruzioni SET per i tipi di elementi che non compaiono nel messaggio Invoice di esempio.
Per impostare un elemento FLOAT su un valore non intero, codificare:
SET OutputRoot.MRM.FloatElement1 = 1.2345e2;
Per impostare un elemento BINARY su un valore costante, codificare:
SET OutputRoot.MRM.BinaryElement1 = X'F1F1';
Per i valori BINARY, è necessario utilizzare un carattere iniziale X (maiuscolo o minuscolo) e includere i caratteri esadecimali (anche in maiuscolo o minuscolo) tra virgolette singole, come mostrato.
Per impostare un elemento BOOLEAN su un valore costante (il valore 1 equivale a true, 0 equivale a false), codificare:
SET OutputRoot.MRM.BooleanElement1 = true;
oppure
SET OutputRoot.MRM.BooleanElement1 = 1;
E' possibile utilizzare l'istruzione SELECT per filtrare i record da un messaggio di input senza riformattare i record e senza conoscere il formato completo di ogni record. Prendere in considerazione il seguente esempio:
-- Dichiarare la variabile locale DECLARE CurrentCustomer CHAR 'Smith'; -- Eseguire il loop del messaggio di input SET OutputRoot.XML.Invoice[] = (SELECT I FROM InputRoot.XML.Invoice[] AS I WHERE I.Customer.LastName = CurrentCustomer );
In questo nodo si scrivono tutti i record dal messaggio di input Invoice al messaggio di output se viene rispettata la condizione WHERE (LastName = Smith). Tutti i record che non rispettano la condizione non vengono copiati dall'input all'output. La I è utilizzata come alias per il nome di correlazione InputRoot.XML.Invoice[].
La variabile dichiarata CurrentCustomer è inizializzata nell'istruzione DECLARE: questo è il modo più efficace per dichiarare una variabile di cui è noto il valore iniziale.
E' possibile utilizzare questa tecnica di alias con altre strutture SELECT. Ad esempio, se si desidera selezionare tutti i record del messaggio di input Invoice e creare un record aggiuntivo:
-- Eseguire il loop del messaggio di input SET OutputRoot.XML.Invoice[] = (SELECT I, 'Customer' || I.Customer.LastName AS ExtraField FROM InputRoot.XML.Invoice[] AS I );
E' possibile includere anche una clausola AS per inserire i record in una cartella secondaria nella struttura ad albero del messaggio:
-- Eseguire il loop del messaggio di input SET OutputRoot.XML.Invoice[] = (SELECT I AS Order FROM InputRoot.XML.Invoice[] AS I );
Se si sta eseguendo una query o l'impostazione di elementi che contengono o potrebbero contenere, valori null, tenere presente le seguenti considerazioni:
Ad esempio, è possibile controllare se un numero di fattura è incluso nel messaggio Invoice attuale con la seguente istruzione:
IF InputRoot.XML.Invoice.InvoiceNo IS NULL THEN DO; -- ulteriore ESQL -- END IF;
E' possibile utilizzare anche un riferimento ESQL. Il seguente esempio illustra questo caso.
DECLARE cursor REFERENCE TO InputRoot.MRM.InvoiceNo; IF LASTMOVE(cursor) = FALSE THEN SET OutputRoot.MRM.Analysis = 'InvoiceNo non esiste nell'albero logico'; ELSEIF FIELDVALUE(cursor) IS NULL THEN SET OutputRoot.MRM.Analysis = 'InvoiceNo esiste nell'albero logico ma è definito come valore MRM NULL'; ELSE SET OutputRoot.MRM.Analysis = 'InvoiceNo esiste e ha un valore'; END IF;
Per ulteriori informazioni sulla dichiarazione e l'utilizzo dei riferimenti, consultare Creazione di riferimenti di campo dinamici. Per una descrizione delle funzioni LASTMOVE e FIELDVALUE, consultare Funzione LASTMOVE e Funzione FIELDTYPE.
Se il messaggio è nel dominio MRM, vi sono altre considerazioni per le query degli elementi null che dipendono dal formato fisico. Per ulteriori dettagli, consultare Query dei valori null in un messaggio nel dominio MRM.
SET OutputRoot.XML.Invoice.Customer.Title = NULL;
Se il messaggio è nel dominio MRM, vi sono altre considerazioni per i valori null che dipendono dal formato fisico. Per ulteriori dettagli, consultare Impostazione dei valori null in un messaggio nel dominio MRM.
Questa operazione è definita elaborazione null implicita.
SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;
SET OutputRoot.XML.Invoice.Customer.Title = NULL;
Se il messaggio è nel dominio MRM, il contenuto del flusso di bit di output dipende dalle impostazioni delle proprietà di gestione null del formato fisico. Per ulteriori dettagli, consultare Impostazione dei valori null in un messaggio nel dominio MRM.
Questa operazione è definita elaborazione null esplicita.
Se si imposta un elemento complesso MRM o un elemento parent XML, XMLNS o JMS su NULL senza utilizzare la parola chiave VALUE, tale elemento e tutti i relativi child vengono eliminati dalla struttura ad albero del messaggio.