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

LIÇÃO 26Criar e Editar Registros com Patch()

Na lição anterior você leu dados do Dynamics. Agora você vai escrever. O Patch() é a função central do Power Apps para criar e atualizar registros no Dataverse — uma função, dois comportamentos, infinitas aplicações.

🎯

Resultado desta lição

Ao final, o app terá uma tela de criação de novo caso (com campos de título, descrição e prioridade) e um botão na tela de detalhe para atualizar a prioridade do caso — tudo escrevendo direto no Dataverse via Patch().

Patch() — criar vs. atualizar

Criar novo registro

Patch() com Defaults()

Patch(
  Cases,
  Defaults(Cases),
  {
    title: txtTitulo.Text,
    prioritycode: 1,
    description: txtDesc.Text
  }
)
Atualizar registro existente

Patch() com LookUp()

Patch(
  Cases,
  LookUp(Cases,
    caseid = SelectedCase.caseid),
  {
    prioritycode: 1,
    statuscode: 5
  }
)

A diferença entre criar e editar é o segundo parâmetro: Defaults(Cases) cria um registro em branco e preenche os campos especificados. LookUp(Cases, caseid = ...) localiza o registro existente e atualiza apenas os campos especificados — os demais permanecem intocados.

Patch() só atualiza o que você especifica: Diferente de uma substituição completa, o Patch() é uma atualização parcial — como o PATCH do HTTP. Se você fizer Patch() com apenas o campo prioritycode, todos os outros campos do caso permanecem com seus valores originais.

Passo a passo

  1. Crie a tela de novo caso

    → Painel esquerdo → + New screen → Blank
    → Renomeie para: NovoCasoScreen

    Adicione os componentes:

    Label: "Novo Caso" (cabeçalho)
    Text Input → renomeie: txtTitulo · Hint: "Título do caso"
    Text Input → renomeie: txtDescricao · Mode: Multiline · Hint: "Descreva o problema"
    Dropdown → renomeie: drpPrioridade
    Button → renomeie: btnSalvar · Text: "Salvar Caso"
    Button → renomeie: btnCancelar · Text: "Cancelar"
  2. Configure o Dropdown de prioridade

    Items (Dropdown drpPrioridade):
    ["Alta", "Normal", "Baixa"]

    Quando o usuário selecionar uma opção, precisamos converter para o código numérico do Dynamics:

    Variável de conversão (criar no OnSelect do Dropdown):
    Set(varPrioridade, Switch(drpPrioridade.Selected.Value, "Alta", 1, "Normal", 2, "Baixa", 3))
    Switch() para converter valores: O Dataverse armazena prioridade como número (1, 2, 3). A interface mostra texto ("Alta", "Normal", "Baixa"). O Switch() faz a conversão entre os dois mundos — essencial sempre que você usa campos do tipo Choice.
  3. Configure o botão Salvar com Patch()

    Na propriedade OnSelect do btnSalvar:

    If( IsBlank(txtTitulo.Text), Notify("O título é obrigatório", NotificationType.Error), Patch( Cases, Defaults(Cases), { title: txtTitulo.Text, description: txtDescricao.Text, prioritycode: varPrioridade, caseorigincode: 3 } ); Navigate(ListaScreen, ScreenTransition.UnCover); Notify("Caso criado com sucesso!", NotificationType.Success) )
    Encadeamento com ponto e vírgula: No Power Fx, você pode encadear múltiplas ações no OnSelect separando por ;. Após o Patch(), Navigate() volta para a lista e Notify() exibe a mensagem de confirmação. As três ações executam em sequência.
  4. Configure o botão Cancelar

    OnSelect do btnCancelar:
    ResetForm(Form1); Navigate(ListaScreen, ScreenTransition.UnCover)

    O ResetForm() limpa todos os campos de entrada antes de navegar de volta — sem ele, os campos ficam preenchidos da última vez que o usuário abriu a tela.

  5. Adicione botão "+" na tela de lista para abrir a criação

    → Na ListaScreen, adicione um botão no canto superior direito
    Text: "+"
    OnSelect: Navigate(NovoCasoScreen, ScreenTransition.Cover)
  6. Adicione atualização de prioridade na tela de detalhe

    Na DetalheScreen (da Lição 25), adicione dois botões:

    Botão "Escalar para Alta":
    Patch( Cases, LookUp(Cases, caseid = SelectedCase.caseid), {prioritycode: 1} ); Notify("Caso escalado para Alta Prioridade", NotificationType.Success); Back()
    Botão "Marcar como Resolvido":
    Patch( Cases, LookUp(Cases, caseid = SelectedCase.caseid), {statecode: 1, statuscode: 5} ); Notify("Caso resolvido!", NotificationType.Success); Back()
    Alterar statecode requer statuscode compatível: No Dynamics, cada statecode tem um conjunto válido de statuscode. Para Resolved (statecode=1), o statuscode deve ser 5 (Problem Solved). Usar uma combinação inválida gera erro no Patch(). Consulte o Dataverse para ver as combinações permitidas.
  7. Adicione tratamento de erro no Patch()

    Para capturar erros do Patch() e mostrar mensagem ao usuário:

    If( IsError(Patch(Cases, Defaults(Cases), {title: txtTitulo.Text})), Notify("Erro ao criar caso: " & First(Errors(Cases)).Message, NotificationType.Error), Navigate(ListaScreen, ScreenTransition.UnCover) )
    Errors() e IsError(): IsError() verifica se a última operação gerou erro. Errors(tabela) retorna uma tabela com os erros — First(Errors(Cases)).Message pega a mensagem do primeiro erro. Fundamental para apps em produção onde o Dataverse pode rejeitar o registro por validação.

Checklist

SubmitForm() vs. Patch() — quando usar cada um

O Power Apps tem dois mecanismos para escrever dados: o Patch() que você acabou de usar e o SubmitForm() que funciona com o componente Edit Form.

Patch(): Controle total. Você especifica cada campo individualmente. Ideal quando precisa de lógica condicional antes de salvar, ou quando quer salvar apenas alguns campos.

SubmitForm(): O formulário coleta todos os campos e salva automaticamente. Mais simples, menos controle. Bom para formulários CRUD completos onde todos os campos devem ser salvos juntos.

Na Lição 27 você vai trabalhar com o componente Edit Form — que usa SubmitForm() e gera automaticamente os campos com base na tabela do Dataverse, acelerando muito a criação de telas de edição.

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