Power Apps: fórmulas na prática
As fórmulas que resolvem 90% dos apps internos, e as três armadilhas que fazem um app funcionar com 200 registros e travar com 3.000.
O problema
Seu app funciona perfeitamente durante o teste e fica lento (ou passa a mostrar dados errados) quando a lista cresce. Na maioria dos casos o culpado não é a fórmula estar errada, e sim ela não ser delegável: o Power Apps baixa só os 500 ou 2.000 primeiros registros e calcula em cima desse pedaço.
Power Fx parece Excel, e é justamente por isso que engana. No Excel a planilha inteira está na memória. Num app, os dados estão do outro lado da rede, e nem toda função sabe pedir ao servidor que ele faça o trabalho.
Delegação: a regra que importa
Delegável é a função que o Power Apps consegue traduzir para o servidor. Não delegável é a que obriga o app a baixar os registros e filtrar no dispositivo, limitado ao seu *Limite de linhas de dados*, que por padrão é 500.
- Delega no SharePoint:
Filtercom=,<>,>,<,StartsWith,And,Or - Não delega no SharePoint:
in,Search,CountRowssobre filtro,Sumsobre filtro, campos calculados LookUpdelega, e é a forma mais barata de trazer um registro só
Filtrar de um jeito que escala
// ❌ não delega: 'in' força download
Filter(Chamados, Status in ["Aberto", "Em análise"])
// ✅ delega
Filter(Chamados, Status = "Aberto" || Status = "Em análise")Para busca por texto digitado, StartsWith delega e Search não:
Filter(Clientes, StartsWith(RazaoSocial, txtBusca.Text))With(): calcule uma vez, use várias
Toda vez que você repete uma expressão numa propriedade, ela é reavaliada. With cria um escopo nomeado e resolve isso, além de deixar a fórmula legível.
With(
{ cliente: LookUp(Clientes, ID = varClienteId) },
cliente.RazaoSocial & " - " & cliente.Cidade & "/" & cliente.UF
)Patch em vez de SubmitForm
SubmitForm é prático, mas amarra a gravação ao formulário. Patch grava exatamente o que você quiser, de onde quiser, inclusive de várias telas.
// Criar
Patch(Chamados, Defaults(Chamados), {
Titulo: txtTitulo.Text,
Status: "Aberto",
AbertoEm: Now()
});
// Atualizar
Patch(Chamados, LookUp(Chamados, ID = varId), { Status: "Concluído" })ForAll não é um laço
Essa é a confusão mais cara do Power Fx. ForAll retorna uma tabela. Ele não executa passo a passo como um for de linguagem imperativa, e a ordem não é garantida.
// ❌ contador não funciona como você espera
ForAll(Itens, Set(varTotal, varTotal + Valor));
// ✅ some direto
Set(varTotal, Sum(Itens, Valor));
// ✅ gravação em lote: uma chamada só
Patch(Pedidos, ForAll(colCarrinho, { Produto: Nome, Qtd: Quantidade }))Variáveis: qual usar
Set(): variável global, vale no app inteiroUpdateContext(): só na tela atual; prefira quando o dado não precisa viajarWith(): escopo de uma fórmula; nem chega a ser variável, e é a mais barata
OnStart: carregue em paralelo
Chamadas sequenciais no OnStart somam latência. Concurrent dispara tudo junto e espera o mais lento. Costuma cortar o tempo de abertura pela metade.
Concurrent(
ClearCollect(colClientes, Clientes),
ClearCollect(colProdutos, Produtos),
Set(varUsuario, User())
)Tecnologias e temas
Materiais
- DocumentoTabela de delegação por conector (PDF)Referência rápida: o que delega em SharePoint, Dataverse e SQLem breve
Conteúdos relacionados
Power Apps × Power Automate × Copilot Studio: qual usar em cada caso
As três ferramentas resolvem problemas diferentes e são vendidas como se fossem intercambiáveis. Um critério de decisão em uma pergunta, e o que acontece quando você escolhe errado.
Como tratar imagens de listas do SharePoint no Power Automate
A coluna do tipo Imagem não devolve um arquivo, e sim um JSON. Como ler esse JSON, buscar o binário e anexar a imagem em um e-mail ou PDF sem o fluxo quebrar.