Calcula valores e executa ações para todos os registros de uma tabela.

Descrição

A função ForAll avalia uma fórmula para todos os registros de uma tabela. A fórmula pode calcular um valor e/ou realização ações, como modificar dados ou trabalhar com uma conexão.

Os campos do registro que estão sendo atualmente processados estão disponíveis dentro da fórmula. Basta referenciá-los por nome como você faria com qualquer outro valor. Também é possível fazer referência a propriedades de controle e a outros valores de todo o seu aplicativo. Para obter mais detalhes, consulte os exemplos abaixo e trabalhando com escopo de registro.

Valor retornado

O resultado de cada avaliação de fórmula é retornado em uma tabela, na mesma ordem que a tabela de entrada.

Se o resultado da fórmula for um valor único, a tabela resultante será uma tabela de coluna única. Se o resultado da fórmula for um registro, a tabela resultante conterá os registros com as mesmas colunas que o registro de resultado.

Se o resultado da fórmula for um valor em branco, então, não haverá nenhum registro na tabela de resultados para o registro de entrada. Nesse caso, haverá menos registros na tabela de resultados que na tabela de origem.

Executando uma ação

A fórmula pode incluir funções que realizam uma ação, como modificar os registros de uma fonte de dados com as funções Patch e Coletar. A fórmula também pode chamar métodos em conexões. Várias ações podem ser executadas por registro usando o operador ;. Não é possível modificar a tabela que é a entidade da função ForAll.

Ao escrever sua fórmula, tenha em mente que os registros podem ser processados em qualquer ordem e, quando possível, em paralelo. O primeiro registro da tabela pode ser processado depois do último registro. Tome cuidado para evitar as dependências de ordem. Por esse motivo, não é possível usar as funções AtualizarContexto, Limpar e LimparColeta dentro de uma função ForAll porque elas podem ser usadas facilmente para armazenar variáveis que podem ser suscetíveis a esse efeito. Você pode usar Coletar, mas a ordem na qual os registros serão adicionados é indefinida.

Várias funções que modificam fontes de dados, incluindo Coletar, Remover e Atualizar, retornam a fonte de dados alterada e seu valor retornado. Esses valores de retorno podem ser grande e consumir recursos significativos se retornados para todos os registros da tabela ForAll. Pode ser que esses valores de retorno não sejam o que você espera, pois ForAll pode operar em paralelo e pode impedir que os efeitos colaterais dessas funções obtenham seus resultados. Felizmente, se o valor retornado de ForAll não for usado, o que geralmente ocorre com as funções de modificação de dados, então, o valor retornado não será criado e não haverá nenhuma preocupação com recurso ou ordenação. Mas se você estiver usando o resultado de um ForAll e uma das funções que retorna uma fonte de dados, pense cuidadosamente em como estruturar o resultado e teste-o primeiro em pequenos conjuntos de dados.

Alternativas

Várias funções no PowerApps podem processar mais de um valor por vez com o uso de uma tabela de coluna única. Por exemplo, a função Len pode processar uma tabela de valores de texto, retornando uma tabela de tamanhos, da mesma maneira que ForAll faria. Isso pode eliminar a necessidade de usar ForAll em muitos casos, pode ser mais eficiente e é mais fácil de ler.

Outra consideração é que ForAll não é delegável enquanto outras funções podem ser, como Filtrar.

Delegação

Quando usadas com uma fonte de dados, essas funções não podem ser delegadas. Somente a primeira parte da fonte de dados será recuperada, em seguida, a função é aplicada. O resultado pode não representar a história completa. Um ponto azul aparecerá no momento da criação para lembrá-lo sobre essa limitação e sugerir mudar para alternativas delegáveis onde for possível. Para obter mais informações, consulte a visão geral da delegação.

Sintaxe

ForAll( Table, Formula )

  • Table – Obrigatório. Tabela na qual atuar.
  • Formula – Obrigatório. A fórmula para avaliar todos os registros da tabela.

Exemplos

Cálculos

Os exemplos a seguir usam a fonte de dados Squares:

Para criar essa fonte de dados como uma coleção, defina a propriedade OnSelect de um controle de Botão como a esta fórmula, abra o modo de Visualização e clique ou toque no botão:

  • ClearCollect( Squares, [ "1", "4", "9" ] )
Fórmula Descrição Resultado
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Para todos os registros da tabela de entrada, calcula a raiz quadrada da coluna Valor. A função Sqrt também pode ser usada com uma tabela de coluna única, tornando possível executar este exemplo sem usar ForAll.
ForAll( Squares, Power( Value, 3 ) ) Para todos os registros da tabela de entrada, eleva a coluna Valor à terceira potência. A função Power não oferece suporte a tabelas de coluna única. Portanto, ForAll deve ser usado nesse caso.

Usar um conexão

Os exemplos a seguir usam a fonte de dados Expressões:

Para criar essa fonte de dados como uma coleção, defina a propriedade OnSelect de um controle de Botão como a esta fórmula, abra o modo de Visualização e clique ou toque no botão:

  • ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

Este exemplo também usa uma conexão do Microsoft Translator. Para adicionar essa conexão ao seu aplicativo, consulte o tópico sobre como gerenciar conexões.

Fórmula Descrição Resultado
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Para todos os registros na tabela de expressões, converta o conteúdo da coluna Valor para espanhol (abreviado "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Para todos os registros na tabela de expressões, converta o conteúdo da coluna Valor para francês (abreviado "fr").

Copiando uma tabela

Às vezes, você precisa filtrar, criar forma, classificar e manipular dados. O PowerApps fornece uma série de funções para fazer isso, como Filtrar, AdicionarColunas e Classificar. O PowerApps trata cada tabela como um valor, permitindo que ela flua por fórmulas e seja consumida facilmente.

E, em algum momento, você desejará fazer uma cópia desse resultado para uso posterior. Ou, desejará mover informações de uma fonte de dados para outra. O PowerApps fornece a função Coletar para copiar dados.

No entanto, antes de fazer essa cópia, pense cuidadosamente se ela é realmente necessária. Muitas situações podem ser tratadas por filtragem e modelagem da fonte de dados subjacente sob demanda com uma fórmula. Algumas das desvantagens de fazer uma cópia incluem:

  • Duas cópias das mesmas informações significa que uma delas pode ficar fora de sincronia.
  • Fazer uma cópia pode consumir muita memória do computador, largura de banda de rede e/ou tempo.
  • Para a maioria das fontes de dados, a cópia não pode ser delegada, limitando a quantidade de dados que pode ser movida.

Os exemplos a seguir usam a fonte de dados Produto:

Para criar essa fonte de dados como uma coleção, defina a propriedade OnSelect de um controle de Botão como a esta fórmula, abra o modo de Visualização e clique ou toque no botão:

  • ClearCollect( Products, Table( { Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 }, { Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 }, { Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 }, { Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 } ) )

Nossa meta é trabalhar com uma tabela derivada que inclui apenas os itens em que foi solicitado mais do que o que está disponível e para a qual precisamos fazer um pedido:

Podemos executar esta tarefa de duas maneiras diferentes, que produzem o mesmo resultado com vários prós e contras.

Modelagem de tabela sob demanda

Não faça essa cópia! Podemos usar a fórmula a seguir sempre que necessário:

  • ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )

Um registro de escopo é criado pelas funções Filtrar e AdicionarColunas para executar as operações de comparação e subtração, respectivamente, com os campos 'Quantidade Solicitada' e 'Quantidade Disponível' de cada registro.

Neste exemplo, a função Filtrar pode ser delegada. Isso é importante, pois ela pode localizar todos os produtos que atendem aos critérios, mesmo se for apenas alguns registros de uma tabela de milhões. Neste momento, MostrarColunas e AdicionarColunas não podem ser delegados, portanto, o número real de produtos que precisam ser pedidos será limitado. Se você souber que o tamanho do resultado sempre será relativamente pequeno, não haverá problemas em usar essa abordagem.

E como não fazemos uma cópia, não haverá uma cópia adicional das informações para gerenciar ou que fique ultrapassada.

ForAll sob demanda

Outra abordagem é usar a função ForAll para substituir as funções de modelagem de tabela:

  • ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )

Esta fórmula pode ser mais simples para algumas pessoas lerem e escreverem.

Nenhuma parte do ForAll é delegável. A primeira parte da tabela Produtos será avaliada, o que poderá ser um problema se essa tabela for muito grande. Como Filtrar pode ser delegado no exemplo anterior, ele pode funcionar mais bem com grandes conjuntos de dados.

Coletar o resultado

Em algumas situações, uma cópia dos dados pode ser necessária. É possível mover informações de uma fonte de dados para outra. Neste exemplo, os pedidos são colocados por meio de uma tabela NewOrder no sistema de um fornecedor. Para interações do usuário de alta velocidade, convém armazenar em cache uma cópia local de uma tabela para que não haja nenhuma latência de servidor.

Podemos usar a mesma modelagem de tabela como nos dois exemplos anteriores, mas podemos capturar o resultado em uma coleção:

  • ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )

  • ClearCollect( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

LimparColeta e Coletar não podem ser delegados. Como resultado, a quantidade de dados que podem ser movidos dessa maneira é limitada.

Coletar dentro de ForAll

Por fim, podemos executar Coletar diretamente dentro de ForAll:

  • Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

Novamente, a função ForAll não pode ser delegada no momento. Se nossa tabela Produtos for grande, ForAll examinará apenas o primeiro conjunto de registros e talvez perderemos alguns produtos que precisam ser solicitados. Mas para tabelas que sabemos que permanecerão pequenas, essa abordagem é suficiente.

Observe que não estamos capturando o resultado de ForAll. As chamadas à função Coletar feitas de dentro dela retornarão a fonte de dados NewOrder para todos os registros, o que poderá acrescentar muitos dados se os estivéssemos capturando.