Itens diferentes em um ComboBox dependendo se é Inclusão ou Alteração | Ti Responde 0074

No vídeo de hoje, vamos demonstrar em como criar uma tratativa num ComboBox para que algumas opções sejam mostradas apenas na inclusão e outras apenas na alteração.

A dúvida de hoje, nos perguntaram, se seria possível em um único ComboBox demonstrar opções diferentes entre Inclusão e Alteração em MVC.

 

Pensando nisso, montamos um exemplo, onde é demonstrado em como tratar a situação via SetAfterViewActive. A partir disso, definimos os itens do ComboBox dependendo da situação se é Inclusão ou Alteração.

 

Segue abaixo o vídeo exemplificando:

 

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"

//Variveis Estaticas
Static cTitulo := "Artistas"
Static cAliasMVC := "ZD1"

/*/{Protheus.doc} User Function zVid0074
Cadastro de Artistas
@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 zVid0074()
	Local aArea   := GetArea()
	Local oBrowse
	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()

	RestArea(aArea)
Return Nil

/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zVid0074
@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.zVid0074" OPERATION 1 ACCESS 0
	ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.zVid0074" OPERATION 3 ACCESS 0
	ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.zVid0074" OPERATION 4 ACCESS 0

Return aRotina

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zVid0074
@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 oStruct := FWFormStruct(1, cAliasMVC)
	Local oModel
	Local bPre := Nil
	Local bPos := Nil
	Local bCommit := Nil
	Local bCancel := Nil

	//oStruct:SetProperty('ZD1_DTFORM', MODEL_FIELD_INIT, FwBuildFeature(STRUCT_FEATURE_INIPAD, 'Date()'))
	oStruct:SetProperty('ZD1_DTFORM', MODEL_FIELD_INIT, FwBuildFeature(STRUCT_FEATURE_INIPAD, 'dDataBase'))
	//oStruct:SetProperty('ZD1_DTFORM', MODEL_FIELD_INIT, FwBuildFeature(STRUCT_FEATURE_INIPAD, 'sToD("20221101")'))


	//Cria o modelo de dados para cadastro
	oModel := MPFormModel():New("zVid74M", bPre, bPos, bCommit, bCancel)
	oModel:AddFields("ZD1MASTER", /*cOwner*/, oStruct)
	oModel:SetDescription("Modelo de dados - " + cTitulo)
	oModel:GetModel("ZD1MASTER"):SetDescription( "Dados de - " + cTitulo)
	oModel:SetPrimaryKey({})
Return oModel

/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zVid0074
@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("zVid0074")
	Local oStruct := FWFormStruct(2, cAliasMVC)
	Local oView

	//Cria a visualizacao do cadastro
	oView := FWFormView():New()
	oView:SetModel(oModel)
	oView:AddField("VIEW_ZD1", oStruct, "ZD1MASTER")
	oView:CreateHorizontalBox("TELA" , 100 )
	oView:SetOwnerView("VIEW_ZD1", "TELA")

    //Define uma ação logo após abrir a tela
    oView:SetAfterViewActivate({|| fAtuCombo()})

Return oView

/*/{Protheus.doc} fAtuCombo
Função que define as opções do combo na tela
@author Atilio
@since 21/11/2023
@version 1.0
@type function
@obs O X3_CBOX do campo esta como "1=Novo Registro;2=Inclusão Teste;3=Registro Revisado;4=Alteração Teste;5=Sem Classificação;6=Sempre Mostrar;7=Último Teste;"
/*/

Static Function fAtuCombo()
    Local lContinua   := .T.
    Local oModel      := FWModelActive()
    Local nOper       := oModel:GetOperation()
    Local oView       := FWViewActive()
    Local oModelZD1   := oModel:GetModel("ZD1MASTER")
    Local aOpcoes     := {}
 
    //Somente se for inclusão ou alteração
    If nOper == 3 .Or. nOper == 4
    
        //Somente inclusão
        If nOper == 3
            aAdd(aOpcoes, "1=Novo Registro")
            aAdd(aOpcoes, "2=Inclusão Teste")

        //Se for alteração
        ElseIf nOper == 4 .Or. nOper == 1
            aAdd(aOpcoes, "3=Registro Revisado")
            aAdd(aOpcoes, "4=Alteração Teste")
        EndIf

        //Os outros sempre adicionam
        aAdd(aOpcoes, "5=Sem Classificação")
        aAdd(aOpcoes, "6=Sempre Mostrar")
        aAdd(aOpcoes, "7=Último Teste")
        
        //Define  direto no Model
        oModelZD1:GetStruct():SetProperty("ZD1_TIPO", MODEL_FIELD_VALUES, aOpcoes)
    
        //E agora define na View
        oView:SetFieldProperty("ZD1MASTER", "ZD1_TIPO", "COMBOVALUES", { aOpcoes })

        //Atualiza a tela
        oView:Refresh()
    EndIf
Return lContinua

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação