ruben Dario wrote:Giovany.
Saludos
Ls pruebas que estoy haciendo me funciona bien, tengo un problema , esporadicamente me sale este mensaje,
La Aplicacion no se puede iniciar Correctamente (0x0000142. Haa Click
Para acepta y Cerrarla.
Es como que algo en memoria quedara. despues de salirme del programa.
#Include "Fivewin.Ch"
#Include "TAds.ch"
#include "xbrowse.ch"
#ifdef __HARBOUR__
#ifndef __XHARBOUR__
#xcommand TRY => BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS
#xtranslate Throw( <oErr> ) => ( Eval( ErrorBlock(), <oErr> ), Break( <oErr> ) )
#endif
#endif
Static oConexaoDefault
function main()
Local cComando := "", nModo := 0
Local lConnected := .f.
Local oError
Local oWndMain, oBarMain, oCursorHand
Local oMenuRdd, oBtnRdd, oBtnServer, oMenuServer,oDatx
Local oBtnInfo, oBtnExit,n
Local cSenhaLocal, cSenhaInternet
//Local oSelf := Self
Local oDs_CATCUE,cSql,cCursor
Local aExistingGrps := {}
Local aColunas := {}, nColTmp := 0
cSenhaLocal := "12345"
TRY
TADS_START_CONFIG() // Inicia as configurações basicas de ambientes para Advantage
oConexaoDefault := tAdsConnection():New(1,.T.) // Conexão de Numero 1 e .T. para definir conexão padrao
oConexaoDefault:cDataDictionary := "J:\PLA3ADS\DADOS\TESTE.ADD" //".\DADOS\TESTE.ADD" //ruben
oConexaoDefault:cSenhaConnect := "12345"
oConexaoDefault:nTpConnect := 1
lConnected := oConexaoDefault:tAdsConnect()
If !lConnected
MsgStop("No hay Conexion con el Diccionario de Dados ")
//Return //Self
Else
MsgInfo("Conexion Con Exito")
XBROWSER "F_CFOP.ADT" FASTEDIT
DbUseArea( .T., "ADS" , "F_CFOP", "cust" )
Browse()
DbCloseArea()
EndIf
CATCH oError
MsgStop(oError:Operation+CRLF+oError:Description,"Ado Connection")
RETURN NIL
END
oConexaoDefault:tAdsCloseConnect()
Memory(-1)
hb_gcAll(.t.) //para que harbour haga una recogida de "basura".
return nil
FUNCTION TADS_START_CONFIG(f_cDirTmp,f_cPassAdsSys)
Local oConnectionTmp, cDirExpr := "", lCreateTmp := .F.
Local aStructTmp := {}
Default f_cDirTmp := "J:\PLA3ADS\DADOSTMP\" //HB_CURDRIVE()+":\"+CURDIR()+"\DADOSTMP\"
Default f_cPassAdsSys := ""
St_cDirTmp := f_cDirTmp
REQUEST DBFCDX , DBFFPT, DBFDBT
REQUEST ADS , ADSX, ADSADTX, ADSKeyno, ADSKeycount, AdsGetRelKeyPos, AdsSetRelKeyPos
hb_rddADSRegister()
Set( _SET_OPTIMIZE, .T. )
//Set( _SET_AUTORDER, .T. )
//RddRegister( "ADSADTX", 1 ) // ADS for Harbour
//RddSetDefault( "ADSADTX" ) // ADS for Harbour
RddRegister( "ADS", 1 ) // ADS for Harbour
RddSetDefault( "ADS" ) // ADS for Harbour
AdsLocking( .T. )
AdsRightsCheck( .T. )
AdsTestRecLocks( .T. )
ADSCACHEOPENTABLES( 10 ) // PADRÃO 0
AdsCacheOpenCursors( 126 ) // PADRÃO 25
AdsSetDateFormat( "DD/MM/YYYY" )
AdsSetEpoch("01/01/1990")
AdsSetFileType( 3 ) /// 1 NTX / 2 CDX / 3 ADT
AdsSetCharType(1)
#ifdef __XHARBOUR__
SET(_SET_HARDCOMMIT,.F.)
#else
SET(106,.F.)
#endif
///SET(43,.F.)
lMkDir(f_cDirTmp)
FERASE(f_cDirTmp+"TADS_ERR.ADI")
If !File(f_cDirTmp+"TADS_TMP.ADD")
cDirExpr := StrTran(f_cDirTmp,"\","\\")
AdsSetServerType(1)
TAds_CreateDataDictionary(cDirExpr+"TADS_TMP.ADD","Dicionario de dados temporal para TAds")
lCreateTmp := .T.
EndIf
oConnectionTmp := tAdsConnection():New(121,.F.)
oConnectionTmp:cDataDictionary := f_cDirTmp+"TADS_TMP.ADD"
oConnectionTmp:cSenhaConnect := f_cPassAdsSys
oConnectionTmp:nTpConnect := 1
oConnectionTmp:tAdsConnect()
If lCreateTmp
if !Empty(f_cPassAdsSys)
TAds_ModifyUserProperty(121,"ADSSYS",f_cPassAdsSys)
EndIf
aadd(aStructTmp,{"STATUS","Short",2,0,1,"Status para Controle Interno",0})
aadd(aStructTmp,{"Dt_Ocorrencia","Date",8,0,1,"Data da Ocorrencia do erro",Nil})
aadd(aStructTmp,{"Hr_Ocorrencia","C",10,0,0,"Horas da Ocorrencia do erro",Nil})
aadd(aStructTmp,{"cComputerName","C",50,0,0,"Nome do Computador ",Nil})
aadd(aStructTmp,{"cInfoProcLine","C",100,0,0,"Linha e procedimento da chamada de DsNew()",Nil})
aadd(aStructTmp,{"nErrorSql","N",7,0,0,"Numero do Erro retornado por AdsGetLastError",Nil})
aadd(aStructTmp,{"cErrorSql","Memo",8,0,0,"Descricao do Erro retornado por AdsGetLastError",Nil})
aadd(aStructTmp,{"cSqlScript","Memo",8,0,0,"Script Sql aplicado",Nil})
aadd(aStructTmp,{"cErrorComplete","Memo",8,0,0,"Descrição completa do erro",Nil})
TAds_CreateTableFromCode(121,"TADS_ERR",aStructTmp,"Tabela para registros de erros de tAds DataSet")
EndIf
RETURN NIL
CLASS DB_CLIENTES from TAds
Data cTableName Init "CLIENTES"
Data nCache
Data lConnected Init .F.
METHOD OpenRdd(f_nConexao,; // Numero da Conexão - Default tAds_GetConnectionDefault()
f_nCache); // Numero de registros em Cache - Default nCacheAds()
Constructor
METHOD Properties(); // Parametros e dados da Tabela
Constructor
METHOD END()
ENDCLASS
//-----------------------------------------------------------------------------
METHOD OpenRdd(f_nConexao,f_nCache) CLASS DB_CLIENTES
Default f_nCache := nCacheAds()
::nCache := f_nCache
::nTpCallRdd := 2
::NewRdd(::cTableName,f_nConexao,::nCache)
IF ::nOpenStatus == 0
::lConnected := .T.
ENDIF
RETURN SELF
//-----------------------------------------------------------------------------
METHOD END() CLASS DB_CLIENTES
IF ::lConnected
SUPER:END()
ENDIF
SELF := NIL
RETURN NIL
//-----------------------------------------------------------------------------Após compilar o código você poderá começar a abrir as tabelas por objetos ex:
LOCAL oDb_Clientes := DB_CLIENTES():OpenRdd() // Abrindo via Rdd.
oDb_Clientes01 := DB_CLIENTES():OpenRdd()
oDb_Clientes02 := DB_CLIENTES():OpenRdd()
xBrowse(oDb_Clientes01:cAlias)
xBrowse(oDb_Clientes02:cAlias)
oDb_Clientes01:END() // Fecha a tabela associada a variavel objeto oDb_Clientes01
oDb_Clientes02:END() // Fecha a tabela associada a variavel objeto oDb_Clientes02
PUBLIC oMyConnectionServer, oMyConnectionLoja02
#Define nConnectionServer 01 // Para determinar o numero da conexão 01
#Define nConnectionLoja02 02 // Atribuir a conexão 02 outra conexão
TADS_START_CONFIG() // Parametriza e cria os ambientes para uso do Advantage DataBase Server
oMyConnectionServer := tAdsConnection():New(nConnectionServer,.T.) // .T. Para informar que esta conexão é a Padrão (Por Falta)
oMyConnectionServer:cDataDictionary := "\\SERVER\REDE\DADOS\MyDataDictionary.add"
oMyConnectionServer:cUserLogin := "adssys"
oMyConnectionServer:cSenhaConnect := "123456"
oMyConnectionServer:nTpConnect := 7
lConnect := oMyConnectionServer:tAdsConnect()
IF lConnect == .F.
MsgStop("Não foi possivel conectar com a base de dados de advantage.",;
"Falha na conexão")
RETURN .F.
ENDIF
oDs_BuscaCliente := tAds():DsNew(1)
oDs_BuscaCliente:cQrySql := "Select * from CLIENTES where codigo = 100 ;"
oDs_BuscaCliente:DsExecute()
oDs_BuscaCliente:DataLoad() // Carrega os conteudos das variaveis tipo DATA
Redefine Get id 301 var oDs_BuscaCliente:Nome of odlg
Redefine Get id 302 var oDs_BuscaCliente:SobreNome of odlg
// depois voce escolhe o metodo de atualização
/// 1- primeiro
oDs_GravaCliente := tAds():DsNew(2) // 2 = não tem cursores
oDs_GravaCliente:cQrySql := "Update CLIENTES set NOME = _NOME_UPD_, SOBRENOME = _UPD_SOBRE_NOME_"
oDs_GravaCliente:DsAddVar("_NOME_UPD_",oDs_BuscaCliente:Nome)
oDs_GravaCliente:DsAddVar("_UPD_SOBRE_NOME_",oDs_BuscaCliente:SobreNome)
oDs_GravaCliente:Dsexecute() // grava e atualiza
/// 2 - Segundo
oDb_Clientes := Db_Clientes():OpenRdd() // ou tAds():NewRdd("CLIENTES")
oDb_Clientes:Seek(100,"CODIGO") // Posiciona no código 100 do cliente
oDb_Cliente:rLock() // travar Registro
oDb_Cliente:VarPut("NOME",oDs_BuscaCliente:Nome)
oDb_Cliente:VarPut("SOBRENOME",oDs_BuscaCliente:SobreNome)
odb_Cliente:Commit(.T.) // .T. Unlock
oDb_Clientes := Db_Clientes():OpenRdd() // ou tAds():NewRdd("CLIENTES")
oDb_Clientes:Seek(100,"CODIGO") // Posiciona no código 100 do cliente
oDb_Clientes:Dataload() // Atualizar variaveis DATA
Redefine Get id 301 var oDb_Clientes:Nome of odlg
Redefine Get id 302 var oDb_Clientes:SobreNome of odlg
oDb_Clientes:rLock() // travar para atualizar
oDb_Clientes:DataSave() // Grava e atualiza os campos carregados e depois alterados em GET
oDb_Clientes:Commit(.T.)
Pregunta nº 3
Me sigue generando o erro, um pouco para o código de compilação, e em vez de arregla, é como ficar em memória, não está disponível para todos os objetos de esta forma como indicas. OConexaoDefault: tAdsCloseConnect ()
If !Empty(tAds_AliasesAutoOpened())
MsgAlert(tAds_AliasesAutoOpened(),"Tabelas Abertas")
EndIf
FERASE(f_cDirTmp+"TADS_ERR.ADI")
If !File(f_cDirTmp+"TADS_TMP.ADD")
cDirExpr := StrTran(f_cDirTmp,"\","\\")
AdsSetServerType(1)
TAds_CreateDataDictionary(cDirExpr+"TADS_TMP.ADD","Dicionario de dados temporal para TAds")
lCreateTmp := .T.
EndIf
oConnectionTmp := tAdsConnection():New(121,.F.)
oConnectionTmp:cDataDictionary := f_cDirTmp+"TADS_TMP.ADD"
oConnectionTmp:cSenhaConnect := f_cPassAdsSys
oConnectionTmp:nTpConnect := 1
oConnectionTmp:tAdsConnect()
If lCreateTmp
if !Empty(f_cPassAdsSys)
TAds_ModifyUserProperty(121,"ADSSYS",f_cPassAdsSys)
EndIf
aadd(aStructTmp,{"STATUS","Short",2,0,1,"Status para Controle Interno",0})
aadd(aStructTmp,{"Dt_Ocorrencia","Date",8,0,1,"Data da Ocorrencia do erro",Nil})
aadd(aStructTmp,{"Hr_Ocorrencia","C",10,0,0,"Horas da Ocorrencia do erro",Nil})
aadd(aStructTmp,{"cComputerName","C",50,0,0,"Nome do Computador ",Nil})
aadd(aStructTmp,{"cInfoProcLine","C",100,0,0,"Linha e procedimento da chamada de DsNew()",Nil})
aadd(aStructTmp,{"nErrorSql","N",7,0,0,"Numero do Erro retornado por AdsGetLastError",Nil})
aadd(aStructTmp,{"cErrorSql","Memo",8,0,0,"Descricao do Erro retornado por AdsGetLastError",Nil})
aadd(aStructTmp,{"cSqlScript","Memo",8,0,0,"Script Sql aplicado",Nil})
aadd(aStructTmp,{"cErrorComplete","Memo",8,0,0,"Descrição completa do erro",Nil})
TAds_CreateTableFromCode(121,"TADS_ERR",aStructTmp,"Tabela para registros de erros de tAds DataSet")
EndIf
En tu conecion hay un codigo de la funcion TADS_START_CONFIG()
Cual es la finalizadad de crear TADS_TMP.ADD Dicionario de dados temporal para TAds.
Lo que entiendo es que el archivo .ADD (Contiene el dicionario de datos o sea todo el nombre de las tablas , indices etc del el proyecto)
aFieldsTempIndex - Variavel vetor com os nomes dos campos que deseja que seja indexado apos criar o arquivo temporario. Ex:
oDs_Sql := DsNew(1)
oDs_Sql:cQrySql := "Select * from CLIENTES Where SALARIO > _Salario_"
ods_Sql:DsAddVar("_Salario_",1200.00)
oDs_Sql:lDsCursorToTemp := .T. // Depois de executar a query sera copiado para a maquina cliente
oDs_Sql:aFieldsTempIndex := {"CODIGO","NOME"} // depois de gerado o temporario será criado chaves dos indices de CODIGO e NOME
oDs_Sql:DsExecute()
(oDs_Sql:cAlias)->(xBrowse())
ruben Dario wrote:Saludos Giovany
Estoy creado la libreria rddadsh.lib y me da este error.
Error: Unresolved external '_HB_FUN_ADSFLUSHFILEBUFFERS' referenced from K:\V_XHARB_V3\LIB\HARB\TADS_H.LIB|tAds
De la contribucion de Harbour, en el fuente \rddads\adsfunc.c , mi pregunta esta es la unica funcion que le agregas
Gracias
Rubén Dario, debes crear la tabla desde programa. O desde el arc32.exe te conectas a tu archivo.add y desde ahí creas la tabla.ruben Dario wrote:Saludos Giovany
Estoy usanto el ultimo Dbf2Advantage.EXE que coloco.
Creo una carpteta
Ejecuto Dbf2Advantage.EXE
veo que el crea una carpeta
ClassTads
DadosAdd
Cuando Adiciono un DBF y dejo el nombre por default MyDataDictionary.add que coloca y luego le doy generar.
me da este error
Criando Dicionario de dados - 08/09/2017 - 09:51:37
Falha na tentativa de criar o dicionario de dados J:\\PLA3ADS\\DadosAdd\\MyDataDictionary.add
Otra duda si tengo un .add creado, no deberia adicionar la tabla a diccionario que existe.
Gracias
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: No registered users and 48 guests