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.