Criando e manipulando parâmetros customizados no Protheus

No artigo de hoje, vou mostrar como criar um cadastro de parâmetros customizado inclusive com a busca de informação.

Cada vez mais, o acesso e manipulação ao dicionário de dados, esta sendo bloqueado para melhorar a integridade do Protheus.

Pensando nisso, em um cenário que havia vários parâmetros customizados e com constante alteração, me solicitaram para criar uma solução para esse caso. Então foi criado uma tabela, aqui iremos chamar ela de ZD9, sendo com os campos:

  • ZD9_FILIAL: Campo interno com a filial do sistema
  • ZD9_COD: Campo caractere com sequencial único (contexto real, tamanho 6, modo visualizar, ini padrão: GetSXENum(“Z59”, “Z59_COD”)
  • ZD9_PARAM: Campo caractere que terá o nome do parâmetro (contexto real, tamanho 10)
  • ZD9_DESCRI: Campo caractere que terá a descrição do parâmetro (contexto real, tamanho 100)
  • ZD9_CONTEU: Campo caractere que terá o conteúdo do parâmetro (contexto real, tamanho 100)

Após criar a tabela, iremos criar uma tela de cadastro comum, eu até usei o Autumn Code Maker para criar ela, abaixo o código:

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

//Variveis Estaticas
Static cTitulo := "Cadastro de Parâmetros"
Static cAliasMVC := "ZD9"

/*/{Protheus.doc} User Function ACFG08
Cadastro de Parâmetros
@author Daniel Atilio
@since 01/03/2021
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

User Function ACFG08()
	Local aArea   := GetArea()
	Local oBrowse
	Local nVar := 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()

	If nVar == 0
		ModelDef()
		ViewDef()
	EndIf

	RestArea(aArea)
Return Nil

/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao ACFG08
@author Daniel Atilio
@since 01/03/2021
@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 "Incluir" ACTION "VIEWDEF.ACFG08" OPERATION 3 ACCESS 0
	ADD OPTION aRotina TITLE "Excluir" ACTION "VIEWDEF.ACFG08" OPERATION 5 ACCESS 0
	ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.ACFG08" OPERATION 1 ACCESS 0
	ADD OPTION aRotina TITLE "Alterar" ACTION "VIEWDEF.ACFG08" OPERATION 4 ACCESS 0

Return aRotina

/*/{Protheus.doc} ModelDef
Modelo de dados na funcao ACFG08
@author Daniel Atilio
@since 01/03/2021
@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


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

/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao ACFG08
@author Daniel Atilio
@since 01/03/2021
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
@see http://autumncodemaker.com
/*/

Static Function ViewDef()
	Local oModel := FWLoadModel("ACFG08")
	Local oStruct := FWFormStruct(2, cAliasMVC)
	Local oView

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

Return oView

Agora os usuários da TI deverão criar os parâmetros customizados nessa tela, se atentando para o campo ZD9_PARAM. Depois que estiver cadastrados, você pode compilar a função abaixo de busca de parâmetros:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zGetMV
Busca o conteúdo do parâmetro na tabela customizada
@type  Function
@author Atilio
@since 01/03/2021
@version version
@param cParametro, Caracter, Nome do Parâmetro
@return cConteudo, Caracter, Conteúdo do Parâmetro encontrado
@example
    u_zGetMV("MV_EMAILS")
/*/

User Function zGetMV(cParametro)
    Local aArea := GetArea()
    Local cConteudo := ""
    Local cQuery := ""
    Default cParametro := ""

    //Se tiver parâmetro a ser buscado
    If ! Empty(cParametro)
        cQuery := " SELECT " + CRLF
        cQuery += "     ZD9_CONTEU " + CRLF
        cQuery += " FROM " + CRLF
        cQuery += "     " + RetSQLName('ZD9') + " ZD9 " + CRLF
        cQuery += " WHERE " + CRLF
        cQuery += "     ZD9_FILIAL = '" + FWxFilial('ZD9') + "' " + CRLF
        cQuery += "     AND ZD9_PARAM = '" + cParametro + "' " + CRLF
        cQuery += "     AND ZD9.D_E_L_E_T_ = ' ' " + CRLF
        PLSQuery(cQuery, "QRY_GETMV")

        //Se tiver encontrado registro
        If ! QRY_GETMV->(EoF())
            cConteudo := Alltrim(QRY_GETMV->ZD9_CONTEU)
        EndIf
        QRY_GETMV->(DbCloseArea())
    EndIf

    RestArea(aArea)
Return cConteudo

Então para acionar o parâmetro, basta usar a função u_zGetMV, e por se tratar de uma rotina totalmente customizada, você tem total controle na tabela. Abaixo um exemplo de como seria o antes e depois:

//Antes:
cEmails: GetMV("MV_X_EMAIL")

//Depois:
cEmails: u_zGetMV("MV_EMAILS")

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