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.
