Dynamics do Zero ao PRO · Lição 24 de 48 · Módulo 3

LIÇÃO 24 Loops, Condições Avançadas e Tratamento de Erros

Você criou fluxos que funcionam no caminho feliz. Esta lição cobre o que acontece quando as coisas dão errado — e como construir fluxos que sobrevivem a erros, processos paralelos e lógica condicional complexa sem virar um macarrão de setas.

🎯

Resultado desta lição

Ao final, você conhecerá os 4 padrões avançados do Power Automate mais usados em produção com Dynamics — Do Until, Scope para erros, Parallel Branch com timeout e OData com funções de data — e saberá quando aplicar cada um.

Padrões avançados do Power Automate

Padrão 1

Do Until

Loop que continua até uma condição ser satisfeita. Use quando não sabe quantas iterações serão necessárias — diferente do Apply to each, que itera sobre uma lista conhecida.

Padrão 2

Scope + Run After

Agrupa ações em blocos e define o que acontece quando o bloco falha. É o try/catch do Power Automate — captura erros sem derrubar o fluxo inteiro.

Padrão 3

Parallel Branch

Executa dois caminhos ao mesmo tempo. Usado para implementar timeout em aprovações: um branch aguarda a resposta, o outro conta o tempo. Quem terminar primeiro vence.

Padrão 4

OData Avançado

Filtros com funções de data, operadores lógicos compostos e expansão de entidades relacionadas. Reduz o número de chamadas ao Dataverse e melhora a performance.


Implementando cada padrão

  1. Padrão 1: Do Until — retry automático

    Cenário: você quer tentar atualizar um caso até conseguir, com no máximo 3 tentativas e 30 segundos entre cada uma.

    → + New step → Do Until

    Condição de parada:
    Variável Sucesso (Boolean) equals true

    Count: 3 (máximo de iterações)
    Timeout: PT2M (2 minutos — formato ISO 8601)

    Dentro do Do Until, adicione:

    1. Update a row (Dataverse)
    2. Set variable Sucesso = true (no lado "is successful" do run after)
    3. Delay — Count: 30, Unit: Second (no lado "has failed" do run after)
    Do Until vs. Apply to each: Apply to each itera sobre uma coleção — você sabe quantos itens tem. Do Until itera até uma condição ser verdadeira — você não sabe quantas vezes vai rodar. Use Do Until para polling, retry e processos que precisam "esperar" algo acontecer.
  2. Padrão 2: Scope para tratamento de erros

    O Scope é um container que agrupa ações. Quando configurado com "run after = has failed", ele funciona como um bloco catch — captura erros e executa ações de recuperação.

    → + New step → Scope
    Nome: Try — Atualizar Caso

    Dentro do Scope "Try", coloque as ações normais do fluxo.

    Adicione um segundo Scope fora do primeiro:

    → + New step → Scope
    Nome: Catch — Erro
    → Clique nos 3 pontos → Configure run after
    → Marque: has failed, has timed out, has been skipped

    Dentro do Scope "Catch", adicione:

    Send an email ao administrador
    Subject: ⚠️ Erro no fluxo [nome do fluxo]
    Body: result('Try_Atualizar_Caso') → detalhes do erro

    Create a new row (Dataverse · Log de Erros customizado)
    Registre: nome do fluxo, hora, mensagem de erro, ID do registro afetado
    result() expression: A expressão result('nome_do_scope') retorna um array com o status e detalhes de cada ação dentro do Scope. É a forma de acessar a mensagem de erro detalhada para incluir no log ou e-mail de alerta.
  3. Padrão 3: Parallel Branch com timeout

    Cenário: aprovação com timeout de 24 horas. Se o aprovador não responder, o fluxo cancela a solicitação automaticamente.

    Como criar Parallel Branch:
    → Clique na seta de conexão entre duas ações
    → Clique em + → Add a parallel branch
    → O segundo branch aparece ao lado do primeiro
    Sincronização dos branches: Por padrão, o fluxo só continua após o Parallel Branch quando AMBOS os branches terminam. Se quiser que só o primeiro que terminar importe (como no timeout), use o padrão de Terminate dentro do branch perdedor — isso encerra o fluxo quando o timeout ou a aprovação é concluída.
  4. Padrão 4: OData avançado com funções de data e expand

    Filtros OData simples você já viu nas lições anteriores. Aqui estão os filtros mais usados em produção com Dynamics.

    Filtrar por semana atual:

    createdon ge @{startOfWeek(utcNow())} and createdon le @{endOfWeek(utcNow())}

    Filtrar por múltiplos status com OR:

    statuscode eq 1 or statuscode eq 2 or statuscode eq 5

    Filtrar por texto no título (contains):

    contains(title, 'Motor') and statecode eq 0

    Expandir entidade relacionada (evitar Get a row por ID extra):

    Expand Query: customerid_contact($select=emailaddress1,fullname)

    Isso retorna os dados do contato do cliente junto com o caso — sem precisar de uma ação extra "Get a row by ID". O e-mail do contato fica disponível como customerid_contact/emailaddress1.
    Expand Query: É um dos recursos mais poderosos e menos conhecidos do List rows no Dataverse. Em vez de fazer duas chamadas (lista casos + busca contato por ID), você faz uma só com expand. Menos chamadas = fluxo mais rápido e menos risco de throttling.
  5. Aplicando os padrões: fluxo de aprovação com timeout + log de erros

    Vamos consolidar os padrões 2, 3 e 4 em um único fluxo real:

    Estrutura completa:
    1. Trigger: When a row is added (Cases, Priority = High)
    2. List rows com Expand Query: contato do cliente
    3. Scope "Try":
      a. Parallel Branch A: aprovação (Start and wait)
      b. Parallel Branch B: Delay 4h → Cancel
      c. Condition: Approved → Update caso
    4. Scope "Catch" (run after: failed/timed out):
      a. Send email ao admin com result()
      b. Add row na tabela de log de erros

    Este é o padrão profissional que você verá em implementações enterprise. Cada peça cobre um cenário de falha diferente — e o fluxo funciona de forma robusta mesmo em ambiente de produção com dados reais.

  6. Concorrência no Apply to each — processamento paralelo

    Por padrão, o Apply to each processa um item por vez. Para fluxos com muitos registros, isso é lento. Você pode processar múltiplos itens em paralelo:

    → No Apply to each, clique nos 3 pontos (...) → Settings
    Concurrency Control: On
    Degree of Parallelism: 10 (processa 10 itens ao mesmo tempo)
    Cuidado com variáveis em loops paralelos: Quando o Apply to each roda em paralelo, múltiplas iterações tentam modificar a mesma variável ao mesmo tempo — causando condições de corrida. Evite usar variáveis acumuladoras (como fizemos na Lição 21) em loops com concorrência ativada. Use concorrência apenas quando cada iteração é independente das outras.
  7. Terminate — encerrando o fluxo de dentro de um branch

    A ação Terminate encerra todo o fluxo imediatamente — seja com sucesso, falha ou cancelamento. É essencial para o padrão de Parallel Branch com timeout:

    → No branch que terminar primeiro (aprovação ou timeout):
    Após a ação final, adicione: Terminate
    Status: Succeeded (ou Failed se for tratamento de erro)

    Quando o Branch A (aprovação) termina, ele chama Terminate — o que faz o Branch B (delay) ser cancelado imediatamente, mesmo que ainda não tenha completado as 24 horas. Sem Terminate, ambos os branches precisariam completar antes do fluxo continuar.

    Terminate vs. Cancel approval: São coisas diferentes. Cancel approval cancela a solicitação de aprovação pendente no Teams. Terminate encerra o próprio fluxo. Em um cenário de timeout, você faz os dois: primeiro cancela a aprovação pendente, depois chama Terminate para encerrar o fluxo limpo.

Checklist

Throttling — o que fazer quando o Dataverse recusa chamadas

Em fluxos com alto volume (centenas de atualizações em sequência), o Dataverse pode retornar erro 429 (Too Many Requests). Isso se chama throttling — o serviço limita chamadas para proteger a estabilidade.

Como tratar throttling no Power Automate:
1. Ative a opção de retry automático na ação: Settings → Retry Policy → Exponential Interval
2. O Power Automate tentará automaticamente com espera crescente (30s, 60s, 120s)
3. Para volumes muito altos, considere dividir o processamento em lotes menores usando paginação no List rows e múltiplas execuções do fluxo.

Limite prático: O Dataverse suporta ~6000 API calls por 5 minutos por ambiente no plano padrão. Fluxos que processam mais do que isso em sequência precisam de throttling controlado.

O Módulo 4 começa na próxima lição, saindo do Power Automate e entrando no Power Apps — onde você vai construir interfaces para os dados que configuramos no Dataverse.

🏆

Módulo 3 concluído — Power Automate com Dynamics

Você passou por notificações, escalonamento, aprovação via Teams, e-mail to case, atualização em massa, integração Teams, pesquisa de satisfação e padrões avançados. O Módulo 4 começa na Lição 25 com Power Apps conectado ao Dynamics.

Foto de Pablo Maruk
Pablo Maruk
Analista Funcional de Dynamics · 16 anos de TI · EUA & Europa