Accesso agli elementi nel contenuto del messaggio

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.

Quando si creano i riferimenti di campo, i nomi utilizzati devono essere identificativi ESQL validi, conformi alle regole ESQL. Qualsiasi valore si includa tra doppi apici, ESQL lo interpreta come identificativo. Qualsiasi valore si includa tra apici singoli, ESQL lo interpreta come valore letterale. E' necessario includere tutte le stringhe (stringhe di caratteri, stringhe di byte o stringhe binarie (bit)) tra apici, come mostrato negli esempi di seguito. Per includere un apice singolo o doppio all'interno di una stringa, includere due apici singoli o doppi consecutivi.
Importante: per una descrizione completa della sintassi del riferimento di campo, consultare Riferimenti di campo ESQL.
Per ulteriori informazioni sui tipi di dati ESQL, consultare Tipi di dati ESQL nei flussi di messaggi.

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:

Query di valori null
Quando si confronta un elemento con la parola chiave ESQL NULL, si verifica se l'elemento è presente nella struttura ad albero del messaggio che è stata creata a partire dal messaggio di input dal programma di analisi.

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.

Impostazione dei valori null
E' possibile utilizzare due istruzioni per impostare i valori null.
  1. Se si imposta l'elemento su NULL utilizzando la seguente istruzione, l'elemento è eliminato dalla struttura ad albero del messaggio:
    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.

  2. Se si imposta il valore di questo elemento su NULL come segue:
    SET OutputRoot.XML.Invoice.Customer.Title VALUE = NULL;  
    l'elemento non è eliminato dalla struttura ad albero del messaggio. All'elemento, invece, viene assegnato un valore speciale di 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.

Concetti correlati
Panoramica dei flussi di messaggi
Nomi di correlazione
Creazione di modelli di messaggio
Attività correlate
Progettazione di un flusso di messaggi
Definizione del contenuto del flusso di messaggi
Accesso agli elementi in un messaggio nel dominio MRM
Riferimenti correlati
Nodo Compute
Nodo Database
Nodo Filter
Riferimento ESQL
Istruzione DECLARE
Istruzione IF
Funzione FIELDVALUE
Funzione LASTMOVE
Funzione SELECT
Istruzione SET
Riferimenti di campo ESQL
Parole chiave ESQL riservate
Messaggio di esempio
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ac06010_