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.