Validar se a base é uma base de testes no Protheus

No artigo de hoje, vamos demonstrar em como validar se a base logada é uma base de testes via customização.

Pessoal, antes de começarmos esse artigo, na rotina CFGA750 ( referência no TDN ), é possível configurar o tipo do ambiente (conforme print abaixo).

Tela para definir se é uma base de produção, homologação ou desenvolvimento

Tela para definir se é uma base de produção, homologação ou desenvolvimento

Essa configuração, fica dentro da tabela SYS_APP_PARAM, com o código TypeEnvironment.

Eu tentei procurar alguma função padrão que retornasse esse valor, mas não consegui identificar, se eu encontra algo, eu atualizo esse artigo.

Então para fazermos uma validação se estamos na base de testes, podemos ter alguns cenários, sendo que separamos dois:

  • Cenário 1: Testando pelo nome do ambiente, por exemplo, supondo que o environment de produção se chame EMPRESA (aquele terceiro parâmetro que você usa no atalho do SmartClient) e o da base de testes se chama EMPRESA_TST, então basta usarmos a função GetEnvServer e validar se é a EMPRESA_TST
  • Cenário 2: Caso tenha o mesmo nome de environment para base de testes e produção, ai uma alternativa seria buscar o nome da base de dados configurada no DbAccess, e validar se é a base de testes

Pensando nisso então, conforme os dois cenários acima, montamos uma customização que já faz as validações (se atente as linhas 52 e 77):

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zInTst
Função que valida se esta em base de testes
@type  Function
@author Atilio
@since 25/09/2024
@param nTipo, Numérico, Se for 1 irá validar pelo nome do ambiente (environment) se não vai validar pelo nome da base de dados no DbAccess
@return lEmTeste, Lógico, .T. se esta na base de testes e .F. se não está
@example 
    [...]
    
    If u_zInTst(1)
        Alert("estou na base de testes")
    Else
        Alert("estou na base de produção)
    EndIf

    [...]
@obs Atualize as seguintes linhas do fonte:
    Linha 52 com o nome dos ambientes da base de teste
    Linha 77 com o nome da base no DbAccess
/*/

User Function zInTst(nTipo)
    Local aArea    := FWGetArea()
    Local lEmTeste := .F.
    Default nTipo  := 2

    //Se for para testar via nome de ambiente
    If nTipo == 1
        lEmTeste := fViaAmbiente()

    //Senão, pega pelo nome da base no DbAccess
    Else
        lEmTeste := fViaDbAccess()
    EndIf

    FWRestArea(aArea)
Return

/*/{Protheus.doc} fViaDbAccess
Busca via DbAccess dentro do appserver.ini o nome da base se é a base de testes
@type  Static Function
@author Atilio
@since 25/09/2024
/*/

Static Function fViaAmbiente()
    Local aArea      := FWGetArea()
    Local cNomeAmb   := Alltrim(GetEnvServer()) + ";"
    Local cAmbTst    := "AMBTST;AMBTST2;AMBTST_JOB;" //Coloque aqui os nomes dos ambientes da base de testes
    Local lEmTeste   := .F.

    //Se o ambiente estiver na lista dos da base de testes
    If cNomeAmb $ cAmbTst
        lEmTeste := .T.
    EndIf

    FWRestArea(aArea)
Return lEmTeste


/*/{Protheus.doc} fViaDbAccess
Busca via DbAccess dentro do appserver.ini o nome da base se é a base de testes
@type  Static Function
@author Atilio
@since 25/09/2024
/*/

Static Function fViaDbAccess()
    Local aArea      := FWGetArea()
    Local cIniFile   := GetAdv97()
    Local cStrError  := "ERROR"
    Local cNomeBase  := ""
    Local cBaseTst   := "BASE_TST" //Coloque aqui o nome da sua base de testes que está no DbAccess
    Local lEmTeste   := .F.

    //Busca o nome da base na seção "DbAccess"
    cNomeBase := GetPvProfString("DbAccess", "Alias", cStrError, cIniFile)

    //Se não encontrou ou deu erro, ai vamos buscar novamente mas agora ao invés de "DbAccess" vamos usar a seção "TopConnect"
    If Empty(cNomeBase) .Or. cNomeBase == cStrError
        cNomeBase := GetPvProfString("TopConnect", "Alias", cStrError, cIniFile)
        cPasso    := "2"
    EndIf

    //Se não encontrou ou deu erro, ai vamos buscar novamente mas agora ao invés de "TopConnect" vamos usar a seção "TotvsDBAccess"
    If Empty(cNomeBase) .Or. cNomeBase == cStrError
        cNomeBase := GetPvProfString("TotvsDBAccess", "Alias", cStrError, cIniFile)
        cPasso    := "3"
    EndIf

    //Se mesmo assim não encontrou, vamos buscar direto do ambiente
    If Empty(cNomeBase) .Or. cNomeBase == cStrError
        cNomeBase := GetSrvProfString("DBAlias", cStrError)
        cPasso    := "4"
    EndIf

    //Se for a base de Homologação / Testes
    If cNomeBase == cBaseTst
        lEmTeste := .T.
    EndIf

    FWRestArea(aArea)
Return lEmTeste

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.

4 Responses

  1. rafa_achoa disse:

    Uhuuul! Trouxe uma dor e virou até post <3
    Obrigado Atilião! Ajudou muito e essa do CFG não sabia não, pode ser até mais simples de solucionar o que eu precisava.
    Você é muito brabo!

  2. Helinux disse:

    Há quanto tempo eu não venho aqui…Valeu!!!!

Deixe uma resposta

Terminal de Informação