Como criar Cópia de Linha em MVC

No artigo de hoje, vamos demonstrar em como criar um recurso para cópia de linha posicionada em MVC.

Antes de começarmos, o conteúdo desse artigo é baseado na aula 8 do nosso curso de MVC, se quiser conhecer sobre o curso, acesse clicando aqui.

 

Recentemente me perguntaram se tinha como fazer uma tratativa de cópia de linhas manualmente, então eu decidi montar esse exemplo.

 

A lógica para essa tratativa foi a seguinte:

  1. Na ViewDef é acionado o método AddUserButton para adicionar um botão com o texto Copiar Linha que aciona a função u_zCopyLin()
  2. Nessa função zCopyLin, primeiro pegamos os valores dos campos com GetValue
  3. Depois adicionamos uma linha com AddLine
  4. Por último definimos os valores copiados com SetValue

 

Abaixo um gif de como ficou o resultado:

Exemplo da cópia de linha

 

Abaixo o código fonte completo:

//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"

//Variveis Estaticas
Static cTitulo := "Cadastro de CDs"
Static cTabPai := "ZD2"
Static cTabFilho := "ZD3"

/*/{Protheus.doc} User Function zMVC02
CDs
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

User Function zMVC02()
	Local aArea   := GetArea()
	Local oBrowse
	Private aRotina := {}

	//Definicao do menu
	aRotina := MenuDef()

	//Instanciando o browse
	oBrowse := FWMBrowse():New()
	oBrowse:SetAlias(cTabPai)
	oBrowse:SetDescription(cTitulo)
	oBrowse:DisableDetails()

	//Ativa a Browse
	oBrowse:Activate()

	RestArea(aArea)
Return Nil

/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zMVC02
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function MenuDef()
	Local aRotina := {}

	//Adicionando opcoes do menu
	ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zMVC02" OPERATION 1 ACCESS 0
	ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zMVC02" OPERATION 3 ACCESS 0
	ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zMVC02" OPERATION 4 ACCESS 0
	ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zMVC02" OPERATION 5 ACCESS 0

Return aRotina

User Function z02Menu()
Return MenuDef()

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zMVC02
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ModelDef()
	Local oStruPai := FWFormStruct(1, cTabPai)
	Local oStruFilho := FWFormStruct(1, cTabFilho)
	Local aRelation := {}
	Local oModel
	Local bPre := Nil
	Local bPos := Nil
	Local bCommit := Nil
	Local bCancel := Nil


	//Cria o modelo de dados para cadastro
	oModel := MPFormModel():New("zMVC02M", bPre, bPos, bCommit, bCancel)
	oModel:AddFields("ZD2MASTER", /*cOwner*/, oStruPai)
	oModel:AddGrid("ZD3DETAIL","ZD2MASTER",oStruFilho,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/)
	oModel:SetDescription("Modelo de dados - " + cTitulo)
	oModel:GetModel("ZD2MASTER"):SetDescription( "Dados de - " + cTitulo)
	oModel:GetModel("ZD3DETAIL"):SetDescription( "Grid de - " + cTitulo)
	oModel:SetPrimaryKey({})

	//Fazendo o relacionamento
	aAdd(aRelation, {"ZD3_FILIAL", "FWxFilial('ZD3')"} )
	aAdd(aRelation, {"ZD3_CD", "ZD2_CD"})
	oModel:SetRelation("ZD3DETAIL", aRelation, ZD3->(IndexKey(1)))
	
	//Definindo campos unicos da linha
	//oModel:GetModel("ZD3DETAIL"):SetUniqueLine({'ZD3_MUSICA'})

Return oModel

/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zMVC02
@author Daniel Atilio
@since 21/01/2022
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ViewDef()
	Local oModel := FWLoadModel("zMVC02")
	Local oStruPai := FWFormStruct(2, cTabPai)
	Local oStruFilho := FWFormStruct(2, cTabFilho)
	Local oView

	//Cria a visualizacao do cadastro
	oView := FWFormView():New()
	oView:SetModel(oModel)
	oView:AddField("VIEW_ZD2", oStruPai, "ZD2MASTER")
	oView:AddGrid("VIEW_ZD3",  oStruFilho,  "ZD3DETAIL")

	//Partes da tela
	oView:CreateHorizontalBox("CABEC", 30)
	oView:CreateHorizontalBox("GRID", 70)
	oView:SetOwnerView("VIEW_ZD2", "CABEC")
	oView:SetOwnerView("VIEW_ZD3", "GRID")

	//Titulos
	oView:EnableTitleView("VIEW_ZD2", "Cabecalho - ZD2 (CDs)")
	oView:EnableTitleView("VIEW_ZD3", "Grid - ZD3 (Musicas dos CDs)")

	//Removendo campos
	oStruFilho:RemoveField("ZD3_CD")

	//Adicionando campo incremental na grid
	oView:AddIncrementField("VIEW_ZD3", "ZD3_ITEM")

	//Adiciona botões direto no Outras Ações da ViewDef
    //Parâmetros do método addUserButton - (<cTitle >, <cResource >, <bBloco >, [ cToolTip ], [ nShortCut ], [ aOptions ], [lShowBar])
    oView:addUserButton("Copiar Linha", "MAGIC_BMP", {|| u_zCopyLin()}, , , , .T.)

Return oView

/*/{Protheus.doc} User Function zCopyLin
Função para copiar a linha da grid
@type  Function
@author Atilio
@since 30/11/2022
/*/

User Function zCopyLin()
	Local aArea   := FWGetArea()
	Local aSaveLines := FWSaveRows()
	Local cMusica := ""
	//Pegando os modelos da tela
	Local oModelPad  := FWModelActive()
    Local oModelGrid := oModelPad:GetModel('ZD3DETAIL')

	//Somente se o usuário confirmar a pergunta
	If FWAlertYesNo("Você deseja realizar a cópia da linha posicionada?", "Continua?")
		//Pega os campos da linha atual e coloca em variáveis
		cMusica := oModelGrid:GetValue("ZD3_MUSICA")

    	//Adicionando uma linha
    	oModelGrid:AddLine()

		//Nessa nova linha adicionada, agora define o valor dos campos conforme as variáveis
		oModelGrid:SetValue("ZD3_MUSICA", cMusica)
	EndIf

	FWRestRows(aSaveLines)
	FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação