Hoje vou mostrar como criar uma tela em MVC, e separar os campos por abas, sem utilizar o Configurador (cadastros de pastas – SXA).
Como exemplo desse artigo, eu utilizei a tabela SBM (Grupo de Produtos). Basicamente o processo é feito dentro da ViewDef.
No caso, nós criamos as structs apontando para a SBM, e cada struct criada será vinculada a uma aba, sendo necessário informar quais campos serão considerados.
Depois através do método SetNoFolder, iremos tirar as abas padrões se existirem.
Por último, iremos criar as Views (AddField), criar a abas (AddSheet e HorizontalBox) e vincular ambas (SetOwnerView).
No nosso exemplo, foram criadas 3 abas, abaixo um print da tela:
Abaixo o código fonte desenvolvido:
//Bibliotecas #Include "Totvs.ch" #Include "FWMVCDef.ch" //Variveis Estaticas Static cTitulo := "Grupo de Produtos" Static cAliasMVC := "SBM" /*/{Protheus.doc} User Function zTstTab Teste de Abas - Grupo de Produtos @author Daniel Atilio @since 19/04/2021 @version 1.0 @type function /*/ User Function zTstTab() Local aArea := GetArea() Local oBrowse Local nIgnore := 1 Private aRotina := {} //Definicao do menu aRotina := MenuDef() //Instanciando o browse oBrowse := FWMBrowse():New() oBrowse:SetAlias(cAliasMVC) oBrowse:SetDescription(cTitulo) oBrowse:DisableDetails() //Ativa a Browse oBrowse:Activate() //Tratativa para ignorar warnings de ViewDef e ModelDef nunca chamados If nIgnore == 0 ModelDef() ViewDef() EndIf RestArea(aArea) Return Nil /*/{Protheus.doc} MenuDef Menu de opcoes na funcao zTstTab @author Daniel Atilio @since 19/04/2021 @version 1.0 @type function /*/ Static Function MenuDef() Local aRotina := {} //Adicionando opcoes do menu ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zTstTab" OPERATION 1 ACCESS 0 ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zTstTab" OPERATION 3 ACCESS 0 ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zTstTab" OPERATION 4 ACCESS 0 ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.zTstTab" OPERATION 5 ACCESS 0 Return aRotina /*/{Protheus.doc} ModelDef Modelo de dados na funcao zTstTab @author Daniel Atilio @since 19/04/2021 @version 1.0 @type function /*/ Static Function ModelDef() Local oStruct := FWFormStruct(1, cAliasMVC) Local oModel Local bPre := Nil Local bPos := Nil Local bCommit := Nil Local bCancel := Nil //Cria o modelo de dados para cadastro oModel := MPFormModel():New("zTstTabM", bPre, bPos, bCommit, bCancel) oModel:AddFields("SBMMASTER", /*cOwner*/, oStruct) oModel:SetDescription("Modelo de dados - " + cTitulo) oModel:GetModel("SBMMASTER"):SetDescription( "Dados de - " + cTitulo) oModel:SetPrimaryKey({}) Return oModel /*/{Protheus.doc} ViewDef Visualizacao de dados na funcao zTstTab @author Daniel Atilio @since 19/04/2021 @version 1.0 @type function /*/ Static Function ViewDef() Local oModel := FWLoadModel("zTstTab") Local oStructPrin := FWFormStruct(2, cAliasMVC, {|cCampo| AllTrim(cCampo) $ "BM_GRUPO|BM_DESC"}) Local oStructSecu := FWFormStruct(2, cAliasMVC, {|cCampo| AllTrim(cCampo) $ "BM_PROORI|BM_STATUS"}) Local oStructTerc := FWFormStruct(2, cAliasMVC, {|cCampo| AllTrim(cCampo) $ "BM_FORMUL"}) Local oView //Retira as abas padrões oStructPrin:SetNoFolder() oStructSecu:SetNoFolder() oStructTerc:SetNoFolder() //Cria a visualizacao do cadastro oView := FWFormView():New() oView:SetModel(oModel) oView:AddField("VIEW_PRIN", oStructPrin, "SBMMASTER") oView:AddField("VIEW_SECU", oStructSecu, "SBMMASTER") oView:AddField("VIEW_TERC", oStructTerc, "SBMMASTER") //Cria o controle de Abas oView:CreateFolder('ABAS') oView:AddSheet('ABAS', 'ABA_PRIN', 'Aba 1 - Principal') oView:AddSheet('ABAS', 'ABA_SECU', 'Aba 2 - Secundária') oView:AddSheet('ABAS', 'ABA_TERC', 'Aba 3 - Outros Campos') //Cria os Box que serão vinculados as abas oView:CreateHorizontalBox( 'BOX_PRIN' ,100, /*owner*/, /*lUsePixel*/, 'ABAS', 'ABA_PRIN') oView:CreateHorizontalBox( 'BOX_SECU' ,100, /*owner*/, /*lUsePixel*/, 'ABAS', 'ABA_SECU') oView:CreateHorizontalBox( 'BOX_TERC' ,100, /*owner*/, /*lUsePixel*/, 'ABAS', 'ABA_TERC') //Amarra as Abas aos Views de Struct criados oView:SetOwnerView('VIEW_PRIN','BOX_PRIN') oView:SetOwnerView('VIEW_SECU','BOX_SECU') oView:SetOwnerView('VIEW_TERC','BOX_TERC') Return oView
Bom pessoal, por hoje é só.
Abraços e até a próxima.