de dbf-ntx a adt-adi

Post Reply
User avatar
nolgiati
Posts: 58
Joined: Fri Apr 20, 2007 1:38 pm

de dbf-ntx a adt-adi

Post 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.
R.F.
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Post 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
Saludos
R.F.
User avatar
nolgiati
Posts: 58
Joined: Fri Apr 20, 2007 1:38 pm

Post by nolgiati »

Mil gracias Rene!!!

Lo estoy probando y creo que funciona, cualquier cosa te vuelvo a consultar.

Gracias!! :)
User avatar
nolgiati
Posts: 58
Joined: Fri Apr 20, 2007 1:38 pm

Post 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!!
R.F.
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Post 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.
Saludos
R.F.
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Post 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
Post Reply