Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: Aplicativos de
tela Copilot Studio
Desktop flui aplicativos baseados
em modelo
CLI CLI
Dataverse funções
Power Pages
Calcula valores e executa ações para todos os registros em uma tabela.
Descrição
A ForAll função 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 ForAll função 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 único valor, 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 , não haverá registro na tabela de resultados para esse registro de entrada. Nesse caso, há menos registros na tabela de resultados do que a 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 ForAll função.
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, você não pode usar as funções UpdateContext, Clear e ClearCollect em uma ForAll função porque elas podem ser facilmente usadas para conter 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 retornados podem ser grandes e consumir recursos significativos se retornados para cada registro da ForAll tabela. Você também pode descobrir que esses valores retornados não são o esperado porque ForAll podem operar em paralelo e podem separar os efeitos colaterais dessas funções de obter o resultado. Se o valor retornado ForAll não for usado, o que geralmente ocorre com funções de modificação de dados, o valor retornado não será criado e não haverá preocupações com recursos ou pedidos. Mas se você estiver usando o resultado de uma e uma ForAll das funções que retorna uma fonte de dados, pense cuidadosamente em como estruturar o resultado e experimentá-lo primeiro em pequenos conjuntos de dados.
Alternativas
Muitas funções no Power Apps podem processar mais de um valor por vez usando uma tabela de coluna única. Por exemplo, a função Len pode processar uma tabela de valores de texto, retornando uma tabela de comprimentos, da mesma maneira, que ForAll poderia. 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 isso não é delegado enquanto outras funções podem ser, como Filtro.
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(Tabela, Fórmula)
- Tabela - Obrigatório. Tabela na qual atuar.
- Fórmula - Obrigatório. A fórmula para avaliar todos os registros de Table.
Exemplos
Cálculos
Os seguintes exemplos usam a fonte de dadosSquares:
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( Quadrados, Sqrt( Valor ) ) Sqrt(Quadrados) |
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. |
|
| ForAll( Quadrados, Energia( Valor, 3 ) ) | Para todos os registros da tabela de entrada, eleva a coluna Value à terceira potência. A função Power não dá suporte a tabelas de coluna única. Portanto, ForAll deve ser usado nesse caso. |
|
Usar um conexão
Os seguintes exemplos usam a fonte de dadosExpressions:
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(Expressões, MicrosoftTranslator.Translate(Value, "es")) | Para todos os registros na tabela Expressions, converta o conteúdo da coluna Value em espanhol (abreviado como "es"). |
|
| ForAll(Expressões, MicrosoftTranslator.Translate(Value, "fr")) | Para todos os registros na tabela Expressions, converta o conteúdo da coluna Value em francês (abreviado como "fr"). |
|
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.
Mas antes de fazer essa cópia, pense com cuidado se for necessário. 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:
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:
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 ordenados é limitado. Se você souber que o tamanho desse resultado é sempre relativamente pequeno, essa abordagem é boa.
E como não fizemos uma cópia, não há cópia extra das informações para gerenciar ou desatualizar.
ForAll sob demanda
Outra abordagem é usar a ForAll função 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 do ForAll é delegada. Somente a primeira parte da tabela Produtos é avaliada, o que pode ser um problema se esta 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 de 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.
Coletar dentro ForAll
Por fim, podemos executar o Collect diretamente no ForAll:
Clear( NewOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
Novamente, a ForAll função não pode ser delegada no momento. Se a tabela Produtos for grande, ForAll examinaremos apenas o primeiro conjunto de registros e poderemos perder alguns produtos que precisam ser pedidos. Mas para tabelas que sabemos que permanecem pequenas, essa abordagem é boa.
Observe que não estamos capturando o resultado do ForAll. A função Coletar chamadas feitas de dentro dela retorna a fonte de dados NewOrder para todos os registros, o que poderia somar vários dados se estivéssemos capturando-os.
Tabela de mapa em um componente
Consulte Tabelas de mapas.