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:
- Na ViewDef é acionado o método AddUserButton para adicionar um botão com o texto Copiar Linha que aciona a função u_zCopyLin()
- Nessa função zCopyLin, primeiro pegamos os valores dos campos com GetValue
- Depois adicionamos uma linha com AddLine
- Por último definimos os valores copiados com SetValue
Abaixo um gif de como ficou o resultado:
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.