Criando abas e separando campos via código MVC

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:

Exemplo das abas separadas de forma customizada

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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta