Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a: Aplicativos
de tela Copilot Studio
Fluxos
de ambiente de trabalho Aplicações orientadas por modelos Funções
do Power Platform CLI
Dataverse Power
Pages
Calcula valores e realiza ações para todos os registos numa 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 realizar ações, como, por exemplo, modificar os dados ou trabalhar com uma ligação. Utilize a função With para avaliar a fórmula para um registo único.
Use a função Sequência com a ForAll função para iterar com base em uma contagem.
Os atuais campos do registo em processamento estão disponíveis na fórmula. Utilize o operador ThisRecord ou simplesmente campos de referência pelo nome, como com qualquer outro valor. O operador As também pode ser usado para nomear o registo que está a ser processado, o que pode ajudar a tornar a sua fórmula mais fácil de compreender e tornar os registos aninhados acessíveis. Para mais informações, consulte os exemplos abaixo e trabalhar com o âmbito de registo.
Valor devolvido
O resultado de cada avaliação de fórmula é devolvido numa tabela, pela mesma ordem da 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 for um registo, a tabela resultante conterá registos com as mesmas colunas que o registo do resultado.
Se o resultado da fórmula for um valor em branco , não há nenhum registro na tabela de resultados para esse registro de entrada. Nesse caso, há menos registros na tabela de resultados do que na tabela de origem.
Realizar ações
A fórmula pode inclui funções que realizam ações, como modificar os registos de uma origem de dados com as funções Patch e Collect. A fórmula também pode chamar métodos em ligações. Podem ser realizadas várias ações por registo com o operador ;. Não é possível modificar a tabela que é o assunto da ForAll função.
Ao escrever a sua fórmula, tenha em atenção que os registos podem ser processados por qualquer ordem e, sempre que possível, em paralelo. O primeiro registo da tabela pode ser processado após o último.
Tenha atenção para evitar dependências de ordenação. Por esse motivo, você não pode usar as funções UpdateContext, Clear e ClearCollect dentro de uma ForAll função porque elas poderiam ser facilmente usadas para armazenar variáveis que seriam suscetíveis a esse efeito. Pode utilizar Collect, mas a ordem pela qual os registos são adicionados é indefinida.
Muitas funções que modificam as origens de dados, incluindo Collect, Remove e Update, devolvem as origens de dados modificadas como valor devolvido. Esses valores de retorno podem ser grandes e consumir recursos significativos se retornados para cada registro da ForAll tabela. Você também pode achar que esses valores de retorno não são o que você espera, porque ForAll pode operar em paralelo e pode separar os efeitos colaterais dessas funções da obtenção de seu resultado. Se o valor de retorno de não for usado, o que geralmente é o caso com funções de modificação de dados, o valor de ForAll retorno não será criado e não haverá preocupações com recursos ou pedidos. Mas se você estiver usando o resultado de uma ForAll e uma das funções que retorna uma fonte de dados, pense cuidadosamente em como estruturar o resultado e experimente-o primeiro em pequenos conjuntos de dados.
Alternativas
Muitas funções no Power Apps podem processar mais de um valor de cada 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 não é delegável, enquanto outras funções podem ser, como Filtro.
Delegação
Quando utiliza com uma origem de dados, esta função não pode ser delegada. Só será obtida a primeira parte da origem de dados e, em seguida, a função aplicada. O resultado pode não representar o cenário completo. Poderá aparecer um aviso à hora de criação para lembrá-lo desta limitação e para sugerir que mude para alternativas delegáveis sempre que possível. Para mais informações, consulte a descrição geral de delegação.
Sintaxe
ForAll(Tabela, Fórmula)
- Tabela - Obrigatório. Tabela onde vai ser executada a função.
- Fórmula - Obrigatório. A fórmula a ser avaliada para todos os registos da Tabela.
Exemplos
Cálculos
Os exemplos seguintes utilizam a origem de dadosSquares:
Para criar esta origem de dados como uma coleção, defina a propriedade OnSelect de um controlo Button como esta fórmula, abra o Modo de pré-visualização e, em seguida, selecione o botão:
ClearCollect( Squares, [ "1", "4", "9" ] )
| Fórmula | Descrição | Resultado |
|---|---|---|
|
ForAll( quadrados, sqrt( valor ) Sqrt( Praças ) |
Calcula a raiz quadrada da coluna Value de todos os registos da tabela de entrada. 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, Potência( Valor, 3 ) | Eleva a coluna Value à terceira potência de todos os registos da tabela de entrada. A função Power não suporta tabelas de coluna única. Portanto, ForAll deve ser usado neste caso. |
|
Utilizar uma ligação
Os exemplos seguintes utilizam a origem de dadosExpressions:
Para criar esta origem de dados como uma coleção, defina a propriedade OnSelect de um controlo Button como esta fórmula, abra o Modo de pré-visualização e, em seguida, selecione o botão:
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
Este exemplo também utiliza uma ligação do Microsoft Translator. Para adicionar esta ligação à sua aplicação, veja o artigo Gerir ligações.
| Fórmula | Descrição | Resultado |
|---|---|---|
| ForAll(Expressões, MicrosoftTranslator.Translate(Value, "es")) | Traduz os conteúdos da coluna Value para espanhol (abreviado para “es”) de todos os registos da tabela Expressions. |
|
| ForAll(Expressões, MicrosoftTranslator.Translate(Value, "fr")) | Traduz os conteúdos da coluna Value para francês (abreviado para “fr”) de todos os registos da tabela Expressions. |
|
Copiar uma tabela
Por vezes, é necessário filtrar, formatar, ordenar e manipular dados. O Power Apps fornece várias funções para tal, tais como Filter, AddColumns e Sort. O Power Apps trata cada tabela como um valor, permitindo que ela flua através de fórmulas e seja consumida facilmente.
E, por vezes, queremos fazer uma cópia deste resultado para utilização posterior ou queremos mover informações de uma origem de dados para outra. O Power Apps disponibiliza a função Collect para copiar dados.
Mas antes de fazer essa cópia, pense cuidadosamente se é necessário. É possível resolver muitas destas situações ao filtrar e formatar a origem de dados subjacente a pedido com uma fórmula. Algumas das desvantagens de fazer cópias incluem:
- Duas cópias das mesmas informações significa que uma destas pode ficar dessincronizada.
- A criação de cópias 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 podem ser movidas.
Os exemplos seguintes utilizam a origem de dadosProducts:
Para criar esta origem de dados como uma coleção, defina a propriedade OnSelect de um controlo Button como esta fórmula, abra o Modo de pré-visualização e, em seguida, 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 }
)
)
O nosso objetivo é trabalhar com uma tabela derivada que inclui apenas os itens que foram mais pedidos face aos que há disponíveis e para os quais temos de fazer encomenda:
Esta tarefa pode ser feita de algumas formas diferentes, sendo que todas produzem o mesmo resultado, com vários prós e contras.
Formatação de tabelas a pedido
Não faça essa cópia! Podemos utilizar a fórmula abaixo onde quer que seja 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"
)
As funções Filter e AddColumns criam um âmbito de registo para realizar as operações de comparação e subtração, respetivamente, com os campos "Quantity Requested" e "Quantity Available" de cada registo.
Neste exemplo, a função Filter pode ser delegada. Isto é importante, pois pode encontrar todos os produtos que correspondem aos critérios, mesmo que sejam apenas alguns registos de uma tabela que tenha milhões. No momento, ShowColumns e AddColumns não podem ser delegados, portanto, o número real de produtos que precisam ser encomendados é limitado. Se você sabe que o tamanho deste resultado é sempre relativamente pequeno, esta abordagem é boa.
E como não fizemos uma cópia, não há nenhuma cópia extra das informações para gerenciar ou ficar desatualizada.
ForAll a pedido
Outra abordagem é usar a ForAll função 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'
}
)
)
Algumas pessoas podem achar esta fórmula mais fácil de ler e escrever.
Nenhuma parte do ForAll é delegável. Apenas a primeira parte da tabela Produtos é avaliada, o que pode ser um problema se esta tabela for grande. Uma vez que Filter podia ser delegado no exemplo anterior, poderia funcionar melhor com conjuntos de dados grandes.
Recolher o resultado
Em algumas situações, poderá ser necessária uma cópia dos dados. Poderá dar-se o caso de querer mover informações de uma origem de dados para outra. Neste exemplo, as encomendas são feitas através 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 do servidor.
Utilizamos a mesma forma de tabela dos dois exemplos anteriores, mas reunimos o resultado numa 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 desta forma é limitada.
Recolha dentro de ForAll
Finalmente, podemos realizar o Collect diretamente dentro do ForAll:
Clear( NewOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
Mais uma vez, a função não pode ser delegada ForAll neste momento. Se a nossa tabela de Produtos for grande, ForAll olha apenas para o primeiro conjunto de registos e podemos perder alguns produtos que precisam de ser encomendados. Mas para tabelas que sabemos que continuam pequenas, esta abordagem é boa.
Observe que não estamos capturando o resultado do ForAll. As chamadas da função Collect feitas de dentro dela retornam a fonte de dados NewOrder para todos os registros, o que poderia somar vários dados se estivéssemos capturando-os.
Mapear tabela num componente
Ver Mapear tabelas.