Page 1 of 1

Pack y progress

Posted: Sun Feb 04, 2007 11:41 am
by JoseLuis
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

Posted: Sun Feb 04, 2007 1:57 pm
by Armando
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

Posted: Mon Feb 05, 2007 8:03 am
by JoseLuis
Hola Armando

A que te refieres reciclar?

Por otra parte, ya que no hay otra forma mas que el pack, continúo con mi pregunta anterior, ¿Como puedo saber por el registro que va, para usar progress ya que no acepta eval?

Saludos

Jose Luis

Posted: Mon Feb 05, 2007 4:46 pm
by R.F.
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.

Posted: Mon Feb 05, 2007 6:40 pm
by Armando
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

Posted: Wed Feb 07, 2007 1:27 pm
by JoseLuis
Gracias por contestar.

Por lo que deduzco lo mejor es organizarlo todo de tal manera que haya que hacer pack las menos veces posible.

Voy a hacerlo así, y que sólo haya que limpiar las bases en ell inicio de ejercicio.

Saludos

Jose Luis

Posted: Wed Feb 07, 2007 2:46 pm
by R.F.
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