Page 1 of 1

ADS: Por favor saquenme de esta duda.

PostPosted: Tue Feb 07, 2006 4:56 am
by José Ríos
Si uso indices CDX con ads, ¿puedo usar EVAL al indexar un archivo?.

Estoy haciendo algunas pruebas y aparentemente ignora los comandos que envio en el EVAL.

Code: Select all  Expand view
   use Agentes New Exclusive
   if (!NETERR())
      pack
      erase("Agentes.cdx")
      index on Numero tag Numero for .not. deleted() EVAL (msginfo('indexando registro')) EVERY 1
   endIf


Uso FWH 2.4,XHarbour 0.99.3 y ADS local 7.1

De antemano muchas gracias.

José Rìos.

PostPosted: Tue Feb 07, 2006 4:12 pm
by José Ríos
Vamos, tan solo quiero que alguien me diga si no se puede usar EVAL al indexar usando ADS. Me interesa usar EVAL para poner un meter en mi rutina de reindexacion, pero no si si estoy haciendo algo mal o simplemente EVAL no es una funcion admitida por ADS.

¿Alguien ha usado EVAL reindexando con ADS?.

Saludos.

PostPosted: Tue Feb 07, 2006 5:03 pm
by R.F.
No es posible hacer lo que quieres.

Hay que entender un poco como funciona ADS cuando se hace un indice contra lo que hace xHarbour o Clipper

Bajo Clipper / (x)Harbour un proceso de reindexacion, en realidad lo que hace es un DO WHILE EOF para todos los registros de la base de datos. Cada registro de la base de datos es enviado al maquina que esta corriendo indices se realiza el indice, se incluye en el archivo NTX/CDX y se continua con el proceso, por eso, tu puedes utilizar la clausula EVAL, la cual se va a evaluar EVERY numero de registros. Ya que tu programa tiene el control, puede ejecutar las instrucciones que tienes en EVAL cada "x" numeros de registros.

Con ADS no pasa esto, cuando tu pidex indexar un DBF, la instruccion de indexacion no es procesada por tu programa, tu programa le envia a ADS la instruccion de indexacion, y a partir de ahi, tu ya no tienes control sobre el proceso, ADS se encargara de hacer el indice y solo retomaras el control del programa hasta que ADS termine de indexar.

Por ello no es posible utilizar la clausula EVAL.

PostPosted: Tue Feb 07, 2006 11:53 pm
by José Ríos
Muchas gracias por la respuesta Rene.


Saludos.

PostPosted: Wed Feb 08, 2006 3:30 pm
by George
Trata este codigo. A mi me funciona pero la barra del meter pasa tan rapido, si es que pasa, que no se nota nada en 250,000 registros

// launch ADS's callback function
adsRegCallBack( {|nPct| ;
oMeter:set( oMeter:nTotal * Int( nPct / 10000 ) ), ;
SysRefresh(), .F. } ) // return .F. is aborting not allowed

// your indexing routine goes here
INDEX ON FIELD->TRAN_NO TAG iTraNo FOR .NOT. DELETED() ;
EVAL (oMeter:SET(recno()),oMeter:Refresh(), !lEnd) EVERY nTimes

oMeter:Set(Reccount())
oMeter:Refresh()
SysRefresh()

// release ADS's callback function
adsClrCallBack()

PostPosted: Sun Feb 12, 2006 11:11 pm
by José Ríos
Gracias por el tip George. Lo voy a Probar.

Saludos.

José Ríos.