ADS: Por favor saquenme de esta duda.

Post Reply
José Ríos
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

ADS: Por favor saquenme de esta duda.

Post 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

   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.
José Ríos
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

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

Post 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.
Saludos
R.F.
José Ríos
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Post by José Ríos »

Muchas gracias por la respuesta Rene.


Saludos.
George
Posts: 710
Joined: Tue Oct 18, 2005 6:49 pm

Post 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()
José Ríos
Posts: 119
Joined: Fri Nov 04, 2005 12:23 am

Post by José Ríos »

Gracias por el tip George. Lo voy a Probar.

Saludos.

José Ríos.
Post Reply