Dynamics do Zero ao PRO · Lição 28 de 48 · Módulo 4

LIÇÃO 28Variáveis, Coleções e Dados Locais

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.

🎯

Resultado desta lição

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.

Set, UpdateContext e Collect — quando usar cada um

FunçãoEscopoTipo de dadoQuando usar
Set()App inteiroQualquer tipoEstado global: usuário logado, filtro ativo, modo dark/light
UpdateContext()Tela atualQualquer tipoEstado local: loading spinner, erro de validação, tab selecionada
Collect()App inteiroTabela de registrosCache de dados do Dataverse, seleção múltipla, dados offline
Regra prática: Se o dado precisa sobreviver à navegação entre telas → Set() ou Collect(). Se o dado é descartável ao sair da tela → UpdateContext(). Se é uma lista de registros → Collect(). Se é um valor simples → Set() ou UpdateContext().

Passo a passo

  1. Cache os casos em uma coleção no OnStart do app

    → Clique fora de qualquer tela no editor (seleciona o App)
    → Propriedade 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.

    Limite do OnStart: O OnStart bloqueia o app até terminar. Coleções grandes demoram para carregar — o usuário vê uma tela em branco. Para dados muito grandes, prefira carregar na navegação para cada tela com ClearCollect() e mostre um indicador de carregamento.
  2. Use UpdateContext para o loading spinner

    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:

    Visible do spinner: locLoading
    Visible da gallery: !locLoading
    loc como prefixo de convenção: Use o prefixo loc 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.
  3. Implemente filtros locais com Set()

    Adicione botões de filtro rápido na tela de lista — Alta, Normal, Baixa, Todos:

    OnSelect do botão "Alta":
    Set(varFiltroAtivo, "Alta")

    OnSelect do botão "Todos":
    Set(varFiltroAtivo, "Todos")

    Na gallery, atualize a fórmula Items para usar o filtro:

    Items da gallery:
    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.

  4. Implemente seleção múltipla com Collect()

    Cenário: o agente quer selecionar vários casos e atribuí-los em lote.

    Inicializar coleção vazia no OnStart:
    Clear(colSelecionados)

    OnSelect de cada linha da gallery (toggle de seleção):
    If( ThisItem.caseid in colSelecionados.caseid, Remove(colSelecionados, ThisItem), Collect(colSelecionados, ThisItem) )

    Cor de fundo da linha (selecionada vs. não selecionada):
    If(ThisItem.caseid in colSelecionados.caseid, RGBA(91,141,239,0.1), RGBA(0,0,0,0))
    in operator: O operador 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.
  5. Atualizar a coleção após Patch()

    Quando o usuário cria ou edita um caso, a coleção local precisa refletir as mudanças. Há duas abordagens:

    Opção A — Recarregar tudo (simples):
    ClearCollect(colCasos, Filter(Cases, statecode = 0))
    Execute após o Patch() bem-sucedido. Recarrega toda a coleção do Dataverse.

    Opção B — Atualizar só o registro modificado (performático):
    Collect(colCasos, LookUp(Cases, caseid = varCasoEditado.caseid))
    Adiciona o registro atualizado à coleção sem recarregar os outros.
    Use a Opção B para apps com muitos registros: Recarregar centenas de registros após cada edição é lento. Atualizar só o registro modificado mantém a coleção consistente sem impacto de performance.

Checklist

SaveData() e LoadData() — dados que sobrevivem ao fechamento do app

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").

Salvar dados localmente: SaveData(colCasosPendentes, "casosPendentes")
Restaurar na abertura: LoadData(colCasosPendentes, "casosPendentes", true) (no OnStart)

Limitação: SaveData/LoadData funcionam apenas no app mobile (iOS/Android) — não no navegador. Para web, use o Dataverse ou uma coleção que é recarregada no OnStart.
Foto de Pablo Maruk
Pablo Maruk
Analista Funcional de Dynamics · 16 anos de TI · EUA & Europa