PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV 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:

// No início da app (por ex. Global declarations do projeto)

//Só na linha do ServerConnection mude para:

[code:wl]
//Conexao
HModifyStructure("*") //sem isso nao funciona!!!!!!!
HCreationIfNotFound("*") //sem isso nao funciona!!!!!!!


//Aqui está a diferença

IF InTestMode() THEN

// --- Ambiente de teste (F9): base local ---

ServerConection..Server = “177.69.238.21:4901

ELSE

// --- Ambiente de produção (deploy): base do servidor ---

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:

//Conexao

HModifyStructure("*") //sem isso nao funciona!!!!!!!
HCreationIfNotFound("*") //sem isso nao funciona!!!!!!!

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

//##############################
// ?? Conexão dinâmica com HFSQL via INI + InTestMode()

// Estrutura: app.ini
// [TESTE]
// SERVER=localhost
// DATABASE=DB_LOCAL
// USER=usr_local
// PASSWORD=pwd_local
//
// [PROD]
// SERVER=SRV-DB
// DATABASE=DB_PROD
// USER=usr_prod
// PASSWORD=pwd_prod

Procedure InicializaConexaoHFSQL()

// Variáveis
modoExecucao is string
secaoINI is string
servidor is string
banco is string
usuario is string
senha is string
conexao is Connection

// Detecta se está rodando em modo F9 (teste local)
IF InTestMode() THEN
modoExecucao = "TESTE"
ELSE
modoExecucao = "PROD"
END

secaoINI = modoExecucao

// Caminho do arquivo INI (na mesma pasta do executável)
arqINI is string = fExeDir() + ["\"] + "app.ini"

// Verifica se arquivo existe
IF NOT fFileExist(arqINI) THEN
Error("Arquivo INI não encontrado: " + arqINI)
RETURN
END

// Lê parâmetros da seção correspondente
servidor = fLoadText(arqINI, secaoINI, "SERVER")
banco = fLoadText(arqINI, secaoINI, "DATABASE")
usuario = fLoadText(arqINI, secaoINI, "USER")
senha = fLoadText(arqINI, secaoINI, "PASSWORD")

// Valida parâmetros
IF servidor = "" OR banco = "" THEN
Error("Parâmetros inválidos no INI. Verifique seção: " + secaoINI)
RETURN
END

// Define a conexão
HDescribeConnection("cnxAuto", servidor, 4900, usuario, senha, banco, hNativeAccessHFClientServer)
HOpenConnection("cnxAuto")

// Testa conexão
IF HCheckConnection("cnxAuto") = False THEN
Error("Falha ao conectar com o servidor HFSQL: " + servidor + CR + HErrorInfo())
RETURN
END

// Troca todas as tabelas para esta conexão
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

// No início da app (por ex. Global declarations do projeto)

ServerConection is Connection

//Só na linha do ServerConnection mude para:

IF InTestMode() THEN

// --- Ambiente de teste (F9): base local ---

ServerConection..Server = “serverwx02_postgresql.hfsql.com.br


ELSE
// --- Ambiente de produção (deploy): base do servidor ---

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)
//Info("Conexao com Sucesso")
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? 🔧​​​​​​​​​​​​​​​​


// ============================================================================
// ARQUIVO: config.ini (criar na raiz do projeto ou pasta Config)
// ============================================================================
/*
[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
*/




// ============================================================================
// CLASSE: ConfigManager
// Gerencia configurações da aplicação via arquivo INI
// ============================================================================

ConfigManager is Class
// Propriedades privadas
PRIVATE
m_sCaminhoArquivo is string
m_sAmbienteAtual is string
m_bCarregado is boolean = False

```
// Propriedades públicas
PUBLIC
ConfigAtual is dynamic Config
```

END

// ––––––––––––––––––––––––––––––––––––––
// ESTRUTURA: Config
// Armazena todas as configurações do ambiente
// ––––––––––––––––––––––––––––––––––––––
Config is structure
// Banco de Dados
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

```
// Aplicação
Ambiente is string
NomeApp is string
Versao is string
ModoDebug is boolean
LogarConexoes is boolean
TentativasReconexao is int
IntervaloReconexao is int

// Logs
LogsAtivo is boolean
LogsNivel is string
LogsArquivo is string
LogsTamanhoMaximo is int
```

END

// ============================================================================
// CONSTRUTOR da Classe ConfigManager
// ============================================================================
Procedure Constructor(LOCAL sCaminhoArquivo is string = “)

IF sCaminhoArquivo = “ THEN
// Caminho padrão
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

// Caminho completo do arquivo
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

// ============================================================================
// MÉTODO: TestarConexao
// Testa a conexão executando uma query simples
// ============================================================================
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

// ============================================================================
// MÉTODO: Desconectar
// Fecha a conexão com o banco
// ============================================================================
Procedure PUBLIC Desconectar()

IF m_bConectado THEN
HCloseConnection(m_Conexao)
m_bConectado = False
m_Config.RegistrarLog(Info, “Conexão fechada)
END

// ============================================================================
// MÉTODO: EstaConectado
// Verifica se está conectado
// ============================================================================
Procedure PUBLIC EstaConectado() <return boolean>
RETURN m_bConectado

// ============================================================================
// MÉTODO: ObterInformacoesConexao
// Retorna informações sobre a conexão
// ============================================================================
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)



// ============================================================================
// EXEMPLO DE USO NO PROJETO
// Cole este código nas Global Declarations do projeto
// ============================================================================

// Variáveis globais
gConfig is ConfigManager
gDatabase is DatabaseManager

// ============================================================================
// PROCEDURE: InicializarAplicacao
// Inicializa a aplicação com as configurações
// ============================================================================
Procedure InicializarAplicacao()

// Instancia o gerenciador de configurações
gConfig = new ConfigManager()

// Exibe as configurações (opcional, apenas para debug)
IF gConfig.ConfigAtual.ModoDebug THEN
gConfig.ExibirConfiguracoes()
END

// Instancia o gerenciador de banco de dados
gDatabase = new DatabaseManager(gConfig)

// Conecta ao banco de dados
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
// Permite trocar de ambiente em tempo de execução
// ============================================================================
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

// Desconecta do banco atual
gDatabase.Desconectar()

// Altera o ambiente
IF gConfig.AlterarAmbiente(sNovoAmbiente) THEN

```
// Reinicializa o database manager
gDatabase = new DatabaseManager(gConfig)

// Reconecta
IF gDatabase.Conectar() THEN
Info("Ambiente alterado com sucesso para: " + sNovoAmbiente + CR + CR + ...
gDatabase.ObterInformacoesConexao())
END
```

END

// ============================================================================
// INICIALIZAÇÃO AUTOMÁTICA
// Cole no código de inicialização do projeto
// ============================================================================

// No evento “Inicialização” do projeto, adicione:
InicializarAplicacao()

// No menu ou botão “Trocar Ambiente”, adicione:
// AlterarAmbienteAplicacao()


--
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/