Es muy probable que tenga que manejar mensajes que contienen campos repetitivos con un número de repeticiones desconocido. Esto ocurre con el campo Item del mensaje de ejemplo en Mensaje de ejemplo.
Para grabar un filtro que tenga en cuenta todas las instancias del campo Item, tiene que utilizar una construcción que pueda iterar por todas las instancias de un campo de repetición. El predicado cuantificado permite ejecutar un predicado en todas las instancias de un campo de repetición y clasificar los resultados.
Por ejemplo, es posible que desee comprobar que ninguno de los elementos se está clasificando como una cantidad mayor que 50. Para hacerlo puede escribir:
FOR ALL Body.Invoice.Purchases."Item"[] AS I (I.Quantity <= 50)
Con el predicado cuantificado, lo primero que debe tener en cuenta son los corchetes [] al final de la referencia de campo después de FOR ALL. Estos le indican 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 hace así por coherencia con otros fragmentos de sintaxis.
La cláusula AS asocia el nombre I con la instancia actual del campo de repetición. Eso es similar al concepto de clases de iterador utilizado en algunos lenguajes orientados 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:
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 no 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 se devuelven una combinación de valores FALSE y UNKNOWN del subpredicado, se devuelve un valor global 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 en TRUE. No obstante, esta 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 elementos de la factura no incluyen un campo de título de libre, el subpredicado devuelve UNKNOWN y el predicado cuantificado devuelve el valor UNKNOWN.
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 Book, se devuelve un valor FALSE a partir del subpredicado.
También puede manipular repeticiones arbitrarias de campos en un mensaje utilizando una expresión SELECT, como se describe en Referencia a columnas de 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 la última, incluso si desconoce cuántas instancias hay. Estos índices se describen en Acceso a las diferentes apariciones conocidas de un elemento.
Alternativamente, puede utilizar la función CARDINALITY para determinar el número de instancias existente de un campo de repetición. Por ejemplo:
DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])