Accesso a più ricorrenze sconosciute di un elemento

E' molto probabile che si gestiscano messaggi che contengono campi che si ripetono, con un numero sconosciuto di ripetizioni. Questa è la situazione che si verifica con il campo Item nel messaggio di esempio descritto nella sezione Messaggio di esempio.

Per scrivere un filtro che tenga conto di tutte le istanze del campo Item, è necessario utilizzare una struttura che possa ripetersi per tutte le istanze di un campo ripetuto. Il predicato quantificato consente di eseguire un predicato su tutte le istanze di un campo ripetuti e raccogliere i risultati.

Ad esempio, si potrebbe voler verificare che nessuno degli articoli ordinati raggiunga una quantità superiore a 50. A tale scopo si potrebbe scrivere:

FOR ALL Body.Invoice.Purchases."Item"[] 
    AS I (I.Quantity <= 50)

Con il predicato quantificato, la prima cosa da notare sono le parentesi quadre [] alla fine del riferimento di campo dopo FOR ALL. Queste indicano che si sta reiterando su tutte le istanze del campo Item.

In alcuni casi, questa sintassi non è necessaria poiché si possono ottenere quelle informazioni dal contesto, ma la si mantiene per coerenza con altre parti di sintassi.

La clausola AS associa il nome I all'istanza corrente del campo che si ripete. E' simile al concetto di classi di iterazione utilizzato in alcuni linguaggi orientati agli oggetti come C++. L'espressione tra parentesi è un predicato valutato per ogni istanza del campo Item.

Una descrizione di questo esempio è:

Ripetere per tutte le istanze del campo Item in Body.Invoice. Per ogni ripetizione:
  1. Associare il nome I all'istanza corrente di Item.
  2. Valutare il predicato I.Quantity <= 50. Se il predicato:
    • Ha il valore TRUE per tutte le istanze di Item, il risultato è TRUE.
    • Ha il valore FALSE per tutte le istanze di Item, il risultato è FALSE.
    • Rileva una combinazione di valori TRUE e UNKNOWN, il risultato è UNKNOWN.

Quella precedente è una descrizione di come viene valutato il predicato se si utilizza la parola chiave ALL. Un'alternativa è specificare SOME o ANY, che sono equivalenti. In questo caso il predicato quantificato restituisce TRUE se il predicato secondario restituisce TRUE per qualsiasi istanza del campo ripetuto. Solo se il predicato secondario restituisce FALSE per tutte le istanze del campo ripetuto, il predicato quantificato restituisce FALSE. Il predicato secondario restituisce una combinazione di valori FALSE e UNKNOWN, viene restituito un valore globale UNKNOWN.

Nella seguente espressione di filtro:

FOR ANY Body.Invoice.Purchases."Item"[]  
    AS I (I.Title = 'The XML Companion')

il predicato secondario ha valore TRUE. Tuttavia questa successiva espressione restituisce FALSE:

FOR ANY Body.Invoice.Purchases."Item"[] 
    AS I (I.Title = 'C Primer')

poiché C Primer non è incluso in questa fattura. Se alcuni articoli nella fattura non includono un campo relativo al titolo libro, il predicato secondario restituisce UNKNOWN e il predicato quantificato restituisce il valore UNKNOWN.

Per gestire la possibilità che compaiano dei valori null, scrivere questo filtro con un controllo esplicito dell'esistenza del campo, come segue:
FOR ANY Body.Invoice.Purchases."Item"[] 
	 AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')

Il predicato IS NOT NULL garantisce che, se un campo Item non contiene una voce Book, il predicato secondario restituisce un valore FALSE.

E' anche possibile manipolare le ripetizioni arbitrarie dei campi in un messaggio utilizzando l'espressione SELECT, come descritto in Riferimento alle colonne in un database.

È possibile fare riferimento alla prima e all'ultima istanza di un campo che si ripete utilizzando gli indici di array [>] e [<] e alle istanze connesse alla prima e all'ultima, anche se non è noto il numero di istanze presenti. Tali indici sono descritti in Accesso a più ricorrenze conosciute di un elemento.

In alternativa, è possibile utilizzare la funzione CARDINALITY per stabilire quante siano le istanze di un campo ripetuto. Ad esempio:

DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])
Concetti correlati
Panoramica dei flussi di messaggi
Panoramica di ESQL
Creazione di modelli di messaggio
Attività correlate
Accesso a più ricorrenze conosciute di un elemento
Progettazione di un flusso di messaggi
Definizione del contenuto del flusso di messaggi
Gestione dei file ESQL
Riferimenti correlati
Nodo Compute
Nodo Database
Nodo Filter
Riferimento ESQL
Funzione CARDINALITY
Istruzione DECLARE
Funzione FOR
Messaggio di esempio
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ac16770_