Toda vez que o app navega para outra tela, vai buscar dados do Dataverse de novo. Isso gera lentidão e consumo desnecessário de chamadas de API. Variáveis e coleções resolvem isso — guardam dados localmente, passam informações entre telas e controlam o estado da interface sem ir ao servidor toda hora.
Ao final, o app vai carregar os casos uma única vez em uma coleção local, usar variáveis para controlar filtros ativos e estados de carregamento, e passar dados entre telas sem query ao Dataverse.
| Função | Escopo | Tipo de dado | Quando usar |
|---|---|---|---|
Set() | App inteiro | Qualquer tipo | Estado global: usuário logado, filtro ativo, modo dark/light |
UpdateContext() | Tela atual | Qualquer tipo | Estado local: loading spinner, erro de validação, tab selecionada |
Collect() | App inteiro | Tabela de registros | Cache de dados do Dataverse, seleção múltipla, dados offline |
OnStart:Collect(colCasos, Filter(Cases, statecode = 0));
Set(varUsuario, User());
Set(varFiltroAtivo, "Todos")O OnStart roda uma vez quando o app é aberto. Os casos são carregados em colCasos — uma coleção local em memória. Nas telas, substitua Cases por colCasos para evitar chamadas repetidas ao Dataverse.
Na propriedade OnVisible de uma tela que carrega dados pesados:
UpdateContext({locLoading: true});
ClearCollect(colCasos, Filter(Cases, statecode = 0));
UpdateContext({locLoading: false})Adicione um ícone de spinner na tela:
locLoading!locLoadingloc para variáveis locais (UpdateContext), var para globais (Set), e col para coleções (Collect). Isso torna o código muito mais legível quando você tem dezenas de variáveis.
Adicione botões de filtro rápido na tela de lista — Alta, Normal, Baixa, Todos:
Set(varFiltroAtivo, "Alta")Set(varFiltroAtivo, "Todos")Na gallery, atualize a fórmula Items para usar o filtro:
If(
varFiltroAtivo = "Todos",
colCasos,
Filter(colCasos, prioritycode = Switch(varFiltroAtivo, "Alta", 1, "Normal", 2, "Baixa", 3))
)Agora os filtros funcionam instantaneamente — sem nenhuma chamada ao Dataverse — porque estão filtrando a coleção local.
Cenário: o agente quer selecionar vários casos e atribuí-los em lote.
Clear(colSelecionados)If(
ThisItem.caseid in colSelecionados.caseid,
Remove(colSelecionados, ThisItem),
Collect(colSelecionados, ThisItem)
)If(ThisItem.caseid in colSelecionados.caseid, RGBA(91,141,239,0.1), RGBA(0,0,0,0))in verifica se um valor existe em uma coleção — equivalente ao Contains() mas mais legível. ThisItem.caseid in colSelecionados.caseid verifica se o ID do caso atual está na coluna caseid da coleção de selecionados.Quando o usuário cria ou edita um caso, a coleção local precisa refletir as mudanças. Há duas abordagens:
ClearCollect(colCasos, Filter(Cases, statecode = 0))Collect(colCasos, LookUp(Cases, caseid = varCasoEditado.caseid))As coleções do Power Apps vivem na memória — fechou o app, perdeu os dados. Para dados que precisam persistir entre sessões (preferências do usuário, dados offline), use SaveData(colecao, "nomeArquivo") e LoadData(colecao, "nomeArquivo").
SaveData(colCasosPendentes, "casosPendentes")LoadData(colCasosPendentes, "casosPendentes", true) (no OnStart)