Pack y progress

Post Reply
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Pack y progress

Post 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
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

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

Post 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.
Saludos
R.F.
User avatar
Armando
Posts: 2479
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México
Contact:

Post 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
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
JoseLuis
Posts: 359
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

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

Post 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
Saludos
R.F.
Post Reply