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
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.
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.
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