Função ForAll no PowerAppsForAll function in PowerApps

Calcula valores e executa ações para todos os registros de uma tabela.Calculates values and performs actions for all records of a table.

DescriçãoDescription

A função ForAll avalia uma fórmula para todos os registros de uma tabela.The ForAll function evaluates a formula for all records of a table. A fórmula pode calcular um valor e/ou realização ações, como modificar dados ou trabalhar com uma conexão.The formula can calculate a value and/or perform actions, such as modifying data or working with a connection.

Fields of the record currently being processed are available within the formula. You simply reference them by name as you would any other value. You can also reference control properties and other values from throughout your app. For more details, see the examples below and working with record scope.

Valor retornadoReturn value

O resultado de cada avaliação de fórmula é retornado em uma tabela, na mesma ordem que a tabela de entrada.The result of each formula evaluation is returned in a table, in the same order as the input table.

Se o resultado da fórmula for um valor único, a tabela resultante será uma tabela de coluna única.If the result of the formula is a single value, the resulting table will be a single column table. Se o resultado da fórmula for um registro, a tabela resultante conterá os registros com as mesmas colunas que o registro de resultado.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

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.If the result of the formula is a blank value, then there will be no record in the result table for that input record. Nesse caso, haverá menos registros na tabela de resultados que na tabela de origem.In this case, there will be fewer records in the result table than the source table.

Executando uma açãoTaking action

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.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. A fórmula também pode chamar métodos em conexões.The formula can also call methods on connections. Várias ações podem ser executadas por registro usando o operador ;.Multiple actions can be performed per record by using the ; operator. Não é possível modificar a tabela que é a entidade da função ForAll.You can't modify the table that is the subject of the ForAll function.

Ao escrever sua fórmula, tenha em mente que os registros podem ser processados em qualquer ordem e, quando possível, em paralelo.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. O primeiro registro da tabela pode ser processado depois do último registro.The first record of the table may be processed after the last record. Tome cuidado para evitar as dependências de ordem.Take care to avoid ordering dependencies. 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.For this reason, you can't use the UpdateContext, Clear, and ClearCollect functions within a ForAll function because they could easily be used to hold variables that would be susceptible to this effect. Você pode usar Coletar, mas a ordem na qual os registros serão adicionados é indefinida.You can use Collect, but the order in which records are added is undefined.

Várias funções que modificam fontes de dados, incluindo Coletar, Remover e Atualizar, retornam a fonte de dados alterada e seu valor retornado.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Esses valores de retorno podem ser grande e consumir recursos significativos se retornados para todos os registros da tabela ForAll.These return values can be large and consume significant resources if returned for every record of the ForAll table. 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.You may also find that these return values are not what you expect, because ForAll can operate in parallel and may separate the side effects of these functions from obtaining their result. 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.Fortunately, if the return value from ForAll is not actually used, which is often the case with data modification functions, then the return value will not be created and there are no resource or ordering concerns. 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.But if you are using the result of a ForAll and one of the functions that returns a data source, think carefully about how you structure the result and try it out first on small data sets.

AlternativasAlternatives

Várias funções no PowerApps podem processar mais de um valor por vez com o uso de uma tabela de coluna única.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. 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.For example, the Len function can process a table of text values, returning a table of lengths, in the same manner that ForAll could. Isso pode eliminar a necessidade de usar ForAll em muitos casos, pode ser mais eficiente e é mais fácil de ler.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Outra consideração é que ForAll não é delegável enquanto outras funções podem ser, como Filtrar.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

DelegaçãoDelegation

When used with a data source, this function can't be delegated. Only the first portion of the data source will be retrieved and then the function applied. The result may not represent the complete story. A blue dot will appear at authoring time to remind you of this limitation and to suggest switching to delegable alternatives where possible. For more information, see the delegation overview.

SintaxeSyntax

ForAll( Table, Formula )ForAll( Table, Formula )

  • Table – Obrigatório.Table - Required. Tabela na qual atuar.Table to be acted upon.
  • Formula – Obrigatório.Formula - Required. A fórmula para avaliar todos os registros da tabela.The formula to evaluate for all records of the Table.

ExemplosExamples

CálculosCalculations

Os exemplos a seguir usam a fonte de dados Squares:The following examples use the Squares data source:

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:To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Squares, [ "1", "4", "9" ] )ClearCollect( Squares, [ "1", "4", "9" ] )
FórmulaFormula DescriçãoDescription ResultadoResult
ForAll( Squares, Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
Para todos os registros da tabela de entrada, calcula a raiz quadrada da coluna Valor.For all the records of the input table, calculates the square root of the Value column. A função Sqrt também pode ser usada com uma tabela de coluna única, tornando possível executar este exemplo sem usar ForAll.The Sqrt function can also be used with a single-column table, making it possible perform this example without using ForAll.
ForAll( Squares, Power( Value, 3 ) )ForAll( Squares, Power( Value, 3 ) ) Para todos os registros da tabela de entrada, eleva a coluna Valor à terceira potência.For all the records of the input table, raises the Value column to the third power. A função Power não oferece suporte a tabelas de coluna única.The Power function does not support single-column tables. Portanto, ForAll deve ser usado nesse caso.Therefore, ForAll must be used in this case.

Usar um conexãoUsing a connection

Os exemplos a seguir usam a fonte de dados Expressões:The following examples use the Expressions data source:

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:To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

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

Este exemplo também usa uma conexão do Microsoft Translator.This example also uses a Microsoft Translator connection. Para adicionar essa conexão ao seu aplicativo, consulte o tópico sobre como gerenciar conexões.To add this connection to your app, see the topic about how to manage connections.

FórmulaFormula DescriçãoDescription ResultadoResult
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )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").For all the records in the Expressions table, translate the contents of the Value column into Spanish (abbreviated "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) )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").For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Copiando uma tabelaCopying a table

Às vezes, você precisa filtrar, criar forma, classificar e manipular dados.Sometimes you need to filter, shape, sort, and manipulate data. O PowerApps fornece uma série de funções para fazer isso, como Filtrar, AdicionarColunas e Classificar.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. O PowerApps trata cada tabela como um valor, permitindo que ela flua por fórmulas e seja consumida facilmente.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

E, em algum momento, você desejará fazer uma cópia desse resultado para uso posterior.And sometime you will want to make a copy of this result for later use. Ou, desejará mover informações de uma fonte de dados para outra.Or you will want to move information from one data source to another. O PowerApps fornece a função Coletar para copiar dados.PowerApps provides the Collect function to copy data.

No entanto, antes de fazer essa cópia, pense cuidadosamente se ela é realmente necessária.But before you make that copy, think carefully if it is really needed. Muitas situações podem ser tratadas por filtragem e modelagem da fonte de dados subjacente sob demanda com uma fórmula.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. Algumas das desvantagens de fazer uma cópia incluem:Some of the downsides to making a copy include:

  • Duas cópias das mesmas informações significa que uma delas pode ficar fora de sincronia.Two copies of the same information means that one of them can fall out of sync.
  • Fazer uma cópia pode consumir muita memória do computador, largura de banda de rede e/ou tempo.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • Para a maioria das fontes de dados, a cópia não pode ser delegada, limitando a quantidade de dados que pode ser movida.For most data sources, copying cannot be delegated, limiting how much data can be moved.

Os exemplos a seguir usam a fonte de dados Produto:The following examples use the Products data source:

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:To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • 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 } ) )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:Our goal is to work with a derivative table that includes only the items where more has been requested than is available, and for which we need to place an order:

Podemos executar esta tarefa de duas maneiras diferentes, que produzem o mesmo resultado com vários prós e contras.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Modelagem de tabela sob demandaTable shaping on demand

Não faça essa cópia!Don't make that copy! Podemos usar a fórmula a seguir sempre que necessário:We can use the following formula anywhere we need:

  • ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )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.A record scope is created by the Filter and AddColumns functions to perform the comparison and subtraction operations, respectively, with the 'Quantity Requested' and 'Quantity Available' fields of each record.

Neste exemplo, a função Filtrar pode ser delegada.In this example, the Filter function can be delegated. 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.This is important, as it can find all the products that meet the criteria, even if that is only a few records out of a table of millions. Neste momento, MostrarColunas e AdicionarColunas não podem ser delegados, portanto, o número real de produtos que precisam ser pedidos será limitado.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Se você souber que o tamanho do resultado sempre será relativamente pequeno, não haverá problemas em usar essa abordagem.If you know the size of this result will always be relatively small, this approach is fine.

E como não fazemos uma cópia, não haverá uma cópia adicional das informações para gerenciar ou que fique ultrapassada.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

ForAll sob demandaForAll on demand

Outra abordagem é usar a função ForAll para substituir as funções de modelagem de tabela:Another approach is to use the ForAll function to replace the table-shaping functions:

  • ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )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.This formula may be simpler for some people to read and write.

Nenhuma parte do ForAll é delegável.No part of the ForAll is delegable. A primeira parte da tabela Produtos será avaliada, o que poderá ser um problema se essa tabela for muito grande.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Como Filtrar pode ser delegado no exemplo anterior, ele pode funcionar mais bem com grandes conjuntos de dados.Because Filter could be delegated in the previous example, it could work better with large data sets.

Coletar o resultadoCollect the result

Em algumas situações, uma cópia dos dados pode ser necessária.In some situations, a copy of data may be required. É possível mover informações de uma fonte de dados para outra.You may need to move information from one data source to another. Neste exemplo, os pedidos são colocados por meio de uma tabela NewOrder no sistema de um fornecedor.In this example, orders are placed through a NewOrder table on a vendor's system. 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.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Podemos usar a mesma modelagem de tabela como nos dois exemplos anteriores, mas podemos capturar o resultado em uma coleção:We use the same table shaping as the previous two examples, but we capture the result into a collection:

  • ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )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( 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.ClearCollect and Collect can't be delegated. Como resultado, a quantidade de dados que podem ser movidos dessa maneira é limitada.As a result the amount of data that can be moved in this manner is limited.

Coletar dentro de ForAllCollect within ForAll

Por fim, podemos executar Coletar diretamente dentro de ForAll:Finally, we can perform the Collect directly within the ForAll:

  • Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )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.Again, the ForAll function can't be delegated at this time. Se nossa tabela Produtos for grande, ForAll examinará apenas o primeiro conjunto de registros e talvez perderemos alguns produtos que precisam ser solicitados.If our Products table is large, ForAll will look at the first set of records only and we may miss some products that need to be ordered. Mas para tabelas que sabemos que permanecerão pequenas, essa abordagem é suficiente.But for tables that we know will remain small, this approach is fine.

Observe que não estamos capturando o resultado de ForAll.Note that we are not capturing the result of the 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.The Collect function calls made from within it will return the NewOrder data source for all the records, which could add up to a lot of data if we were capturing it.