Função ForAll

Aplica-se a: Aplicativos de tela Fluxos da área de trabalho Aplicativos baseados em modelo Power Platform CLI

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

Descrição

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

Use a função Sequence com a função ForAll para iterar com base em uma contagem.

Os campos do registro que está sendo processado no momento estão disponíveis na fórmula. Use o operador ThisRecord ou simplesmente referencie os campos por nome como faria com qualquer outro valor. O operador Astambém pode ser usado para nomear o registro que está sendo processado, o que pode ajudar a tornar sua fórmula mais fácil de entender e tornar os registros aninhados acessíveis. Para obter mais informações, veja os exemplos abaixo e consulte trabalhando com escopo de registros.

Retornar valor

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.

Adoção de medidas

A fórmula pode incluir funções que adotam medidas, como modificar os registros de uma fonte de dados com as funções Patch e Collect. 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 é o assunto da função ForAll.

Ao escrever sua fórmula, lembre-se de 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 dependências de ordem. Por esse motivo, não é possível usar as funções UpdateContext, Clear e ClearCollect dentro de uma função ForAll porque elas podem ser usadas facilmente para manter variáveis que seriam suscetíveis a esse efeito. Você pode usar Collect, mas a ordem na qual os registros são adicionados é indefinida.

Várias funções que modificam fontes de dados, incluindo Collect, Remove e Update, retornam a fonte de dados alterada e valores de retorno. Esses valores de retorno podem ser grandes e consumir muitos recursos se retornados para todos os registros da tabela ForAll. Talvez 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 resultados. 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 Power Apps 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 forma que ForAll faria. Isso pode dispensar o uso de ForAll em muitos casos, pode ser mais eficiente e de leitura mais fácil.

Outra consideração é que ForAll não é delegável, como ocorre com outras funções, como Filter.

Delegação

Quando usada em uma fonte de dados, esta função não poderá ser delegada. Somente a primeira parte da fonte de dados será recuperada e então a função será aplicada. O resultado pode não representar a história completa. Um aviso pode ser exibido no momento da criação para lembrá-lo dessa limitação e para sugerir a troca para alternativas delegáveis sempre que possível. Para obter mais informações, consulte visão geral de delegação.

Sintaxe

ForAll( Table, Formula )

  • Table - obrigatório. Tabela na qual atuar.
  • Formula - obrigatório. A fórmula para avaliar todos os registros de Table.

Exemplos

Cálculos

Os seguintes exemplos usam a fonte de dadosSquares:

Exemplo de quadrados.

Para criar essa fonte de dados como uma coleção, defina a propriedade OnSelect de um controle de Button como a esta fórmula, abra o modo de Visualização e selecione o 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 Value. A função Sqrt também pode ser usada com uma tabela de coluna única, tornando possível executar este exemplo sem usar ForAll. Exemplo de Sqrt.
ForAll( Squares, Power( Value, 3 ) ) Para todos os registros da tabela de entrada, eleva a coluna Value à terceira potência. A função Power não oferece suporte a tabelas de coluna única. Portanto, ForAll deve ser usado nesse caso. Exemplo de Power.

Usar um conexão

Os seguintes exemplos usam a fonte de dadosExpressions:

Exemplo de expressões.

Para criar essa fonte de dados como uma coleção, defina a propriedade OnSelect de um controle de Button como a esta fórmula, abra o modo de Visualização e selecione o 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 artigo sobre como gerenciar conexões.

Fórmula Descrição Resultado
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Para todos os registros na tabela Expressions, converta o conteúdo da coluna Value em espanhol (abreviado como "es"). Exemplo com o valor
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Para todos os registros na tabela Expressions, converta o conteúdo da coluna Value em francês (abreviado como "fr"). Exemplo com o valor

Como copiar uma tabela

Às vezes, você precisa filtrar, formatar, classificar e manipular dados. Power Apps fornece muitas funções para isso, como Filter, AddColumns e Sort. O Power Apps trata cada tabela como um valor, permitindo que ela flua por fórmulas e seja consumida facilmente.

E às vezes você deseja fazer uma cópia desse resultado para uso posterior ou deseja mover informações de uma fonte de dados para outra. O Power Apps fornece a função Collect para copiar dados.

No entanto, antes de fazer essa cópia, pense cuidadosamente se ela é necessária. Muitas situações podem ser tratadas por filtragem e formatação 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 seguintes exemplos usam a fonte de dadosProducts:

Exemplo de fonte de dados de produtos.

Para criar essa fonte de dados como uma coleção, defina a propriedade OnSelect de um controle de Button como a esta fórmula, abra o modo de Visualização e selecione o 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 disponível e para a qual precisamos fazer um pedido:

Exemplo de tabela derivativa.

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

Formatação de tabela sob demanda

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

// Table shaping on demand, no need for a copy of the result
ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Um escopo de registro é criado pelas funções Filter e AddColumns 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 Filter pode ser delegada. Isso é importante, pois ela poderá localizar todos os produtos que atendem aos critérios, mesmo se forem apenas alguns registros de uma tabela de milhões. Neste momento, ShowColumns e AddColumns não podem ser delegados, portanto, o número real de produtos que precisam ser pedidos será limitado. Se souber que o tamanho do resultado sempre será relativamente pequeno, essa abordagem será adequada.

Como não criamos uma cópia, não há cópia adicional das informações para gerenciar ou desatualizada.

ForAll sob demanda

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

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

Algumas pessoas podem considerar esta fórmula mais simples de ler e gravar.

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

Colete 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 feitos 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 latência de servidor.

Podemos usar a mesma formatação de tabela como nos dois exemplos anteriores, mas capturamos 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'
            }
        )
    )
)

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

Colete em ForAll

Por fim, podemos executar Collect diretamente na ForAll:

Clear( NewOrder );
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 nesse momento. Se nossa tabela Produtos for grande, ForAll examinará apenas o primeiro conjunto de registros e talvez percamos alguns produtos que precisam ser solicitados. Mas quando sabemos que a tabela permanecerá pequena, essa abordagem é adequada.

Observe que não estamos capturando o resultado da ForAll. As chamadas à função Collect 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.

Tabela de mapa em um componente

Consulte Tabelas de mapas.