A anos trabalho com ads e tive muitos problemas tentando usar dicionarios de dados ADT e DBFs livres. Neste percurso desde 2004 quando comecei com advantage resolvi ir atribuindo a ferramentas que eu mesmo contrui. Primeiramente o xAds para trabalhar com DBFs livres, depois de muito tempo desenvolvi o tAds para trabalhar estilo OOP com RDD e Sql mesmo em ISAM juntos e com varias conexões ao mesmo tempo.
Hoje trabalho assim:
Quando inicio o sistema em tAds chamo a função
TADS_START_CONFIG() que inicia o ambiente de Advantage e cria um vetor para poder acessar 121 conexões simultaneas. A conexão 121 ja é atribuida a um dicionario de dados que tAds cria automaticamente na Pasta \DADOSTMP\TADS_TMP.ADD onde os logs e erros de tads são gravados.
Neste caso parei de usar tabelas livres, somente com dicionarios de dados ja que posso manipular varias conexões e varios dicionarios ao mesmo tempo. Posso tambem abrir um dicionario de advantage em LOCAL e outro REMOTO. Tudo é definido pelo numero de conexão que eu atribui quando abro o dicionario de dados. EX:
- Code: Select all Expand view RUN
TADS_START_CONFIG()
st_oConexaoDefault := tAdsConnection():New(1,.T.)
st_oConexaoDefault:cDataDictionary := "\\SERVER\DADOSADD\Cartorio.add"
st_oConexaoDefault:cSenhaConnect := DECRYPT(cSenhaDataDictionary,"MySenha")
st_oConexaoDefault:nTpConnect := ADS_REMOTE_SERVER
lConectou := st_oConexaoDefault:tAdsConnect()
IF !lConectou
MSGSTOP("Não foi possivel conectar com o servidor principal","Inicie o Programa novamente.")
RETURN (4)
ENDIF
TADS_START_CONFIG()
st_oConexaoDistribuidor := tAdsConnection():New(2,.F.)
st_oConexaoDistribuidor:cDataDictionary := "\\200.182.66.121:2081\DADOSADD\Cartorio.add"
st_oConexaoDistribuidor:cSenhaConnect := DECRYPT(cSenhaDataDictionary,"MySenha")
st_oConexaoDistribuidor:nTpConnect := ADS_AIS_SERVER
lConectou := st_oConexaoDistribuidor:tAdsConnect()
IF !lConectou
MSGSTOP("Não foi possivel conectar com o servidor do Distribuidor","Inicie o Programa novamente.")
RETURN (4)
ENDIF
tAds possui a função
TAds_CreateClassFromDatabase(f_nConnection,f_cTableName,f_cDirectory) para criar um PRG com a Classe da tabela ex:
TAds_CreateClassFromDatabase(1,"CLIENTES","C:\PROJETOS\CARTORIO\DATABASES\")
Quando criado o PRG Tads implementara a classe
DB_CLIENTES que serve para abrir via RDD. Ex:
nConexaoServer := 1
oDb_ClientesServer := DB_CLIENTES():oPenRdd(nConexaoServer) Apos conectado posso abrir a tabela dos clientes de outra conexão usando a mesma classe
nConexaoDistribuidor := 2
oDb_ClientesDistribuidor := DB_CLIENTES():oPenRdd(nConexaoDistribuidor) (oDb_ClientesServer:cAlias)->(xBrowse())
(oDb_ClientesDistribuidor:cAlias)->(xBrowse())
Lembrando que conexões de cursor vivo em RDD no ads fica lento a navegação porque a chamada do registro no servidor e refeita toda vez que for reapresentar os dados ou em um Skip.
Para resolver isto use via SQL com cursores estaticos. Quando invocado os registros são carregados por cache e não pela navegação. Neste caso fica igual a qualquer banco de dados SQL, MySQL,
PostGree, SqlServer etc
- Code: Select all Expand view RUN
oDs_ClientesDistribuidor := tAds()DsNew(1,nConexaoDistribuidor)
oDs_ClientesDistribuidor:cQrySql := "Select {Static} * from CLIENTES Order By NOME"
(oDs_ClientesDistribuidor:cAlias)->(xBrowse())
Há varias maneiras de conectar usando Tads. tAds é Free e pode ser baixado via TORTOISE com este endereço:
https://tads-class-for-harbour.googlecode.com/svn/trunkNa Pasta HelpTAds tem um help de tAds.
Nos proximos dias vou elaborar mais alguns exemplos para incluir no projeto.