Hola amigos:
Para hacer una organizacion de ficheros vengo haciendo lo siguiente:
Primero pack:
***************
if lalb=.T.
dbusearea(.f.,,Publicas:cUnidad+Publicas:cSubd+"\Albaran",,.f.) // Exclusiva
if !neterr()
pack
treg+=(albaran->(reccount())*10)
endif
******************
Después index
****************
index on _field->Albaran tag "Albaran" ;
eval(oMeter1:Set(recno()),oMeter2:Set(++parci),SysRefresh())
oMeter1:nTotal =reccount()
otext:SetText(otextos[6])
*****************
Y sobre éste tema tengo algunas preguntas
1º Pack se me está haciendo cada vez más tedioso al crecer las bases de datos (en una de 500.000 registros te puedes echar la siesta). Hay algo que cumpla ésta función y que no tarde tanto ?
2º Como se ve, al hacer índices puedo utilizar o bien progress, o bien msgmeter, ya que acepta la condición eval, pero utilizando pack, como puedo saber por dónde vamos, ya que como tarda tanto, a veces la gente apaga la máquina creyendo que se ha colgado.
Saludos
Jose Luis
Pack y progress
Jose Luis:
No se si exista alguna función similar al DBPACK() , peroooo, supongo que en tu DBF hay muchos registros marcados como DEL y por eso te ves en la necesidad de utilizar el DBPACK() y reindexarla.
Tal vez una alternativa es reciclar los registros marcados como DEL ??
de esta forma minimizas la necesidad de usar el DBPACK().
En fin es solo eso, una alternativa.
Saludos, Armando
No se si exista alguna función similar al DBPACK() , peroooo, supongo que en tu DBF hay muchos registros marcados como DEL y por eso te ves en la necesidad de utilizar el DBPACK() y reindexarla.
Tal vez una alternativa es reciclar los registros marcados como DEL ??
de esta forma minimizas la necesidad de usar el DBPACK().
En fin es solo eso, una alternativa.
Saludos, Armando
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
No es posible, el proceso de Pack es un proceso ciego.
Pack no tiene retroalimentacion para saber en que registro estas trabajando porque no realiza un DO WHILE ! EOF() como el proceso de indexacion.
Internamente la indexacion realiza un "barrido" de la base de datos del primer registro al ultimo, evaluando la llave y generando el NTX o CDX correspondiente, por eso es posible utilizar un EVAL() para "interceptar" el proceso de indexacion.
Pero Pack no lo puede hacer, el reciclaje de campos borrados lo hace "ciego" es decir, no puedes inteceptar el proceso de "pack"
Lo que puedes hacer, es copiar lo datos a una base de datos temporal, evitando los registros borrados (IF DELETED()) uno a uno, luego borrar DBF orignal, renombrar el temporal y reindexar sobre el temporal renombrado.
Pack no tiene retroalimentacion para saber en que registro estas trabajando porque no realiza un DO WHILE ! EOF() como el proceso de indexacion.
Internamente la indexacion realiza un "barrido" de la base de datos del primer registro al ultimo, evaluando la llave y generando el NTX o CDX correspondiente, por eso es posible utilizar un EVAL() para "interceptar" el proceso de indexacion.
Pero Pack no lo puede hacer, el reciclaje de campos borrados lo hace "ciego" es decir, no puedes inteceptar el proceso de "pack"
Lo que puedes hacer, es copiar lo datos a una base de datos temporal, evitando los registros borrados (IF DELETED()) uno a uno, luego borrar DBF orignal, renombrar el temporal y reindexar sobre el temporal renombrado.
Saludos
R.F.
R.F.
JoseLuis:
La idea de reciclar es re usar los registros marcados como DEL para sobre ellos salvar los datos de un nuevo registro, me explico ?
Esto es de gran ayuda cuando se manejan DBFs nuy grandes y sobre todo cuando hay muchas altas y bajas de registros pues te evita o al menos te minimiza el uso del DBPACK().
Si es de interés te puedo dar mayores detalles de esta "técnica" para el reciclado de registros.
Saludos, Armando
La idea de reciclar es re usar los registros marcados como DEL para sobre ellos salvar los datos de un nuevo registro, me explico ?
Esto es de gran ayuda cuando se manejan DBFs nuy grandes y sobre todo cuando hay muchas altas y bajas de registros pues te evita o al menos te minimiza el uso del DBPACK().
Si es de interés te puedo dar mayores detalles de esta "técnica" para el reciclado de registros.
Saludos, Armando
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Personalmente yo nunca hago PACK durante la operacion del sistema, el proceso lo realizo cuando hago una reindexacion.
Para evitar que los datos borrados esten molestando durante la operacion del programa simplemente hago el indice FOR ! DELETED() y asi no aparecen los datos borrados
Luego, cuando llega el momento de reindexar, se borra el CDX, se abre la tabla DBF, se hace pack, se reindexa y listo, a seguir funcionando
Para evitar que los datos borrados esten molestando durante la operacion del programa simplemente hago el indice FOR ! DELETED() y asi no aparecen los datos borrados
Luego, cuando llega el momento de reindexar, se borra el CDX, se abre la tabla DBF, se hace pack, se reindexa y listo, a seguir funcionando
Saludos
R.F.
R.F.