Função ForAll

Aplica-se a: Aplicações de tela Fluxos de ambiente de trabalho Aplicações condicionadas por modelo Power Platform CLI

Calcula valores e realiza ações para todos os registos numa tabela.

Descrição

A função ForAll avalia uma fórmula para todos os registos numa 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.

Utilize a função Sequence com a função ForAll para iterar baseada numa 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 valor único, a tabela resultante será uma tabela de uma só coluna. Se o resultado for um registo, a tabela resultante conterá registos com as mesmas colunas que o registo do resultado.

Se o resultado for um valor blank, não há registos na tabela resultante relativa a esse registo de entrada. Neste caso, haverá menos registos na tabela resultante 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 pode modificar a tabela que é o alvo da função ForAll.

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 este motivo, não pode utilizar as funções UpdateContext, Clear e ClearCollect numa função ForAll, pois poderiam ser facilmente utilizadas para conter variáveis que seriam suscetíveis para este 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. Estes valores de retorno podem ser grandes e consumir recursos significativos se forem devolvidos para todos os registos da tabela ForAll. Também poderá achar que estes valores não são aqueles que esperava, porque ForAll pode funcionar em paralelo e pode separar os efeitos secundários destas funções, impedindo-as de obterem os respetivos resultados. Se o valor de retorno de ForAll não for utilizado, que é muitas vezes o caso com as funções de modificação de dados, esse valor não será criado e não haverá lugar a preocupações relativas a recursos ou ordenações. Contudo, se utilizar o resultado de uma função ForAll e uma das funções que devolvem uma origem de dados, pense cuidadosamente em como estruturar o resultado e experimente primeiro em pequenos conjuntos de dados.

Alternativas

Muitas funções do Power Apps podem processar mais de um valor ao mesmo tempo mediante a utilização de uma tabela de coluna única. Por exemplo, a função Len pode processar uma tabela de valores de texto, devolvendo uma tabela de comprimentos, da mesma forma que ForAll faria. Esta alternativa pode eliminar a necessidade de utilizar ForAll em muitos casos, pode ser mais eficiente e mais fácil de ler.

Outra consideração é que ForAll não pode ser delegada, ao passo que outras funções o podem ser, como Filter.

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( Table, Formula )

  • Table – Obrigatório. Tabela onde vai ser executada a função.
  • Formula – 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:

Exemplo de quadrados.

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( Squares, Sqrt( Value ) )

Sqrt( Squares )
Calcula a raiz quadrada da coluna Value de todos os registos da tabela de entrada. A função Sqrt também pode ser utilizada com tabelas de uma só coluna, o que permite realizar este exemplo sem usar ForAll. Exemplo de Sqrt.
ForAll( Squares, Power( Value, 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 uma só coluna. Por conseguinte, ForAll tem de ser utilizado neste caso. Exemplo de Poder.

Utilizar uma ligação

Os exemplos seguintes utilizam a origem de dadosExpressions:

Exemplo de expressões.

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( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Traduz os conteúdos da coluna Value para espanhol (abreviado para “es”) de todos os registos da tabela Expressions. Exemplo com valor
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Traduz os conteúdos da coluna Value para francês (abreviado para “fr”) de todos os registos da tabela Expressions. Exemplo com valor

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-lhe fluir através de fórmulas e ser facilmente consumida.

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 a cópia, pense cuidadosamente se é necessária. É 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.
  • Na maioria das origens de dados, a criação de cópias não pode ser delegada, o que limita a quantidade de dados que podem ser movidos.

Os exemplos seguintes utilizam a origem de dadosProducts:

Exemplo de origem de dados de produtos.

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:

Exemplo da tabela derivada.

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. Neste momento, ShowColumns e AddColumns não podem ser delegadas, pelo que o número real de produtos que têm de ser ordenados será limitado. Se souber que o tamanho deste resultado será sempre relativamente pequeno, esta abordagem é adequada.

E visto que não fizemos uma cópia, não é necessário fazer a gestão de cópias adicionais das informações nem se corre o risco de tais cópias ficarem desatualizadas.

ForAll a pedido

Outra abordagem é utilizar 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 achar esta fórmula mais fácil de ler e escrever.

Nenhuma parte de ForAll pode ser delegada. Só será avaliada a primeira parte da tabela Produtos, o que poderá constituir um problema se esta 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 alta velocidade por parte dos utilizadores, poderá querer colocar em cache uma cópia local de uma tabela, para que não haja latência de 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.

Recolher com ForAll

Por fim, podemos realizar a função Collect diretamente em 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 atualmente. Se a tabela Produtos for grande, ForAll olha apenas para o primeiro conjunto de registos e poderemos perder alguns produtos que têm de ser encomendados. Mas esta abordagem é adequada para as tabelas que sabemos que vão permanecer pequenas.

Tenha em atenção não estamos a reunir o resultado de ForAll. As chamadas da função Collect feitas a partir deste vão devolver a origem de dados NewOrder de todos os registos, o que pode devolver muitos dados se estivermos a reunir o resultado do mesmo.

Mapear tabela num componente

Ver Mapear tabelas.