Provavelmente, você lide com mensagens que contêm campos repetidos com um número desconhecido de repetições. Essa é a situação que ocorre com o campo Item na mensagem de exemplo em Mensagem de Exemplo.
Para gravar um filtro que considera todas as instâncias do campo Item, é necessário utilizar uma construção que possa iterar sobre todas as instâncias de um campo de repetição.O predicado quantificado permite executar um predicado em todas as instâncias de um campo de repetição e intercalar os resultados.
Por exemplo, talvez você queira verificar se nenhum dos itens que estavam sendo pedidos tinha uma quantidade superior a 50. Para isso, você pode gravar:
FOR ALL Body.Invoice.Purchases."Item"[] AS I (I.Quantity <= 50)
Com o predicado quantificado, a primeira coisa a observar são os colchetes [] no final do campo de referência após FOR ALL. Os colchetes indicam que você está iterando sobre todas as instâncias do campo Item.
Em alguns casos, esta sintaxe parece desnecessária, porque você pode obter essas informações do contexto, mas isto é feito para consistência com outras partes da sintaxe.
A cláusula AS associa o nome I à instância atual do campo de repetição. Isto é semelhante ao conceito de classes de iterador utilizadas em algumas linguagens orientadas a objetos, tais como, C++. A expressão entre parênteses é um predicado que é avaliado para cada instância do campo Item.
Uma descrição desse exemplo é:
A descrição acima descreve como o predicado será avaliado se a palavra-chave ALL for utilizada. Uma alternativa é especificar SOME ou ANY, que são equivalentes. Neste caso, o predicado quantificado retorna TRUE se o subpredicado retornar TRUE para qualquer instância do campo de repetição. Apenas se o subpredicado retornar FALSE para todas as instâncias do campo de repetição o predicado quantificado retornará FALSE. Se for retornada uma mistura de valores FALSE e UNKNOWN do subpredicado, um valor geral de UNKNOWN será retornado.
Na seguinte expressão de filtro:
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Title = 'The XML Companion')
o subpredicado é avaliado como TRUE. No entanto, esta próxima expressão retorna FALSE:
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Title = 'C Primer')
porque C Primer não está incluído nesta fatura. Se alguns dos itens da fatura não incluírem um campo de título de manual, o subpredicado retornará UNKNOWN e o predicado quantificado retornará o valor UNKNOWN.
FOR ANY Body.Invoice.Purchases."Item"[] AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')
O predicado IS NOT NULL garante que, se um campo Item não contiver um Book, um valor FALSE será retornado do subpredicado.
Você também pode manipular repetições arbitrárias de campos em uma mensagem, utilizando uma expressão SELECT, conforme descrito em Referenciando as Colunas em um Banco de Dados.
É possível fazer referência à primeira e à última instância de um campo de repetição utilizando os índices de matriz [>] e [<] e fazendo referência a instâncias relacionadas à primeira e à última, mesmo que você não saiba quantas instâncias existem. Esses índices estão descritos em Acessando Várias Ocorrências Conhecidas de um Elemento.
Como alternativa, você pode utilizar a função CARDINALITY para determinar quantas instâncias de um campo de repetição existem. Por exemplo:
DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])