tAds é uma biblioteca ORM (Object-Relational Mapping) para Harbour/xBase que simplifica o acesso ao Advantage Database Server (ADS) utilizando programação orientada a objetos.
- ✅ Acesso a tabelas via RDD (ISAM) e SQL
- ✅ Suporte a múltiplas conexões simultâneas
- ✅ Conexão Local, Remota e via Internet
- ✅ DataSet para execução de queries SQL
- ✅ Geração automática de classes de tabelas
- ✅ Suporte a transações (Begin, Commit, Rollback)
- ✅ Gerenciamento de usuários e grupos
- ✅ Funções de backup e restore
- ✅ Integração com xBrowse do FiveWin
- ✅ Compatível com FiveWin e modo console
tAds/
├── Source/
│ ├── tAds.prg # Classe principal TAds
│ ├── tAdsConection.prg # Classe de conexão tAdsConnection
│ ├── tAdsClassBuild.prg # Gerador de classes de tabelas
│ ├── tAdsFunctions.prg # Funções utilitárias
│ ├── tAdsManager.prg # Gerenciador de tabelas
│ ├── tAdsSystem.prg # Funções de sistema
│ ├── tAdsUsers.prg # Gerenciamento de usuários
│ ├── tAdsBackup.prg # Backup e restore
│ ├── tAdsScalarFunctions.prg
│ ├── tAdsPopUpBrowse.prg
│ └── tCtrlxBrowser.prg # Integração com xBrowse
├── Include/
│ └── TAds.ch # Arquivo de includes/defines
├── SourceOld/ # Funções legadas
└── WhatsNew.txt # Histórico de versões
- Clone o repositório:
git clone https://github.com/giovanyvecchi/tAdsGit.git- Adicione os arquivos ao seu projeto
.hbp:
path/to/tAds/Source/*.prg
- Inclua o header nos seus arquivos
.prg:
#Include "FiveWin.ch"
#Include "TAds.ch"// Inicializa a configuração do tAds
TADS_START_CONFIG("C:\TEMP\", "senhaAdsSys")// Cria uma conexão com o dicionário de dados
oConexao := tAdsConnection():New(1, .F.)
oConexao:cDataDictionary := "\\servidor\dados\MeuBanco.add"
oConexao:cUserLogin := "adssys"
oConexao:cSenhaConnect := "minhaSenha"
oConexao:nTpConnect := 4 // 1=Local, 4=Internet
// Conecta
If oConexao:tAdsConnect()
MsgInfo("Conectado com sucesso!")
EndIf
// Desconecta ao finalizar
oConexao:tAdsCloseConnect()| Valor | Descrição |
|---|---|
| 1 | Conexão Local |
| 2 | Conexão Remota |
| 3 | Remota ou Local |
| 4 | Via Internet |
| 5 | Internet ou Local |
| 6 | Remota ou Internet |
| 7 | Remota, Internet ou Local |
// Abre tabela diretamente
oDb_Clientes := tAds():NewRdd("CLIENTES", 1, 60)
// Navegação
oDb_Clientes:GoTop()
Do While !oDb_Clientes:Eof()
? oDb_Clientes:VarGet("NOME")
? oDb_Clientes:VarGet("CIDADE")
oDb_Clientes:Skip()
EndDo
// Fecha a tabela
oDb_Clientes:End()// Criar novo registro
oDb_Clientes:Append()
oDb_Clientes:VarPut("NOME", "João Silva")
oDb_Clientes:VarPut("CIDADE", "São Paulo")
oDb_Clientes:VarPut("SALARIO", 5000.00)
oDb_Clientes:Commit(.T.)
// Ler registro
oDb_Clientes:Seek("João Silva", "NOME")
cNome := oDb_Clientes:VarGet("NOME")
// Atualizar registro
oDb_Clientes:RLock()
oDb_Clientes:VarPut("SALARIO", 6000.00)
oDb_Clientes:Commit(.T.)
// Excluir registro
oDb_Clientes:RLock()
oDb_Clientes:Delete()// SELECT - Tipo 1
oDs := tAds():DsNew(1, 1) // 1=Select, 1=Conexão
oDs:cQrySql := "SELECT * FROM CLIENTES WHERE CIDADE = 'São Paulo' ORDER BY NOME"
oDs:DsExecute()
Do While !(oDs:cAlias)->(Eof())
? (oDs:cAlias)->NOME
(oDs:cAlias)->(DbSkip())
EndDo
oDs:End()
// INSERT/UPDATE/DELETE - Tipo 2
oDs := tAds():DsNew(2, 1) // 2=Comando, 1=Conexão
oDs:cQrySql := "UPDATE CLIENTES SET ATIVO = TRUE WHERE CIDADE = 'São Paulo'"
oDs:DsExecute()
oDs:End()oDs := tAds():DsNew(1)
oDs:cQrySql := "SELECT * FROM CLIENTES WHERE SALARIO > _Salario_ AND DT_CADASTRO >= _Data_"
oDs:DsAddVar("_Salario_", 3000.00)
oDs:DsAddVar("_Data_", Date() - 30)
oDs:DsExecute()oDb_Clientes := tAds():NewRdd("CLIENTES")
// Filtro simples
oDb_Clientes:Filter("CIDADE = 'São Paulo'")
// Filtro com variáveis
oDb_Clientes:Filter("SALARIO > _nSalario_", {{"_nSalario_", 2000.00}})
// Limpar filtro
oDb_Clientes:ClearFilter()O tAds pode gerar automaticamente classes para suas tabelas:
// Gera classe para a tabela CLIENTES
TAds_CreateClassFromDatabase(1, "CLIENTES", "C:\MeuProjeto\DataBases\")Isso cria um arquivo DataBase_CLIENTES.prg:
CLASS DB_CLIENTES FROM TAds
Data cTableName Init 'CLIENTES'
METHOD OpenRdd(f_nConexao, f_nCache, f_lExclusive, f_lDataLoadOnSkip) Constructor
METHOD End()
ENDCLASSUso da classe gerada:
oDb_Clientes := DB_CLIENTES():OpenRdd()
oDb_Clientes:Seek(123, "CODIGO")
? oDb_Clientes:VarGet("NOME")
oDb_Clientes:End()// Backup completo
tAds_BackupDataBase(1, "E:\BACKUP", Nil)
// Backup diferencial (após preparação)
tAds_BackupDataBase(1, "E:\BACKUP", "PrepareDiff") // Prepara
tAds_BackupDataBase(1, "E:\BACKUP", "Diff") // Executa diferencial
// Restore
tAds_RestoreDataBase("E:\BACKUP\MeuBanco.add", "C:\DADOS\MeuBanco.add", "senhaOrigem")// Criar usuário
tAds_CreateUser(1, "joao", "senha123", "João da Silva")
// Alterar senha
tAds_ModifyUserProperty(1, "joao", "novaSenha")
// Criar grupo
tAds_CreateGroup(1, "VENDEDORES", "Grupo de vendedores")
// Adicionar usuário ao grupo
tAds_AddUserToGroup(1, "joao", "VENDEDORES")
// Remover usuário do grupo
tAds_RemoveUserFromGroup(1, "joao", "VENDEDORES")
// Excluir usuário
tAds_DropUser(1, "joao")// Inicia transação
tAds_BeginTransaction(1)
TRY
oDb_Clientes:Append()
oDb_Clientes:VarPut("NOME", "Teste")
oDb_Clientes:Commit()
oDb_Pedidos:Append()
oDb_Pedidos:VarPut("COD_CLIENTE", oDb_Clientes:VarGet("CODIGO"))
oDb_Pedidos:Commit()
// Confirma transação
tAds_CommitTransaction(1)
CATCH
// Desfaz transação em caso de erro
tAds_RollBackTransaction(1)
ENDoDb_Clientes := DB_CLIENTES():OpenRdd()
oBrw := TXBrowse():New(oWnd)
oBrw:cAlias := oDb_Clientes:cAlias
oBrw:SetRDD()
oBrw:CreateFromCode()
// Configura controle de navegação
oCtrlBrw := tCtrlxBrw():New(oBrw, oDb_Clientes)| Método | Descrição |
|---|---|
NewRdd(cTable, nConn, nCache) |
Abre tabela em modo RDD |
DsNew(nTipo, nConn) |
Cria DataSet para SQL |
DsExecute() |
Executa query SQL |
VarGet(cCampo) |
Lê valor do campo |
VarPut(cCampo, uValor) |
Grava valor no campo |
Seek(uValor, cTag) |
Pesquisa registro |
Filter(cFiltro) |
Aplica filtro AOF |
Append() |
Cria novo registro |
Delete() |
Marca registro para exclusão |
RLock() |
Trava registro |
UnLock() |
Destrava registro |
Commit() |
Confirma alterações |
Skip(n) |
Avança/retrocede registros |
GoTop() / GoBottom() |
Vai para primeiro/último |
Eof() / Bof() |
Verifica fim/início |
End() |
Fecha tabela/DataSet |
// Tipos de conexão
#Define df_ConnectLocal 1
#Define df_ConnectRemote 2
#Define df_ConnectInternet 4
// Tipos de arquivo
#Define df_FileCdx 2
#Define df_FileAdt 3
// Parâmetros de KeyCount
#Define df_nKeysVisibles 1
#Define df_nKeysAllIndex 2
// Parâmetros de Seek
#Define df_lSeekAproximadoOn .T.
#Define df_lSeekAproximadoOff .F.- Harbour Compiler (3.0+)
- FiveWin (opcional, para GUI)
- Advantage Database Server (10.1+)
- RddAds library
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Giovany Vecchi
- Email: giovanyvecchi@gmail.com
- GitHub: @giovanyvecchi
Contribuições são bem-vindas! Sinta-se à vontade para:
- Fazer um Fork do projeto
- Criar uma branch para sua feature (
git checkout -b feature/NovaFeature) - Commit suas mudanças (
git commit -m 'Adiciona NovaFeature') - Push para a branch (
git push origin feature/NovaFeature) - Abrir um Pull Request
Desenvolvido com ❤️ para a comunidade Harbour/FiveWin