Page 1 of 1
de dbf-ntx a adt-adi
Posted: Mon Oct 01, 2007 2:31 pm
by nolgiati
Hola a todos!!
Estoy usando ADS hace rato con DBF y NTX pero me intereza ahora pasar a ADT-ADI,
que tengo que cambiar en mi codigo??
De esta manera estoy usando ADS:
Code: Select all
RddRegister("ADS",1)
RddSetDefault("ADS")
SET SERVER LOCAL
SET FILETYPE TO NTX
y de este modo uso una dbf:
Code: Select all
USE IVA INDEX IVA1,IVA2 NEW SHARED
DATABASE oDbfIvas
oDbfIvas:bEoF=nil
oDbfIvas:GoTop()
Gracias
!
Natalia.
Posted: Mon Oct 01, 2007 4:46 pm
by R.F.
NO TIENES QUE CAMBIAR NADA !!!!!
Eso es lo maravilloso de ADS, la migracion es transparente, solo tienes que cambiar el tipo de archivo:
REQUEST ADS
RddSetDefault("ADS")
AdsSetServerType(7) // cualquier servidor
AdsSetFileType(3) // ADT / ADI
Y listo todo lo demas funciona tal como funciona con los DBF normales, no debes hacer nada mas en tu codigo.
Obviamente debes convertir los DBFs actuales a ADT, usa este programita:
Code: Select all
FUNCTION Main()
LOCAL aDbfs := DIRECTORY(".\*.dbf")
LOCAL nDbfs
LOCAL aEstructura
LOCAL cNomAdt, cNomAdi, cNomAdm
LOCAL nReng := 0
REQUEST ADS,DBFNTX,DBFDBT
RDDSETDEFAULT("ADS")
AdsSetServerType(1)
AdsSetFileType(3)
CLS
FOR nDbfs := 1 TO LEN(aDbfs)
/* obtenemos el nombre del DBF y le agregamos la extension ADT */
cNomAdt := LEFT(aDbfs[nDbfs,1],AT(".",aDbfs[nDbfs,1]))+"ADT"
cNomAdi := LEFT(aDbfs[nDbfs,1],AT(".",aDbfs[nDbfs,1]))+"ADI"
cNomAdm := LEFT(aDbfs[nDbfs,1],AT(".",aDbfs[nDbfs,1]))+"ADM"
@ nReng, 1 SAY cNomAdt
/* abrimos el DBF usando el RDD DBFNTX*/
USE (aDbfs[nDbfs,1]) NEW ALIAS TempDbf VIA "DBFNTX"
/* obternemos la estructura del DBF */
aEstructura := TempDbf->(DBSTRUCT())
/* verficamos si existe el archivo ADT, su indice ADI y su memo ADM, si existen los borramos*/
IF FILE (".\"+cNomAdt)
FERASE(".\"+cNomAdt)
ENDIF
IF FILE (cNomAdi)
FERASE(".\"+cNomAdi)
ENDIF
IF FILE (cNomAdm)
FERASE(".\"+cNomAdm)
ENDIF
/* creamos una nueva estructura ADT a partir de la estructura DBF previamente obtenida */
/* abrimos la nueva estructura con el el alias "TempAdt" */
DBCREATE(cNomAdt,aEstructura,"ADS",.T.,"TempAdt")
/* al primer registro del DBF */
TempDbf->(DBGOTOP())
/* vamos a recorrer todo el DBF para cargar los datos al ADT */
DO WHILE ! TempDbf->(EOF())
/* añadimos un registro al ADT */
TempADT->(DBAPPEND())
/* agregamos la informacion de los _ por campo*/
FOR nCampos := 1 TO TempDbf->(FCOUNT())
TempAdt->(FIELDPUT(nCampos,TempDbf->(FIELDGET(nCampos))))
NEXT
TempDbf->(DBSKIP())
ENDDO
/*cerramos todo */
DBCLOSEALL()
nreng++
NEXT
RETURN (.T.)
AAHHH ! y no olvides que los indices ADI funcionan con la filosofia de los CDX por lo que deberas cambiar la forma de indexar para usar TAGs
Posted: Tue Oct 02, 2007 7:29 pm
by nolgiati
Mil gracias Rene!!!
Lo estoy probando y creo que funciona, cualquier cosa te vuelvo a consultar.
Gracias!!
Posted: Tue Oct 02, 2007 8:07 pm
by nolgiati
Rene tengo una pregunta ya que anduvo hasta ahora lo que me pasaste. Hay alguna manera de indicarle que ponga los indices todos juntos en un archivo?
Reindexo de esta manera:
Code: Select all
USE Iva NEW
oDlg:cTitle("Procesando IVA.ADT")
oMeter:nTotal=RecCount()
PACK
ERASE Iva1.Cdx
ERASE Iva2.Cdx
oText:SetText("Creando IVA1.CDX")
INDEX ON CODIGO TO Iva1;
EVAL(oMeter:Set(RecNo()),SysRefresh(),!lEnd )
oText:SetText("Creando IVA2.CDX")
INDEX ON DESCRIP TO Iva2;
EVAL(oMeter:Set(RecNo()),SysRefresh(),!lEnd )
DBCLOSEALL()
Tambien te cuento que me tira un cartel siempre antes de correr mi progrma que dice:
"The library ..\axcws32.dll (version 5,70,0,2) is older than ..\ace32.dll (version 7,10,0,12) Advantage DLLs must be of the same version"
que es esto??
Gracias!!
Posted: Tue Oct 02, 2007 11:19 pm
by R.F.
Natalia:
1) Tienes que crear los indices asi:
INDEX ON <llave> TAG <nombre del indice> FOR <condicion>
Donde :
<llave> es la llave de TODA la vida
<nombre del indice> es un nombre con el cual tu vas a identficar al indice creado dentro del archivo ADO
<condicion> es la condicion de indexamiento.
En tu caso
INDEX ON CODIGO TO IVA1 EVAL .....
Quedaria:
INDEX ON codigo TAG iva1 EVAL.......
Y crearia un archivo IVA.ADI con todos los "tags" almacenados en un solo archivo.
Para seleccionar un "tag" utiliza la funcion OrdSetFocus() de los indices CDX:
USE IVA.ADT
OrdSetFocus("IVA1")
Aunque OrdSetFocus soporta un valor numerico, esta comprobado que con los ADT siempre es necesario utilizar el nombre del TAG en vez del numero.
En cuanto a la clausula EVAL.... no la necesistas mas, ADS es mas rapido que xHarbour, termina de indexar MUCHO antes de que FiveWin pueda si quiera comenzar a pintar la barra de progreso.
2) Sobre el error que me indicas:
ADS esta basado en 3 DLLs que tienes que tener en tu carpeta donde tienes tu archivo EXE:
ADSLOC32.DLL es un servidor "local" de ADS que soporta toda las caracteristicas excepto: No es cliente/servidor, No soporta transacciones y solo soporta un maximo de 5 usuarios en entornos de red, pero para tus pruebas y aplicaciones monousuario te funcionara perfectamente.
ACE32.DLL: Es una libreria de funciones para ADS, todas las funciones ADS.....() que utiliza el RDDADS estan almacenadas aqui.
AXCWS32.DLL Esta es libreria CLIENTE de ADS indispensable para poder conectarte con cualquier tipo de servidor, LOCAL, REMOTO o INTERNET.
Bien, sucede que estas 3 DLLs tienen que ser DE LA MISMA VERSION y pasa que el error que te esta arrojando ADS es que tu AXCWS32.DLL es una version 5.7 de ADS pero estas usando un ACE32.DLL de la version 7.1, obviamente, te marcar error, porque todos los DLLs tendrian que ser de la version 7.1.
¿ Donde los consigues ?, bueno, si tienes instalado el Advatange Data Architech (ARC) los tienes en la carpeta donde esté instalado el producto, ahí vienen los 3 DLL de la misma version de ADS que necesitas, simplemente copialos a la carpeta donde esta tu programa xHarbour y listo, a funcionar de nuevo.
Nos vemos en Chile a partir del 12 de Octubre y en Argentina el 3 de Noviembre.
Posted: Wed Oct 03, 2007 6:29 pm
by jrestojeda
Hola Rene,
Veo que estás por venir a Argentina el 3 de Noviembre.
Donde puedo obtener más información al respecto?
Desde ya muchas gracias.
Saludos, Esteban