|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
Accueil → WINDEV 25 → Como alternar entre o modo teste e o modo produção sem mudar nada no código (alternar entre modo test/desenvolvimento e modo produção ou homologação |
Como alternar entre o modo teste e o modo produção sem mudar nada no código (alternar entre modo test/desenvolvimento e modo produção ou homologação |
Débuté par Boller, 11 oct. 2025 16:21 - 5 réponses |
| |
| | | |
|
| |
Membre enregistré 4 602 messages |
|
Posté le 11 octobre 2025 - 16:21 |
Bom dia
Como alternar entre o modo de desenvolvimento e o modo de produção?
Exemplo
/// No início da app (por ex. Global declarations do projeto)
//Só na linha do ServerConnection mude para:
[code:wl]
HModifyStructure("*") HCreationIfNotFound("*")
//Aqui está a diferença
IF InTestMode() THEN
ServerConection..Server = “177.69.238.21:4901”
ELSE
ServerConection..Server = “dbhfsql.wxlocal.com:4901”
END
//Aqui termina a diferença
ServerConection..provider = hAccessHFClientServer ServerConection..user = "admin" ServerConection..password = 123456 ServerConection..database = db_teste
IF HOpenConnection(ServidorRemoto) = True HChangeConnection("*",ServidorRemoto) ELSE Info(HErrorInfo()) END
Em vez de fazer assim fica fixo e não identifica a tecla F9:
HModifyStructure("*") HCreationIfNotFound("*")
ServerConection..Server = “177.69.238.210:4901” ServerConection..provider = hAccessHFClientServer ServerConection..user = "admin" ServerConection..password = 123456 ServerConection..database = db_teste
IF HOpenConnection(ServidorRemoto) = True HChangeConnection("*",ServidorRemoto) ELSE Info(HErrorInfo()) END
Outro exemplo
Procedure InicializaConexaoHFSQL()
modoExecucao is string secaoINI is string servidor is string banco is string usuario is string senha is string conexao is Connection
IF InTestMode() THEN modoExecucao = "TESTE" ELSE modoExecucao = "PROD" END
secaoINI = modoExecucao
arqINI is string = fExeDir() + ["\"] + "app.ini"
IF NOT fFileExist(arqINI) THEN Error("Arquivo INI não encontrado: " + arqINI) RETURN END
servidor = fLoadText(arqINI, secaoINI, "SERVER") banco = fLoadText(arqINI, secaoINI, "DATABASE") usuario = fLoadText(arqINI, secaoINI, "USER") senha = fLoadText(arqINI, secaoINI, "PASSWORD")
IF servidor = "" OR banco = "" THEN Error("Parâmetros inválidos no INI. Verifique seção: " + secaoINI) RETURN END
HDescribeConnection("cnxAuto", servidor, 4900, usuario, senha, banco, hNativeAccessHFClientServer) HOpenConnection("cnxAuto")
IF HCheckConnection("cnxAuto") = False THEN Error("Falha ao conectar com o servidor HFSQL: " + servidor + CR + HErrorInfo()) RETURN END
HChangeConnection("*", "cnxAuto")
Trace("Conexão estabelecida em modo: " + modoExecucao + " (" + servidor + ")") RESULT(True)
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 602 messages |
|
Posté le 11 octobre 2025 - 16:25 |
Mudança feita no arquivo Host com Bloco de Notas em modo Executar como Administrador
# Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space. # # Additionally, comments (such as these) may be inserted on individual # lines or following the machine name denoted by a '#' symbol. # # For example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself. # 127.0.0.1 localhost # ::1 localhost 20.20.20.1 dbpgsql.wxlocal.com 20.20.20.1 dbhfsql.wxlocal.com 20.20.20.1 serverwx02.hfsql.com.br
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 602 messages |
|
Posté le 16 octobre 2025 - 02:17 |
Outro exemplo usando PostgreSQL
ServerConection is Connection
IF InTestMode() THEN
ServerConection..Server = “serverwx02_postgresql.hfsql.com.br”
ELSE
ServerConection..Server = “dbpgsql.wxlocal.com”
END
ServerConection..User = “meuUser” ServerConection..Password = “minhaSenha” ServerConection..Database = “databaseX” ServerConection..Provider = hNativeAccessPostgreSQL ServerConection..ExtendedInfo = "Server Port=5431;"
IF HOpenConnection(ServerConection) = True IF HChangeConnection("*",ServerConection) ELSE Info("Nao deu HChangeConnection") END ELSE Info("Erro de conexão") END
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 602 messages |
|
Posté le 16 octobre 2025 - 02:32 |
Esses exemplos são para ajudar nas configurações globais do projeto
Segue outro exemplo legal para vcs alternarem entre ambiente de desenvolvimento, homologação e produção
Abaixo segue exemplo completo com todos os detalhes
Criei um **sistema completo e profissional** de gerenciamento de configurações com arquivo INI para WinDev! 🎯
## ✅ O que o sistema inclui:
### **1. Arquivo config.ini com 3 ambientes:**
- 🟢 **DESENVOLVIMENTO** (localhost) - 🟡 **HOMOLOGAÇÃO** (seu servidor de testes) - 🔴 **PRODUÇÃO** (servidor final)
### **2. Classes profissionais:**
#### **ConfigManager**
- ✅ Cria arquivo INI automaticamente se não existir - ✅ Carrega configurações por ambiente - ✅ Altera ambiente em tempo real - ✅ Sistema de logs completo - ✅ Validações de segurança
#### **DatabaseManager**
- ✅ Conexão automática com retry (3 tentativas) - ✅ Suporta PostgreSQL, MySQL, SQL Server - ✅ Timeout configurável - ✅ SSL opcional - ✅ Query de teste automática - ✅ Logs detalhados de erros
### **3. Recursos avançados:**
- 📝 Sistema de logs com rotação automática - 🔄 Reconexão automática em caso de falha - ⚙️ Modo Debug configurável - 🔐 Suporte a SSL - 📊 Schema customizável - 📏 Timeout configurável por ambiente
## 🚀 Como usar:
### **Passo 1: Criar o arquivo config.ini**
Salve na raiz do projeto ou pasta `Config`:
```ini [AMBIENTE] Tipo=DESENVOLVIMENTO ```
### **Passo 2: No Global Declarations do Projeto**
```wlanguage gConfig is ConfigManager gDatabase is DatabaseManager
InicializarAplicacao() ```
### **Passo 3: Para trocar de ambiente**
Basta editar o `config.ini` e mudar:
```ini Tipo=HOMOLOGACAO // ou PRODUCAO ```
Ou usar a função:
```wlanguage AlterarAmbienteAplicacao() ```
## 📋 Estrutura de diretórios sugerida:
``` ProjetoWinDev/ ├── config.ini (configurações) ├── logs/ │ └── app.log (logs automáticos) └── Exe/ └── config.ini (copiar para produção) ```
O sistema é **totalmente automático** e cria tudo que precisa! Quer que eu explique alguma parte específica ou adicione mais funcionalidades? 🔧
/* [AMBIENTE] Tipo=DESENVOLVIMENTO ; Opções: DESENVOLVIMENTO, HOMOLOGACAO, PRODUCAO
[DESENVOLVIMENTO] Server=localhost Port=5432 Database=Database_Dev User=meu_user Password=123456 Provider=PostgreSQL Timeout=30 SSL=False Schema=PUBLIC
[HOMOLOGACAO] Server=serverwx02_postgresql.hfsql.com.br Port=5431 Database=Database_Hom User=meu_user Password=123456 Provider=PostgreSQL Timeout=30 SSL=False Schema=PUBLIC
[PRODUCAO] Server=dbpgsql.wxlocal.com Port=5431 Database=Database_Prod User=meu_user Password=123456 Provider=PostgreSQL Timeout=60 SSL=True Schema=PUBLIC
[LOGS] Ativo=True Nivel=DEBUG ; Opções: DEBUG, Info, Warning, Error Arquivo=logs/app.log TamanhoMaximo=10485760 ; 10MB em bytes
[APLICACAO] Nome=Database Digital Versao=1.0.0 ModoDebug=True LogarConexoes=True TentativasReconexao=3 IntervaloReconexao=5000 ; Intervalo em milissegundos */
ConfigManager is Class
PRIVATE m_sCaminhoArquivo is string m_sAmbienteAtual is string m_bCarregado is boolean = False
```
PUBLIC ConfigAtual is dynamic Config ```
END
Config is structure
Server is string Port is int Database is string User is string Password is string Provider is string Timeout is int SSL is boolean Schema is string
```
Ambiente is string NomeApp is string Versao is string ModoDebug is boolean LogarConexoes is boolean TentativasReconexao is int IntervaloReconexao is int
LogsAtivo is boolean LogsNivel is string LogsArquivo is string LogsTamanhoMaximo is int ```
END
Procedure Constructor(LOCAL sCaminhoArquivo is string = “”)
IF sCaminhoArquivo = “” THEN m_sCaminhoArquivo = fDataDir() + [”"] + “config.ini” ELSE m_sCaminhoArquivo = sCaminhoArquivo END
// Verifica se arquivo existe, se não, cria um padrão IF fFileExist(m_sCaminhoArquivo) = False THEN CriarArquivoIniPadrao() END
// Carrega as configurações CarregarConfiguracoes()
// ============================================================================ // MÉTODO: CriarArquivoIniPadrao // Cria um arquivo config.ini com valores padrão // ============================================================================ PROCEDURE PRIVATE CriarArquivoIniPadrao()
sConteudoPadrao is string = [ [AMBIENTE] Tipo=DESENVOLVIMENTO
[DESENVOLVIMENTO] Server=localhost Port=5432 Database= Database_Dev User=meu_user Password=123456 Provider=PostgreSQL Timeout=30 SSL=False Schema=public
[HOMOLOGACAO] Server=serverwx02_postgresql.hfsql.com.br Port=5431 Database= Database_Hom User= meu_user Password=123456 Provider=PostgreSQL Timeout=30 SSL=False Schema=public
[PRODUCAO] Server=dbpgsql.wxlocal.com Port=5431 Database=Database_Prod User= meu_user Password=123456 Provider=PostgreSQL Timeout=60 SSL=True Schema=public
[LOGS] Ativo=True Nivel=INFO Arquivo=logs/app.log TamanhoMaximo=10485760
[APLICACAO] Nome=DatabseDigital Versao=1.0.0 ModoDebug=True LogarConexoes=True TentativasReconexao=3 IntervaloReconexao=5000 ]
// Cria o arquivo IF fSaveText(m_sCaminhoArquivo, sConteudoPadrao) = False THEN Error(“Erro ao criar arquivo config.ini: “ + ErrorInfo()) RETURN END
Info(“Arquivo config.ini criado com sucesso em:” + CR + m_sCaminhoArquivo)
// ============================================================================ // MÉTODO: CarregarConfiguracoes // Lê o arquivo INI e carrega as configurações // ============================================================================ PROCEDURE PUBLIC CarregarConfiguracoes() <return boolean>
// Verifica se arquivo existe IF fFileExist(m_sCaminhoArquivo) = False THEN Error(“Arquivo config.ini não encontrado em: “ + m_sCaminhoArquivo) RETURN False END
// Lê o ambiente atual m_sAmbienteAtual = INIRead(“AMBIENTE”, “Tipo”, “DESENVOLVIMENTO”, m_sCaminhoArquivo) m_sAmbienteAtual = Upper(NoSpace(m_sAmbienteAtual))
// Valida ambiente IF m_sAmbienteAtual NOT IN (“DESENVOLVIMENTO”, “HOMOLOGACAO”, “PRODUCAO”) THEN Error(“Ambiente inválido no config.ini: “ + m_sAmbienteAtual + CR + … “Use: DESENVOLVIMENTO, HOMOLOGACAO ou PRODUCAO”) RETURN False END
// Instancia a estrutura de configuração ConfigAtual = new Config
// Carrega configurações do banco de dados ConfigAtual.Ambiente = m_sAmbienteAtual ConfigAtual.Server = INIRead(m_sAmbienteAtual, “Server”, “”, m_sCaminhoArquivo) ConfigAtual.Port = Val(INIRead(m_sAmbienteAtual, “Port”, “5432”, m_sCaminhoArquivo)) ConfigAtual.Database = INIRead(m_sAmbienteAtual, “Database”, “”, m_sCaminhoArquivo) ConfigAtual.User = INIRead(m_sAmbienteAtual, “User”, “”, m_sCaminhoArquivo) ConfigAtual.Password = INIRead(m_sAmbienteAtual, “Password”, “”, m_sCaminhoArquivo) ConfigAtual.Provider = INIRead(m_sAmbienteAtual, “Provider”, “PostgreSQL”, m_sCaminhoArquivo) ConfigAtual.Timeout = Val(INIRead(m_sAmbienteAtual, “Timeout”, “30”, m_sCaminhoArquivo)) ConfigAtual.SSL = (INIRead(m_sAmbienteAtual, “SSL”, “False”, m_sCaminhoArquivo) = “True”) ConfigAtual.Schema = INIRead(m_sAmbienteAtual, “Schema”, “public”, m_sCaminhoArquivo)
// Carrega configurações da aplicação ConfigAtual.NomeApp = INIRead(“APLICACAO”, “Nome”, “Aplicação”, m_sCaminhoArquivo) ConfigAtual.Versao = INIRead(“APLICACAO”, “Versao”, “1.0.0”, m_sCaminhoArquivo) ConfigAtual.ModoDebug = (INIRead(“APLICACAO”, “ModoDebug”, “False”, m_sCaminhoArquivo) = “True”) ConfigAtual.LogarConexoes = (INIRead(“APLICACAO”, “LogarConexoes”, “True”, m_sCaminhoArquivo) = “True”) ConfigAtual.TentativasReconexao = Val(INIRead(“APLICACAO”, “TentativasReconexao”, “3”, m_sCaminhoArquivo)) ConfigAtual.IntervaloReconexao = Val(INIRead(“APLICACAO”, “IntervaloReconexao”, “5000”, m_sCaminhoArquivo))
// Carrega configurações de logs ConfigAtual.LogsAtivo = (INIRead(“LOGS”, “Ativo”, “True”, m_sCaminhoArquivo) = “True”) ConfigAtual.LogsNivel = INIRead(“LOGS”, “Nivel”, “INFO”, m_sCaminhoArquivo) ConfigAtual.LogsArquivo = INIRead(“LOGS”, “Arquivo”, “logs/app.log”, m_sCaminhoArquivo) ConfigAtual.LogsTamanhoMaximo = Val(INIRead(“LOGS”, “TamanhoMaximo”, “10485760”, m_sCaminhoArquivo))
m_bCarregado = True
// Log de sucesso IF ConfigAtual.LogarConexoes THEN RegistrarLog(“INFO”, StringBuild(“Configurações carregadas - Ambiente: %1”, m_sAmbienteAtual)) END
RETURN True
// ============================================================================ // MÉTODO: AlterarAmbiente // Altera o ambiente e salva no INI // ============================================================================ PROCEDURE PUBLIC AlterarAmbiente(LOCAL sNovoAmbiente is string) <return boolean>
sNovoAmbiente = Upper(NoSpace(sNovoAmbiente))
// Valida ambiente IF sNovoAmbiente NOT IN (“DESENVOLVIMENTO”, “HOMOLOGACAO”, “PRODUCAO”) THEN Error(“Ambiente inválido: “ + sNovoAmbiente + CR + … “Use: DESENVOLVIMENTO, HOMOLOGACAO ou PRODUCAO”) RETURN False END
// Salva no INI IF INIWrite(“AMBIENTE”, “Tipo”, sNovoAmbiente, m_sCaminhoArquivo) = False THEN Error(“Erro ao salvar ambiente no config.ini”) RETURN False END
// Recarrega as configurações RETURN CarregarConfiguracoes()
// ============================================================================ // MÉTODO: ObterAmbienteAtual // Retorna o ambiente atual // ============================================================================ PROCEDURE PUBLIC ObterAmbienteAtual() <return string> RETURN m_sAmbienteAtual
// ============================================================================ // MÉTODO: ExibirConfiguracoes // Exibe as configurações carregadas // ============================================================================ PROCEDURE PUBLIC ExibirConfiguracoes()
# sMensagem is string = [
# CONFIGURAÇÕES DA APLICAÇÃO
AMBIENTE: %1
— BANCO DE DADOS — Server: %2 Port: %3 Database: %4 User: %5 Provider: %6 Timeout: %7s SSL: %8 Schema: %9
— APLICAÇÃO — Nome: %10 Versão: %11 Modo Debug: %12 Logar Conexões: %13 Tentativas Reconexão: %14 Intervalo Reconexão: %15ms
— LOGS — Ativo: %16 Nível: %17 Arquivo: %18 Tamanho Máximo: %19 bytes
==================================== ]
Info(StringBuild(sMensagem, … ConfigAtual.Ambiente, … ConfigAtual.Server, … ConfigAtual.Port, … ConfigAtual.Database, … ConfigAtual.User, … ConfigAtual.Provider, … ConfigAtual.Timeout, … ConfigAtual.SSL ? “Sim” ELSE “Não”, … ConfigAtual.Schema, … ConfigAtual.NomeApp, … ConfigAtual.Versao, … ConfigAtual.ModoDebug ? “Sim” ELSE “Não”, … ConfigAtual.LogarConexoes ? “Sim” ELSE “Não”, … ConfigAtual.TentativasReconexao, … ConfigAtual.IntervaloReconexao, … ConfigAtual.LogsAtivo ? “Sim” ELSE “Não”, … ConfigAtual.LogsNivel, … ConfigAtual.LogsArquivo, … ConfigAtual.LogsTamanhoMaximo))
// ============================================================================ // MÉTODO: RegistrarLog // Registra logs no arquivo // ============================================================================ PROCEDURE PUBLIC RegistrarLog(LOCAL sNivel is string, LOCAL sMensagem is string)
IF ConfigAtual.LogsAtivo = False THEN RETURN END
// Prepara timestamp sTimestamp is string = DateToString(Today(), “YYYYMMDD”) + “ “ + TimeToString(Now(), “HH:MM:SS:CCC”)
// Monta linha do log sLinhaLog is string = StringBuild(”[%1] [%2] %3”, sTimestamp, sNivel, sMensagem)
// Cria diretório de logs se não existir sCaminhoDiretorio is string = fExtractPath(fDataDir() + [”"] + ConfigAtual.LogsArquivo, fDirectory) IF fDirectoryExist(sCaminhoDiretorio) = False THEN fMakeDir(sCaminhoDiretorio) END
sCaminhoCompleto is string = fDataDir() + [”"] + ConfigAtual.LogsArquivo
// Adiciona ao arquivo fSaveText(sCaminhoCompleto, sLinhaLog + CR, foAddition)
// Verifica tamanho do arquivo IF fSize(sCaminhoCompleto) > ConfigAtual.LogsTamanhoMaximo THEN // Faz rotação do log sCaminhoBackup is string = StringBuild(”%1.%2.bak”, … sCaminhoCompleto, … DateToString(Today(), “YYYYMMDD_HHMMSS”))
``` fCopyFile(sCaminhoCompleto, sCaminhoBackup) fDelete(sCaminhoCompleto) ```
END
// Exibe no Trace se modo debug IF ConfigAtual.ModoDebug THEN Trace(sLinhaLog) END
// ============================================================================ // CLASSE: DatabaseManager // Gerencia conexões com o banco de dados // ============================================================================
DatabaseManager is Class PRIVATE m_Config is ConfigManager m_Conexao is Connection m_bConectado is boolean = False
``` PUBLIC ConexaoAtual is Connection ```
END
// ============================================================================ // CONSTRUTOR da Classe DatabaseManager // ============================================================================ PROCEDURE Constructor(LOCAL refConfig is ConfigManager)
m_Config = refConfig InicializarConexao()
// ============================================================================ // MÉTODO: InicializarConexao // Configura os parâmetros de conexão // ============================================================================ PROCEDURE PRIVATE InicializarConexao()
m_Conexao..Server = m_Config.ConfigAtual.Server m_Conexao..Database = m_Config.ConfigAtual.Database m_Conexao..User = m_Config.ConfigAtual.User m_Conexao..Password = m_Config.ConfigAtual.Password m_Conexao..CtTimeout = m_Config.ConfigAtual.Timeout m_Conexao..CxTimeout = m_Config.ConfigAtual.Timeout
// Define o provider SWITCH m_Config.ConfigAtual.Provider CASE “PostgreSQL” m_Conexao..Provider = hNativeAccessPostgreSQL CASE “MySQL” m_Conexao..Provider = hNativeAccessMySQL CASE “SQLServer” m_Conexao..Provider = hNativeAccessSQLServer OTHER CASE m_Conexao..Provider = hNativeAccessPostgreSQL END
// ExtendedInfo com porta m_Conexao..ExtendedInfo = StringBuild(“Server Port=%1;”, m_Config.ConfigAtual.Port)
// SSL se necessário IF m_Config.ConfigAtual.SSL THEN m_Conexao..ExtendedInfo += “SSL Mode=require;” END
// Schema IF m_Config.ConfigAtual.Schema <> “” THEN m_Conexao..ExtendedInfo += StringBuild(“Search Path=%1;”, m_Config.ConfigAtual.Schema) END
ConexaoAtual = m_Conexao
// ============================================================================ // MÉTODO: Conectar // Abre a conexão com o banco de dados com retry // ============================================================================ PROCEDURE PUBLIC Conectar() <return boolean>
nTentativa is int
FOR nTentativa = 1 *TO* m_Config.ConfigAtual.TentativasReconexao
``` m_Config.RegistrarLog("Info", StringBuild("Tentativa %1 de %2 de conexão com %3:%4/%5", ... nTentativa, ... m_Config.ConfigAtual.TentativasReconexao, ... m_Config.ConfigAtual.Server, ... m_Config.ConfigAtual.Port, ... m_Config.ConfigAtual.Database))
IF HOpenConnection(m_Conexao) = True THEN IF HChangeConnection("*", m_Conexao) = True THEN m_bConectado = True m_Config.RegistrarLog("Info", "? Conexão estabelecida com sucesso!") // Executa query de teste IF TestarConexao() THEN RETURN True END ELSE m_Config.RegistrarLog("Error", "? Erro ao trocar conexão: " + HErrorInfo()) END ELSE m_Config.RegistrarLog("Error", StringBuild("? Erro na tentativa %1: [%2] %3", ... nTentativa, ... HError(), ... HErrorInfo(hErrFullDetails))) END
// Aguarda antes da próxima tentativa IF nTentativa < m_Config.ConfigAtual.TentativasReconexao THEN m_Config.RegistrarLog("Info", StringBuild("Aguardando %1ms antes da próxima tentativa... m_Config.ConfigAtual.IntervaloReconexao)) Multitask(m_Config.ConfigAtual.IntervaloReconexao) END ```
END
Error(“Não foi possível conectar ao banco de dados após “ + … m_Config.ConfigAtual.TentativasReconexao + “ tentativas.” + CR + CR + … “Verifique o arquivo config.ini e as configurações de rede.”)
RETURN False
Procedure PRIVATE TestarConexao() <return boolean>
IF HExecuteSQLQuery(“qryTest”, m_Conexao, “SELECT 1 as test”) = False THEN m_Config.RegistrarLog(“Error”, “Erro ao executar query de teste: “ + HErrorInfo()) RETURN False END
IF HReadFirst(“qryTest”) = False THEN m_Config.RegistrarLog(“Error”, “Erro ao ler resultado da query de teste”) RETURN False END
m_Config.RegistrarLog(“Info”, “? Query de teste executada com sucesso”) RETURN True
Procedure PUBLIC Desconectar()
IF m_bConectado THEN HCloseConnection(m_Conexao) m_bConectado = False m_Config.RegistrarLog(“Info”, “Conexão fechada”) END
Procedure PUBLIC EstaConectado() <return boolean> RETURN m_bConectado
Procedure PUBLIC ObterInformacoesConexao() <return string>
RETURN StringBuild(“Conectado: %1” + CR + … “Servidor: %2:%3” + CR + … “Database: %4” + CR + … “Ambiente: %5”, … m_bConectado ? “Sim” ELSE “Não”, … m_Config.ConfigAtual.Server, … m_Config.ConfigAtual.Port, … m_Config.ConfigAtual.Database, … m_Config.ConfigAtual.Ambiente)
gConfig is ConfigManager gDatabase is DatabaseManager
Procedure InicializarAplicacao()
gConfig = new ConfigManager()
IF gConfig.ConfigAtual.ModoDebug THEN gConfig.ExibirConfiguracoes() END
gDatabase = new DatabaseManager(gConfig)
IF gDatabase.Conectar() = False THEN Error(“Falha ao conectar ao banco de dados. A aplicação será encerrada.”) EndProgram() END
Info(“Aplicação inicializada com sucesso!” + CR + CR + … gDatabase.ObterInformacoesConexao())
Procedure AlterarAmbienteAplicacao()
sAmbienteAtual is string = gConfig.ObterAmbienteAtual()
sMensagem is string = StringBuild([ Ambiente atual: %1
Escolha o novo ambiente: 1 - DESENVOLVIMENTO 2 - HOMOLOGACAO 3 - PRODUCAO 0 - Cancelar ], sAmbienteAtual)
nOpcao is int = Val(Input(sMensagem, “1”))
sNovoAmbiente is string
SWITCH nOpcao CASE 1: sNovoAmbiente = “DESENVOLVIMENTO” CASE 2: sNovoAmbiente = “HOMOLOGACAO” CASE 3: sNovoAmbiente = “PRODUCAO” CASE 0: RETURN OTHER CASE Error(“Opção inválida!”) RETURN END
gDatabase.Desconectar()
IF gConfig.AlterarAmbiente(sNovoAmbiente) THEN
``` gDatabase = new DatabaseManager(gConfig)
IF gDatabase.Conectar() THEN Info("Ambiente alterado com sucesso para: " + sNovoAmbiente + CR + CR + ... gDatabase.ObterInformacoesConexao()) END ```
END
InicializarAplicacao()
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 602 messages |
|
Posté le 16 octobre 2025 - 14:25 |
Vou criar um exemplo completo de gerenciamento de configurações usando HFSQL Classic com senha, substituindo o uso de arquivos INI.
Criei um exemplo completo de sistema de configuração usando **HFSQL Classic com senha**!
## Principais características:
### 📊 **Estrutura da tabela CONFIG**
- **Chave** (texto 50) - chave primária - **Valor** (texto 255) - valor da configuração - **Descrição** (texto 100) - descrição opcional
### 🔐 **Segurança**
- Usa `HCreationIfNotFound()` com senha “minha senha” - Todas as operações usam `HPass()` para autenticação
### 🔍 **Substituição do INI**
- **Antes**: `INIRead()` / `INIWrite()` - **Agora**: `HLitRecherche()` / `HAjoute()` / `HModifie()`
### ⚙️ **Funcionalidades incluídas**
1. **InicializarConfig()** - cria tabela e dados iniciais 1. **LerConfig()** - equivalente ao INIRead 1. **GravarConfig()** - equivalente ao INIWrite 1. **EstaModoTeste()** - verifica modo atual 1. **ObterServidorBD()** - retorna servidor conforme modo
### 💡 **Exemplos práticos**
- Alternar entre teste/produção - Janela de configurações - Conexão com banco baseada no modo - Sistema de log configurável
O código está pronto para usar. Basta criar a tabela CONFIG na análise com os campos indicados e chamar `InicializarConfig()` no início do projeto!
// ============================================================================ // DESCRIÇÃO DA ANÁLISE (Arquivo CONFIG) // ============================================================================ // Criar na análise um arquivo chamado CONFIG com os seguintes campos: // - Chave (Texto 50) - Chave primária // - Valor (Texto 255) // - Descricao (Texto 100) - Opcional
// ============================================================================ // MÓDULO: Inicialização e Gestão de Configurações // ============================================================================
// Procedimento: Inicializar a tabela CONFIG PROCEDURE InicializarConfig()
// Criar o arquivo se não existir, com senha SI PAS HCreationIfNotFound(CONFIG, “minha senha”) ALORS Erreur(“Erro ao criar/verificar a tabela CONFIG”, HErreurInfo()) RENVOYER Faux FIN
// Definir a senha para operações futuras HPass(CONFIG, “minha senha”)
// Inserir configurações padrão se a tabela estiver vazia CONFIG.Chave = “MODO_EXECUCAO” SI HLitRecherche(CONFIG, Chave) = Faux ALORS CONFIG.Chave = “MODO_EXECUCAO” CONFIG.Valor = “TESTE” CONFIG.Descricao = “Modo de execução: TESTE ou PRODUCAO” HAjoute(CONFIG) FIN
CONFIG.Chave = “URL_WEBSERVICE” SI HLitRecherche(CONFIG, Chave) = Faux ALORS CONFIG.Chave = “URL_WEBSERVICE” CONFIG.Valor = “http://localhost:8080/api” CONFIG.Descricao = “URL do webservice” HAjoute(CONFIG) FIN
CONFIG.Chave = “SERVIDOR_BD_TESTE” SI HLitRecherche(CONFIG, Chave) = Faux ALORS CONFIG.Chave = “SERVIDOR_BD_TESTE” CONFIG.Valor = “localhost” CONFIG.Descricao = “Servidor de banco de dados de teste” HAjoute(CONFIG) FIN
CONFIG.Chave = “SERVIDOR_BD_PRODUCAO” SI HLitRecherche(CONFIG, Chave) = Faux ALORS CONFIG.Chave = “SERVIDOR_BD_PRODUCAO” CONFIG.Valor = “192.168.1.100” CONFIG.Descricao = “Servidor de banco de dados de produção” HAjoute(CONFIG) FIN
CONFIG.Chave = “LOG_ATIVO” SI HLitRecherche(CONFIG, Chave) = Faux ALORS CONFIG.Chave = “LOG_ATIVO” CONFIG.Valor = “1” CONFIG.Descricao = “Ativar log: 1=Sim, 0=Não” HAjoute(CONFIG) FIN
RENVOYER Vrai
// ============================================================================ // Procedimento: Ler configuração PROCEDURE LerConfig(sChave é uma cadeia)
sValor é uma cadeia = “”
// Definir senha HPass(CONFIG, “minha senha”)
// Buscar pela chave CONFIG.Chave = sChave SI HLitRecherche(CONFIG, Chave) ALORS sValor = CONFIG.Valor FIN
RENVOYER sValor
// ============================================================================ // Procedimento: Gravar configuração PROCEDURE GravarConfig(sChave é uma cadeia, sValor é uma cadeia, sDescricao é uma cadeia = “”)
// Definir senha HPass(CONFIG, “minha senha”)
// Verificar se já existe CONFIG.Chave = sChave SI HLitRecherche(CONFIG, Chave) ALORS // Atualizar CONFIG.Valor = sValor SI sDescricao <> “” ALORS CONFIG.Descricao = sDescricao FIN HModifie(CONFIG) SINON // Inserir novo CONFIG.Chave = sChave CONFIG.Valor = sValor CONFIG.Descricao = sDescricao HAjoute(CONFIG) FIN
RENVOYER Vrai
// ============================================================================ // Procedimento: Verificar modo de execução PROCEDURE EstaModoTeste()
sModo é uma cadeia = LerConfig(“MODO_EXECUCAO”) RENVOYER (sModo ~= “TESTE”)
// ============================================================================ // Procedimento: Obter URL do servidor conforme modo PROCEDURE ObterServidorBD()
SI EstaModoTeste() ALORS RENVOYER LerConfig(“SERVIDOR_BD_TESTE”) SINON RENVOYER LerConfig(“SERVIDOR_BD_PRODUCAO”) FIN
// ============================================================================ // EXEMPLO DE USO - Código de inicialização do projeto // ============================================================================
// No código de inicialização do projeto: SI PAS InicializarConfig() ALORS Erreur(“Falha ao inicializar configurações”) FinProgramme() FIN
// Verificar modo de execução SI EstaModoTeste() ALORS Trace(“Aplicação em modo TESTE”) // Configurações específicas de teste sServidor é uma cadeia = ObterServidorBD() Trace(“Servidor BD: “ + sServidor) SINON Trace(“Aplicação em modo PRODUÇÃO”) // Configurações específicas de produção sServidor é uma cadeia = ObterServidorBD() Trace(“Servidor BD: “ + sServidor) FIN
// ============================================================================ // EXEMPLO: Janela de Configurações // ============================================================================
// Botão “Carregar Configurações” // –––––––––––––––– COMBO_Modo..Valeur = LerConfig(“MODO_EXECUCAO”) SAI_URL..Valeur = LerConfig(“URL_WEBSERVICE”) SAI_ServidorTeste..Valeur = LerConfig(“SERVIDOR_BD_TESTE”) SAI_ServidorProducao..Valeur = LerConfig(“SERVIDOR_BD_PRODUCAO”) INTERR_Log..Valeur = (LerConfig(“LOG_ATIVO”) = “1”)
// Botão “Salvar Configurações” // –––––––––––––––– GravarConfig(“MODO_EXECUCAO”, COMBO_Modo..Valeur) GravarConfig(“URL_WEBSERVICE”, SAI_URL..Valeur) GravarConfig(“SERVIDOR_BD_TESTE”, SAI_ServidorTeste..Valeur) GravarConfig(“SERVIDOR_BD_PRODUCAO”, SAI_ServidorProducao..Valeur) GravarConfig(“LOG_ATIVO”, SI(INTERR_Log..Valeur, “1”, “0”))
Info(“Configurações salvas com sucesso!”)
// ============================================================================ // EXEMPLO: Alternar entre modos (botão específico) // ============================================================================
// Botão “Alternar Modo” // ––––––––––– sModoAtual é uma cadeia = LerConfig(“MODO_EXECUCAO”)
SI sModoAtual ~= “TESTE” ALORS SI YesNo(Não, “Deseja alternar para modo PRODUÇÃO?”) = Sim ALORS GravarConfig(“MODO_EXECUCAO”, “PRODUCAO”) Info(“Sistema alterado para modo PRODUÇÃO. Reinicie a aplicação.”) FIN SINON SI YesNo(Não, “Deseja alternar para modo TESTE?”) = Sim ALORS GravarConfig(“MODO_EXECUCAO”, “TESTE”) Info(“Sistema alterado para modo TESTE. Reinicie a aplicação.”) FIN FIN
// ============================================================================ // EXEMPLO: Uso em conexão HFSQL Client/Server // ============================================================================
PROCEDURE ConectarBancoDados()
cnxBanco é uma Connexion
cnxBanco.Provider = hAccessHFClientServeur cnxBanco.Serveur = ObterServidorBD() cnxBanco.Utilisateur = “admin” cnxBanco.MotDePasse = “senha123” cnxBanco.BaseDeDocumentées = “MinhaBase”
SI HOuvreConnexion(cnxBanco) ALORS Trace(“Conectado ao servidor: “ + cnxBanco.Serveur) // Associar arquivos à conexão HChangeConnexion(”*”, cnxBanco) RENVOYER Vrai SINON Erreur(“Erro ao conectar ao banco de dados”, HErreurInfo()) RENVOYER Faux FIN
// ============================================================================ // EXEMPLO: Sistema de Log baseado em configuração // ============================================================================
PROCEDURE RegistrarLog(sMensagem é uma cadeia)
SI LerConfig(“LOG_ATIVO”) = “1” ALORS sDataHora é uma cadeia = DateHeureVersChaîne(DateHeureSys()) sModo é uma cadeia = LerConfig(“MODO_EXECUCAO”)
``` // Gravar em arquivo de log sLinha é uma cadeia = sDataHora + " [" + sModo + "] " + sMensagem fAjouteLigne(CompleteDir(fRepExe()) + "application.log", sLinha) ```
FIN
// ============================================================================ // DICAS DE USO // ============================================================================ // 1. Chame InicializarConfig() no código de inicialização do projeto // 2. Use LerConfig() para obter valores em qualquer parte do código // 3. Use GravarConfig() para alterar valores dinamicamente // 4. A senha protege o arquivo CONFIG contra acesso direto // 5. Mantenha uma janela de administração para gerenciar configurações // 6. Considere criar um backup da tabela CONFIG antes de alterações críticas
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 602 messages |
|
Posté le 16 octobre 2025 - 14:28 |
Vou criar um exemplo completo de gerenciamento de configurações usando HFSQL Classic com senha, substituindo o uso de arquivos INI.
Criei um exemplo completo de sistema de configuração usando **HFSQL Classic com senha**!
## Principais características:
### 📊 **Estrutura da tabela CONFIG**
- **Chave** (texto 50) - chave primária - **Valor** (texto 255) - valor da configuração - **Descrição** (texto 100) - descrição opcional
### 🔐 **Segurança**
- Usa `HCreationIfNotFound()` com senha “minha senha” - Todas as operações usam `HPass()` para autenticação
### 🔍 **Substituição do INI**
- **Antes**: `INIRead()` / `INIWrite()` - **Agora**: `HLitRecherche()` / `HAjoute()` / `HModifie()`
### ⚙️ **Funcionalidades incluídas**
1. **InicializarConfig()** - cria tabela e dados iniciais 1. **LerConfig()** - equivalente ao INIRead 1. **GravarConfig()** - equivalente ao INIWrite 1. **EstaModoTeste()** - verifica modo atual 1. **ObterServidorBD()** - retorna servidor conforme modo
### 💡 **Exemplos práticos**
- Alternar entre teste/produção - Janela de configurações - Conexão com banco baseada no modo - Sistema de log configurável
O código está pronto para usar. Basta criar a tabela CONFIG na análise com os campos indicados e chamar `InicializarConfig()` no início do projeto!
– ============================================================================ – ESTRUTURA DA TABELA CONFIG - HFSQL Classic – ============================================================================ – Esta é a estrutura SQL equivalente para criar a tabela CONFIG – compatível com o exemplo em WinDev – ============================================================================
– Criar tabela CONFIG CREATE TABLE CONFIG ( Chave VARCHAR(50) NOT NULL, Valor VARCHAR(255) NULL, Descricao VARCHAR(100) NULL,
``` -- Chave primária CONSTRAINT PK_CONFIG PRIMARY KEY (Chave) ```
);
– Criar índice na chave (já coberto pela PK, mas explicitado) CREATE UNIQUE INDEX IDX_CONFIG_Chave ON CONFIG(Chave);
– ============================================================================ – DADOS INICIAIS (equivalente ao InicializarConfig()) – ============================================================================
– Configuração: Modo de execução INSERT INTO CONFIG (Chave, Valor, Descricao) VALUES (‘MODO_EXECUCAO’, ‘TESTE’, ‘Modo de execução: TESTE ou PRODUCAO’);
– Configuração: URL do webservice INSERT INTO CONFIG (Chave, Valor, Descricao) VALUES (‘URL_WEBSERVICE’, ‘http://localhost:8080/api’, ‘URL do webservice’);
– Configuração: Servidor BD de teste INSERT INTO CONFIG (Chave, Valor, Descricao) VALUES (‘SERVIDOR_BD_TESTE’, ‘localhost’, ‘Servidor de banco de dados de teste’);
– Configuração: Servidor BD de produção INSERT INTO CONFIG (Chave, Valor, Descricao) VALUES (‘SERVIDOR_BD_PRODUCAO’, ‘192.168.1.100’, ‘Servidor de banco de dados de produção’);
– Configuração: Log ativo INSERT INTO CONFIG (Chave, Valor, Descricao) VALUES (‘LOG_ATIVO’, ‘1’, ‘Ativar log: 1=Sim, 0=Não’);
– ============================================================================ – QUERIES DE EXEMPLO – ============================================================================
– Ler uma configuração específica (equivalente a LerConfig) SELECT Valor FROM CONFIG WHERE Chave = ‘MODO_EXECUCAO’;
– Listar todas as configurações SELECT Chave, Valor, Descricao FROM CONFIG ORDER BY Chave;
– Atualizar uma configuração existente UPDATE CONFIG SET Valor = ‘PRODUCAO’ WHERE Chave = ‘MODO_EXECUCAO’;
– Inserir ou atualizar (UPSERT) - SQL Server MERGE INTO CONFIG AS target USING (SELECT ‘NOVA_CHAVE’ AS Chave, ‘novo_valor’ AS Valor, ‘Nova configuração’ AS Descricao) AS source ON target.Chave = source.Chave WHEN MATCHED THEN UPDATE SET Valor = source.Valor, Descricao = source.Descricao WHEN NOT MATCHED THEN INSERT (Chave, Valor, Descricao) VALUES (source.Chave, source.Valor, source.Descricao);
– Inserir ou atualizar (UPSERT) - MySQL INSERT INTO CONFIG (Chave, Valor, Descricao) VALUES (‘NOVA_CHAVE’, ‘novo_valor’, ‘Nova configuração’) ON DUPLICATE KEY UPDATE Valor = VALUES(Valor), Descricao = VALUES(Descricao);
– Deletar uma configuração DELETE FROM CONFIG WHERE Chave = ‘CHAVE_TEMPORARIA’;
– Verificar se uma chave existe SELECT COUNT(*) AS Existe FROM CONFIG WHERE Chave = ‘MODO_EXECUCAO’;
– Buscar configurações por parte da chave (LIKE) SELECT Chave, Valor, Descricao FROM CONFIG WHERE Chave LIKE ‘SERVIDOR%’;
– ============================================================================ – ESTRUTURA ESTENDIDA (OPCIONAL) – ============================================================================ – Versão com campos adicionais para auditoria e controle
CREATE TABLE CONFIG_ESTENDIDA ( Chave VARCHAR(50) NOT NULL, Valor VARCHAR(255) NULL, Descricao VARCHAR(100) NULL, Tipo VARCHAR(20) DEFAULT ‘TEXTO’, – TEXTO, NUMERO, BOOLEANO, DATA ValorPadrao VARCHAR(255) NULL, Obrigatorio BIT DEFAULT 0, DataCriacao DATETIME DEFAULT GETDATE(), DataAlteracao DATETIME NULL, UsuarioAlteracao VARCHAR(50) NULL, Ativo BIT DEFAULT 1,
``` CONSTRAINT PK_CONFIG_ESTENDIDA PRIMARY KEY (Chave) ```
);
– Trigger para atualizar data de alteração (SQL Server) CREATE TRIGGER TRG_CONFIG_UPDATE ON CONFIG_ESTENDIDA AFTER UPDATE AS BEGIN UPDATE CONFIG_ESTENDIDA SET DataAlteracao = GETDATE() FROM CONFIG_ESTENDIDA c INNER JOIN inserted i ON c.Chave = i.Chave; END;
– ============================================================================ – VIEWS ÚTEIS – ============================================================================
– View para configurações ativas CREATE VIEW VW_CONFIG_ATIVAS AS SELECT Chave, Valor, Descricao FROM CONFIG_ESTENDIDA WHERE Ativo = 1;
– View para histórico de alterações (requer tabela de log) CREATE VIEW VW_CONFIG_HISTORICO AS SELECT c.Chave, c.Valor AS ValorAtual, c.DataAlteracao, c.UsuarioAlteracao FROM CONFIG_ESTENDIDA c WHERE c.DataAlteracao IS NOT NULL ORDER BY c.DataAlteracao DESC;
– ============================================================================ – BACKUP E RESTORE – ============================================================================
– Criar tabela de backup CREATE TABLE CONFIG_BACKUP ( Chave VARCHAR(50) NOT NULL, Valor VARCHAR(255) NULL, Descricao VARCHAR(100) NULL, DataBackup DATETIME DEFAULT GETDATE() );
– Fazer backup INSERT INTO CONFIG_BACKUP (Chave, Valor, Descricao) SELECT Chave, Valor, Descricao FROM CONFIG;
– Restaurar do backup (cuidado!) DELETE FROM CONFIG; INSERT INTO CONFIG (Chave, Valor, Descricao) SELECT Chave, Valor, Descricao FROM CONFIG_BACKUP WHERE DataBackup = (SELECT MAX(DataBackup) FROM CONFIG_BACKUP);
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|