No vídeo de hoje, vamos demonstrar em como criar uma tela de cadastro Modelo 2, usando apenas 1 tabela, mas com separação de abas e grid em MVC.
A dúvida de hoje, nos perguntaram, se seria possível criar uma tela Modelo 2 (grid e enchoice usando apenas 1 tabela), mas na parte da Enchoice, ter separação em abas.
Pensando nisso, montamos esse exemplo, onde vamos demonstrar em como fazer isso separando a estrutura na ViewDef.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include "Totvs.ch" #Include "FWMVCDef.ch" //Variveis Estaticas Static cTitulo := "Grupos de Produtos" Static cCamposChv := "BM_PICPAD ;BM_PROORI ;BM_STATUS ;BM_GRUREL ;BM_MARGPRE;BM_LENREL ;BM_CLASGRU;BM_FORMUL ;" Static cTabPai := "SBM" /*/{Protheus.doc} User Function zVid0133 Cadastro de Grupos de Produtos @author Atilio @since 20/02/2024 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ User Function zVid0133() Local aArea := FWGetArea() 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() FWRestArea(aArea) Return Nil /*/{Protheus.doc} MenuDef Menu de opcoes na funcao zVid0133 @author Atilio @since 20/02/2024 @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.zVid0133" OPERATION 1 ACCESS 0 ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zVid0133" OPERATION 3 ACCESS 0 ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zVid0133" OPERATION 4 ACCESS 0 Return aRotina /*/{Protheus.doc} ModelDef Modelo de dados na funcao zVid0133 @author Atilio @since 20/02/2024 @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, {|cCampo| Alltrim(cCampo) $ cCamposChv}) Local oStruFilho := FWFormStruct(1, cTabPai) Local aRelation := {} Local oModel Local bPre := Nil Local bPos := Nil Local bCancel := Nil //Cria o modelo de dados para cadastro oModel := MPFormModel():New("zVid133M", bPre, bPos, /*bCommit*/, bCancel) oModel:AddFields("SBMMASTER", /*cOwner*/, oStruPai) oModel:AddGrid("SBMDETAIL","SBMMASTER",oStruFilho,/*bLinePre*/, /*bLinePost*/,/*bPre - Grid Inteiro*/,/*bPos - Grid Inteiro*/,/*bLoad - Carga do modelo manualmente*/) oModel:SetDescription("Modelo de dados - " + cTitulo) oModel:GetModel("SBMMASTER"):SetDescription( "Dados de - " + cTitulo) oModel:GetModel("SBMDETAIL"):SetDescription( "Grid de - " + cTitulo) oModel:SetPrimaryKey({}) //Fazendo o relacionamento aAdd(aRelation, {"BM_FILIAL", "FWxFilial('SBM')"} ) aAdd(aRelation, {"BM_PICPAD", "BM_PICPAD"}) aAdd(aRelation, {"BM_PROORI", "BM_PROORI"}) aAdd(aRelation, {"BM_STATUS", "BM_STATUS"}) aAdd(aRelation, {"BM_GRUREL", "BM_GRUREL"}) aAdd(aRelation, {"BM_MARGPRE", "BM_MARGPRE"}) aAdd(aRelation, {"BM_LENREL", "BM_LENREL"}) aAdd(aRelation, {"BM_CLASGRU", "BM_CLASGRU"}) aAdd(aRelation, {"BM_FORMUL", "BM_FORMUL"}) oModel:SetRelation("SBMDETAIL", aRelation, SBM->(IndexKey(1))) //Definindo campos unicos da linha oModel:GetModel("SBMDETAIL"):SetUniqueLine({'BM_GRUPO'}) Return oModel /*/{Protheus.doc} ViewDef Visualizacao de dados na funcao zVid0133 @author Atilio @since 20/02/2024 @version 1.0 @type function @obs Codigo gerado automaticamente pelo Autumn Code Maker @see http://autumncodemaker.com /*/ Static Function ViewDef() Local oModel := FWLoadModel("zVid0133") Local oStruAba1 := FWFormStruct(2, cTabPai, {|cCampo| Alltrim(cCampo) $ "BM_PROORI ;BM_STATUS ;BM_CLASGRU;"}) Local oStruAba2 := FWFormStruct(2, cTabPai, {|cCampo| Alltrim(cCampo) $ "BM_PICPAD ;BM_MARGPRE;BM_FORMUL ;"}) Local oStruAba3 := FWFormStruct(2, cTabPai, {|cCampo| Alltrim(cCampo) $ "BM_GRUREL ;BM_LENREL ;"}) Local oStruFilho := FWFormStruct(2, cTabPai, {|cCampo| ! Alltrim(cCampo) $ cCamposChv}) Local oView //Caso tenha abas no padrão, tira oStruAba1:SetNoFolder() oStruAba2:SetNoFolder() oStruAba3:SetNoFolder() //Cria a visualizacao do cadastro oView := FWFormView():New() oView:SetModel(oModel) oView:AddField("VIEW_SBM1", oStruAba1, "SBMMASTER") oView:AddField("VIEW_SBM2", oStruAba2, "SBMMASTER") oView:AddField("VIEW_SBM3", oStruAba3, "SBMMASTER") oView:AddGrid("GRID_SBM", oStruFilho, "SBMDETAIL") //Partes da tela oView:CreateHorizontalBox("CABEC", 40) oView:CreateHorizontalBox("GRID", 60) //Cria o controle de Abas oView:CreateFolder('ABAS', 'CABEC') oView:AddSheet('ABAS', 'ABA_CAD', 'Cadastro') oView:AddSheet('ABAS', 'ABA_INF', 'Informações') oView:AddSheet('ABAS', 'ABA_OUT', 'Outros Campos') //Cria os Box que serão vinculados as abas oView:CreateHorizontalBox('BOX_CAD' ,100, /*owner*/, /*lUsePixel*/, 'ABAS', 'ABA_CAD') oView:CreateHorizontalBox('BOX_INF' ,100, /*owner*/, /*lUsePixel*/, 'ABAS', 'ABA_INF') oView:CreateHorizontalBox('BOX_OUT' ,100, /*owner*/, /*lUsePixel*/, 'ABAS', 'ABA_OUT') //Amarra as structs com as views oView:SetOwnerView('VIEW_SBM1', 'BOX_CAD') oView:SetOwnerView('VIEW_SBM2', 'BOX_INF') oView:SetOwnerView('VIEW_SBM3', 'BOX_OUT') oView:SetOwnerView("GRID_SBM", "GRID") Return oView
Bom pessoal, por hoje é só.
Abraços e até a próxima.