Pular para o conteúdo
Conteúdo
Guia9 min de leitura

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: Filter com =, <>, >, <, StartsWith, And, Or
  • Não delega no SharePoint: in, Search, CountRows sobre filtro, Sum sobre filtro, campos calculados
  • LookUp delega, e é a forma mais barata de trazer um registro só

Filtrar de um jeito que escala

text
// ❌ 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:

text
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.

text
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.

text
// 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.

text
// ❌ 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 inteiro
  • UpdateContext(): só na tela atual; prefira quando o dado não precisa viajar
  • With(): 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.

text
Concurrent(
    ClearCollect(colClientes, Clientes),
    ClearCollect(colProdutos, Produtos),
    Set(varUsuario, User())
)

Tecnologias e temas

Power AppsBoas PráticasPower AppsPower FxSharePoint OnlineDataverse

Materiais

  • DocumentoTabela de delegação por conector (PDF)Referência rápida: o que delega em SharePoint, Dataverse e SQLem breve

Conteúdos relacionados