Como fazer a cópia completa de um registro de um formulário? Incluindo as tabelas filhas
Cópia Simples, sem considerar tabelas filhas
Em todos os formulários por padrão já existe uma opção de duplicar/copiar o registro, através do botão representado pelo icone: que fica na barra de botões do formulário:
Essa opção não copia os registos dos formulários filhos ou tabelas. Caso seja necessário, utilize a técnica demonstrada no tópico abaixo nesse mesmo artigo.
Cópia Completa, considerando tabelas filhas
Crie e configure o botão para copiar
- Entre no formulário que você deseja colocar o botão de "Copiar"
- Crie um botão chamado "Copiar", marque para que esse botão
- Marque para esse botão ser mostrado na barra de botões do formulario
- Marque para esse botão Não ser mostrado dentro do formulario
- Deixa o botão fora do layout do formulario, ele nao precisa ser arrastado para dentro do formularío, caso esteja, remova
- no clique do botão em javascript, confiure para chamar a função js: copiarRegistro()
No Visual Code Editor do Formulário
Adicione o Javascript abaixo
function copiarRegistro() {
//só deixa copiar caso nao seja um form novo
if (formContext.form.isNew())
{
pageMsg.formContext.msg.showMsgWarning("Salve o formulário antes de copiar", "Falha ao copiar")
return;
}
//chama o cshtml "CopiarRegistro" que fará a copia
formContext.loadAjax("CopiarRegistro", {
onSuccess: function (response) {
//em caso de sucesso, mostra a msg de sucesso e já redireciona o usuario para a proxima pagina
pageMsg.showMsgSuccess("Orçamento Duplicado", "Sucesso");
//em caso de sucesso, redireciona para a url que foi criado
//importante mudar aqui para o id da estrutura do formulario correto
window.parent.location = window.parent.base_url + "fluxo/index/74ad209b-ee6a-4ae3-9920-2caad2bc7451/" + response.trim() ;
},
onError: function (err) {
pageMsg.formContext.msg.showMsgWarning("Falha: " + err, "Falha ao copiar")
console.error("Erro ao carregar o registro:", err);
}
});
}
Crie um cshtml chamado CopiarRegistro
Cole o código cshtml / C# abaixo:
@{
/*
NESSE EXEMPLO, ESTOU COPIANDO O FORMULARIO ORÇAMENTO E OS ORÇAMENTO ITEM QUE É FILHO DE ORÇAMENTO
*/
//MUDAR AQUI PARA OS IDS DAS ESTRUTURA DOS FORMULARIOS
var idEstruturaFormularioOrcamento = Guid.Parse("74ad209b-ee6a-4ae3-9920-2caad2bc7451");
var idEstruturaFormularioItemOrcamento = Guid.Parse("0c114359-8cb1-4d42-85b4-9882417c386a");
//CRIAR O DICTIONARY COM OS DADOS DO FORM PAI, ORÇAMENTO
var values = new DataDictionary();
values.Add("numero",PageContext.GetValue("numero"));
values.Add("cliente",PageContext.GetValue("cliente"));
//SALVAR O ORÇAMENTO E RECUPERA O ID CRIADO
var orcamentoId = await PageContext.SaveEntityAsync(idEstruturaFormularioOrcamento, values);
var paramsQueryItemOrcamento = new List<NpgsqlParameter>();
paramsQueryItemOrcamento.Add(new NpgsqlParameter("@orcamento", new Guid(PageContext.FormId.ToString())));
//FAZ UMA QUERY PARA BUSCAR TODOS OS ITENS DO ORÇEMANTO ITEM
var sqlItemOrcamento = "select * from x_tbl_orcamento__item where deletado = false and idorcamento = @orcamento limit 100";
var dtItemOrcamento = await PageContext.GetDataTableAsync(sqlItemOrcamento, paramsQueryItemOrcamento.ToArray());
//CASO TENHA ITENS, FAZ UM LOOP PARA COPIAR TODOS E SALVAR
if (dtItemOrcamento != null && dtItemOrcamento.Rows.Count >= 1)
{
foreach (DataRow itemOrcamento in dtItemOrcamento.Rows)
{
//CRIAR O DICTIONARY COM OS DADOS DO FORM FILHO, ORÇAMENTO ITEM
var valuesItemOrcamento = new DataDictionary();
//AQUI COLOCAR O ID DO ORÇAMENTO QUE FAZ A LIGAÇÃO ENTRE O ORÇAMENTO (PAI) E ORÇAMENTO ITEM (FILHO)
valuesItemOrcamento.Add("idorcamento", orcamentoId);
valuesItemOrcamento.Add("detalhes_do_item",itemOrcamento["detalhes_do_item"].ToString());
valuesItemOrcamento.Add("nome_do_item",itemOrcamento["nome_do_item"].ToString());
//SALVAR O ORÇAMENTO ITEM
await PageContext.SaveEntityAsync(idEstruturaFormularioItemOrcamento, valuesItemOrcamento);
}
}
}
@orcamentoId
Nas configuraçoes de botões do formulário, marque para o botão padrão de "duplicar/copiar" não aparecer. Em algumas versões essa opção de nao aparecer pode não estar disponível, sendo assim, você pode usar o css abaixo na opção de CSS para deixar o botão invisível
#btnCopyForm{
display: none
}