Uma construtora com 1.200 funcionários usava há oito meses um app de ordens de serviço feito sobre uma lista do SharePoint. Em uma segunda-feira, os técnicos deixaram de ver as ordens antigas. Ninguém recebeu erro. A lista tinha acabado de passar de 500 itens, e a fórmula da galeria filtrava por um campo que o SharePoint não consegue filtrar sozinho. O app baixava os 500 primeiros registros, aplicava o filtro neles e mostrava o que sobrava.
Eu já atendi esse chamado mais vezes do que gostaria, e a causa é sempre a mesma: delegação. Este post explica o que é, como enxergar o problema antes de ir para produção e como reescrever as fórmulas.
O que é delegação e de onde vem o 500
Quando a galeria tem Items igual a Filter(Pedidos, ...), o Power Apps tenta traduzir a fórmula para uma consulta que a fonte de dados executa. A fonte filtra, ordena e devolve só o que interessa, em páginas de 100 registros conforme a pessoa rola a tela. Isso é delegar. Funciona para milhões de linhas porque o trabalho acontece no servidor.
Quando a fórmula usa algo que a fonte não entende, o Power Apps faz o que consegue: baixa os primeiros registros até o limite de linhas de dados, que é 500 por padrão, e aplica a fórmula localmente. Tudo que estiver depois do registro 500 deixa de existir para o app. Sem erro e sem aviso em tempo de execução.
O limite é configurável em Configurações, na opção de limite de linhas para consultas não delegáveis. A documentação de outubro de 2026 indica 10.000 como teto (antes eram 2.000). Subir o valor faz o app baixar mais dados em toda consulta não delegável, inclusive no celular com rede ruim, e só adia o dia em que a lista passa do novo número.
Antes e depois: fórmulas que delegam no SharePoint
A fórmula abaixo é delegável no SharePoint. Igualdade em coluna de escolha (Status.Value), igualdade no e-mail de uma coluna de pessoa e o operador && são traduzidos para a consulta. A galeria mostra todos os pedidos abertos da pessoa, estejam eles na linha 10 ou na linha 40.000.
Items da galeria: delegável no SharePointpowerfx
// Tudo roda no SharePoint: escolha por igualdade, pessoa por e-mail, && entre condições
Filter(
Pedidos,
Status.Value = "Aberto" && Solicitante.Email = User().Email
)Os dois casos abaixo aparecem em quase toda revisão de app que fazemos. O primeiro usa o operador in para testar se o status está em uma coleção local; o SharePoint não executa isso. O segundo faz busca por texto digitado em uma coluna de pessoa, que também fica fora da delegação.
Antes e depoispowerfx
// ANTES: in com coleção local. Aviso de delegação, para em 500.
Filter(Pedidos, Status.Value in colStatusAbertos.Value)
// DEPOIS: condições explícitas, delegável
Filter(
Pedidos,
Status.Value = "Aberto" || Status.Value = "Em análise"
)
// ANTES: busca com in em coluna de pessoa. Não delega no SharePoint.
Filter(Pedidos, txtBusca.Text in Solicitante.DisplayName)
// DEPOIS: StartsWith em coluna de texto (Title), delegável
Filter(Pedidos, StartsWith(Title, txtBusca.Text))
// DEPOIS (quando precisa ser por pessoa): seletor e igualdade no e-mail
Filter(Pedidos, Solicitante.Email = cmbPessoa.Selected.Mail)A versão corrigida troca a coleção por condições explícitas e move a busca para uma coluna de texto com StartsWith, que o SharePoint delega. Se a busca precisa mesmo ser por pessoa, a saída é um seletor de pessoa e igualdade no e-mail, em vez de texto livre.
O que cada fonte delega
A tabela resume o que vemos em projeto, de forma conservadora. Cada conector tem uma tabela oficial com detalhes por tipo de coluna, e ela muda; o link está nas fontes.
| Função ou operador | SharePoint | Dataverse | SQL Server |
|---|---|---|---|
| Filter e LookUp com =, <>, <, >, && e || | |||
| Search (busca em texto) | Só colunas de texto | ||
| StartsWith | |||
| in (texto dentro de uma coluna) | |||
| in com coleção ou tabela | |||
| Sort e SortByColumns | Colunas simples | ||
| Sum, Average, Min e Max | |||
| CountRows e CountIf | Confira a tabela oficial | ||
| Distinct | Confira a tabela oficial | Confira a tabela oficial | |
| Coluna de pessoa ou de pesquisa (lookup) no Filter | Só igualdade, em alguns subcampos | Igualdade com o registro; subcampos não | Não se aplica |
No SharePoint, o tipo da coluna importa tanto quanto a função. Colunas de pessoa, de escolha com vários valores e de pesquisa aceitam pouca coisa além de igualdade. Colunas calculadas do SharePoint não são filtráveis pelo app. Quando a lista passa de 5.000 itens, entra outro limite, o de exibição de lista do próprio SharePoint, que exige colunas indexadas para o filtro funcionar. Quando trocar a planilha por um app tem o contexto de quando a lista é a base certa.
Quando a regra não cabe na fórmula, leve a regra para o Dataverse
Uma parte dos avisos vem de contas feitas dentro do Filter: diferença de datas, texto concatenado, condição que depende de três colunas. A primeira saída é tirar a conta de dentro da comparação: a coluna fica de um lado, e a expressão calculada localmente fica do outro. A segunda é criar a regra na própria tabela, com uma coluna de fórmula no Dataverse, e filtrar por ela como por qualquer coluna. Exibições (views) do Dataverse também valem: o app usa a exibição como fonte e o filtro pesado roda no servidor.
Regra no lado escalar e coluna de fórmula no Dataversepowerfx
// ANTES: função de data dentro do Filter. Não delega.
Filter(Pedidos, DateDiff('Data de abertura', Today(), TimeUnit.Days) > 30)
// DEPOIS: a conta sai do Filter, a comparação fica simples e delegável
Filter(Pedidos, 'Data de abertura' < DateAdd(Today(), -30, TimeUnit.Days))
// Regra com várias colunas: crie uma coluna de fórmula na tabela
// (no Dataverse: 'Valor total' = Quantidade * 'Preço unitário')
// e filtre por ela como por qualquer outra coluna
Filter(Pedidos, 'Valor total' > 5000)Esse é um dos motivos para escolher Dataverse quando a tabela vai crescer. Além de delegar contagem e soma, ele aceita regras no lado do servidor. A comparação completa está em SharePoint ou Dataverse.
Paginar com coleções: só quando não houver saída
Existe um padrão para trazer mais de 500 registros para uma coleção: dividir a lista por faixas de ID, que é uma coluna que o SharePoint delega, e coletar lote a lote. Funciona, é lento e perde registros apagados nas faixas. Use para um relatório pontual ou uma exportação, nunca como base da galeria principal.
OnVisible: lotes por faixa de ID, último recursopowerfx
// Carrega até 5 lotes de 500 registros, por faixa de ID
Clear(colPedidos);
ForAll(
Sequence(5) As lote,
Collect(
colPedidos,
Filter(
Pedidos,
ID > (lote.Value - 1) * 500 && ID <= lote.Value * 500
)
)
)Cada Collect também respeita o limite de linhas, por isso as faixas têm 500 IDs. Se a lista tem muitos itens apagados, os lotes voltam incompletos e o total fica abaixo do esperado; some um lote a mais e confira o CountRows da coleção no fim.
O que vemos em revisão de app
Faça
- Tratar todo aviso de delegação como erro antes de publicar. O App Checker lista todos de uma vez.
- Filtrar por colunas simples e indexadas: ID, data, texto, número e e-mail de pessoa com igualdade.
- Testar com uma lista de 3.000 itens de teste antes de ir para produção. O limite só aparece com volume.
- Mover regra de negócio para a fonte: exibição no Dataverse, coluna de fórmula, coluna indexada no SharePoint.
- Escolher Dataverse quando a tabela vai passar de alguns milhares de linhas e precisa de soma ou contagem.
Evite
- Subir o limite para 10.000 e seguir em frente. O app fica mais lento no celular e o problema volta no mês seguinte.
- Usar in com coleção para filtrar uma lista grande. Troque por condições com || ou por uma coluna na fonte.
- Fazer Search ou in em coluna de pessoa, escolha ou pesquisa no SharePoint.
- Carregar a lista inteira em uma coleção no OnStart para filtrar depois. Além do limite, o app demora para abrir.
- Contar registros com CountRows(Filter(...)) no SharePoint. O número para em 500 e ninguém percebe.
O próximo passo é abrir o App Checker do app mais usado da sua área e contar os avisos de delegação. Para cada um, decida: reescrever a fórmula, indexar e filtrar por outra coluna, ou mover a tabela para o Dataverse. Em padrões de Power Apps que não quebram estão os outros cuidados que evitam o chamado de segunda-feira, e a Formação Power Apps tem um módulo inteiro de delegação e desempenho com apps reais.
Fontes
- Microsoft Learn: visão geral de delegação em apps de tela (limite padrão e teto configurável)
- Microsoft Learn: funções e operações delegáveis no conector do SharePoint
- Microsoft Learn: delegação no Dataverse
- Microsoft Learn: conector do SQL Server (seção de delegação)
- Microsoft Learn: dicas de desempenho em apps de tela
- Microsoft: limite de exibição de lista do SharePoint (5.000 itens)
Preços, nomes de plano e limites mudam. Confira sempre a tabela oficial da Microsoft antes de decidir.
Perguntas frequentes
O que mais perguntam sobre este assunto
- O que significa o aviso de delegação no Power Apps?
- Que parte da fórmula não pode ser executada pela fonte de dados e será aplicada só nos primeiros registros baixados, 500 por padrão. O aviso aparece como um sublinhado azul no trecho e um triângulo ao lado da barra de fórmulas. O app publica normalmente, e o problema só aparece quando a tabela passa do limite.
- Aumentar o limite de 500 para 2.000 ou mais resolve?
- Adia. O teto indicado na documentação de outubro de 2026 é 10.000, e cada consulta não delegável passa a baixar até esse volume, o que deixa o app mais lento, principalmente no celular. Quando a tabela passa do novo limite, os registros voltam a sumir. A correção é tornar a fórmula delegável ou trocar a fonte.
- SharePoint ou Dataverse delega melhor?
- Dataverse. Ele delega filtros em quase todos os tipos de coluna, ordenação, StartsWith, in em texto, Sum, Average, Min, Max, CountRows e CountIf. O SharePoint delega Filter, LookUp, Sort, Search em texto e StartsWith, com restrições em coluna de pessoa, escolha e pesquisa, e sem agregações. Para tabelas que vão passar de alguns milhares de linhas e precisam de totais, Dataverse é a base certa.
- Como contar registros no Power Apps sem estourar o limite?
- No Dataverse, CountRows e CountIf são delegáveis e funcionam em qualquer volume. No SharePoint a contagem é local: CountRows(Filter(...)) para em 500. As saídas são manter o subconjunto contado abaixo do limite com filtros delegáveis, guardar o total em outra lista atualizada por um fluxo do Power Automate, ou mostrar '500+' e deixar a contagem exata para um relatório.

