Acceso a varias ocurrencias desconocidas de un elemento

Es probable que encuentre mensajes con campos repetidos con un número de repeticiones desconocido. Este es el caso del campo Item del mensaje de ejemplo siguiente de Mensaje de ejemplo.

Para escribir un filtro que tenga en cuenta todas las instancias del campo Item, debe utilizar una construcción que pueda iterar por todas las instancias del campo repetido. El predicado cuantificado le permite ejecutar un predicado en todas las instancias de un campo repetido y cotejar los resultados.

Por ejemplo, es posible que desee verifica que ninguno de los artículos de un pedido supera la cantidad de 50. Para hacerlo puede escribir:

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

Con el predicado cuantificado, lo primero que ha de tener en cuenta son los corchetes [] al final de la referencia de campo después de FOR ALL. Esto le indica que está iterando por todas las instancias del campo Item.

En algunos casos, esta sintaxis parece innecesaria porque puede obtener esta información a partir del contexto pero se lleva a cabo por coherencia con otros fragmentos de la sintaxis.

La cláusula AS asocia el nombre I con la instancia actual del campo de repetición. Esto es similar al concepto de las clases de iterador que se utilizan en algunos lenguajes de programación orientada a objetos como, por ejemplo, C++. La expresión entre paréntesis es un predicado que se evalúa para cada instancia del campo Item.

La siguiente es una descripción de este ejemplo:

Iterar por todas las instancias del campo Item incluido en Body.Invoice. Para cada iteración:
  1. Enlazar el nombre I a la instancia actual de Item.
  2. Evaluar el predicado I.Quantity <= 50. Si el predicado:
    • Se evalúa como TRUE para todas las instancias de Item, devolver TRUE.
    • Si es FALSE para cualquier instancia de Item, devolver FALSE.
    • Para una combinación de TRUE y UNKNOWN, devolver UNKNOWN.

La anterior es una descripción de cómo se evalúa el predicado si utiliza la palabra clave ALL. Una alternativa es especificar SOME o ANY, que son equivalentes. En este caso, el predicado cuantificado devuelve TRUE si el subpredicado devuelve TRUE para cualquier instancia del campo de repetición. Sólo si el subpredicado devuelve FALSE para todas las instancias del campo de repetición el predicado cuantificado devuelve FALSE. Si el subpredicado devuelve una combinación de valores FALSE y UNKNOWN, se devuelve el valor general de UNKNOWN.

En la expresión de filtro siguiente:

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

el subpredicado se evalúa como TRUE. No obstante, la expresión siguiente devuelve FALSE:

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

debido a que C Primer no se incluye en esta factura. Si algunos de los elementos de la factura no incluyen un campo de título de libro, el subpredicado devuelve UNKNOWN y el predicado cuantificado devuelve el valor UNKNOWN.

Para que aparezcan valores nulos, escriba este filtro con una comprobación explícita de la existencia del campo, como se indica a continuación:
FOR ANY Body.Invoice.Purchases."Item"[]
  AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')

El predicado IS NOT NULL garantiza que, si un campo Item no contiene un Book, el subpredicado devuelve el valor FALSE.

Asimismo puede manipular las repeticiones arbitrarias de los campos en un mensaje utilizando una expresión SELECT, como se describe en Referencia a columnas en una base de datos.

Puede hacer referencia a la primera y última instancias de un campo de repetición utilizando los índices de matriz [>] y [<] y a las instancias relativas a la primera y última, incluso si desconoce el número de instancias. Estos índices se describen en Acceso a varias apariciones conocidas de un elemento.

Alternativamente, puede utilizar la función CARDINALITY para determinar el número de instancias de un campo de repetición. Por ejemplo:

DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])

Conceptos relacionados
Flujos de mensajes
ESQL
Diseño de mensajes

Tareas relacionadas
Acceso a varias apariciones conocidas de un elemento
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Gestión de archivos ESQL

Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
ESQL
Función CARDINALITY
Sentencia DECLARE
Función FOR
Mensaje de ejemplo