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).
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.

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!
Fala Rafa, bom dia, tudo joia?
Opa, obrigado pelo comentário e pela bondade nas palavras.
Tenha um ótimo e abençoado fim de semana.
Um grande abraço.
Há quanto tempo eu não venho aqui…Valeu!!!!
Fala Helinux, tudo joia?
Verdade faz um bom tempo mesmo né.
É que eu devo imaginar também como deva estar corrido.
Tenha um ótimo e abençoado fim de semana.
Um grande abraço.