Hacer PACK en una tabla

1,035 views
Skip to first unread message

Carlos Mauricio Torres Suárez

unread,
Oct 28, 2011, 8:26:49 PM10/28/11
to Comunidad de Visual Foxpro en Español
En el Entorno de Datos tenemos abierta una tabla que no está en modo
exclusivo, ¿Cómo se puede hacer para que antes de la instrución PACK,
esta tabla se pueda abrir en modo exclusivo?

Gracias por su ayuda

Saludos

MAC HOWARD

unread,
Oct 28, 2011, 8:40:00 PM10/28/11
to publice...@googlegroups.com
Yo por lo general cierro el contenedor lo abro el modo exclusivo hago el pack y luego lo cambio de exclusivo a compartido...  no se si haya otro modo....
--
Hasta Pronto !
 
________________________________
HOWARD OROZCO POLO
Analista Programador de Sistemas
Barranquilla - Colombia

Walter R. Ojeda Valiente

unread,
Oct 28, 2011, 9:06:20 PM10/28/11
to publice...@googlegroups.com
Cerrarla y volverla a abrir, aunque ahora de modo exclusivo.

Como comentario adicional, siempre es importante verificar que estás haciendo el PACK a la tabla correcta, algo como:

IF USED("MiTabla")
  SELECT MiTabla
  PACK
ENDIF

Saludos.

Walter.



> Date: Fri, 28 Oct 2011 17:26:49 -0700
> Subject: [vfp] Hacer PACK en una tabla
> From: cama...@ctsoft.com.ec
> To: publice...@googlegroups.com

Carlos Miguel FARIAS

unread,
Oct 29, 2011, 8:43:02 AM10/29/11
to publice...@googlegroups.com
Cuando haces uso exclusivo de una tabla, seria conveniente que:
Si es entorno multiusuario, de alguna manera todos los posibles usuarios (aplicaciones) conectadas a la tabla cierren la aplicacion.
De alguna manera, en alguna tabla de control o lo que se quiera instrumentar, las aplicaciones deben estar avisando a las otras de que una tabla es usada en modo exclusivo (o se requiere para).
De esa manera, solo una aplicacion (la peticionante) tomaria el control total de la tabla.
Aun en entornos monousuarios.
El formulario u opcion de menu que invoca al procedimiento de pack, debería ser el único activo (para evitar algún uso escondido de la tabla).
Lo aconsejable en todos los casos, es que los packs de tablas se efectuen en horarios de "mantenimiento" (cuando nadie la está usando aplicaciones relacionadas).
Las reindexaciones (que requieren tambien uso exclusivo), deberan hacerse siempre que se detecte que se va a usar una tabla que ya estaba en uso (y no cerrada).
Para dichos controles, se puede usar una tabla libre, no indexada (o con indices independientes), sin memos, con una entrada por cada tabla del sistema, donde se puede tener ademas del nombre de la tabla, al menos cantidad usuarios que la abrieron, o un campo por puesto de trabajo (o un entero donde con biton/bitoff se marca si se usa o no), y un campo con la indicacion de si alguien la solicito para uso exclusivo, si esta en uso exclusivo, etc.
La misma tabla se puede utilizar para llevar el ultimo id utilizado en la tabla (si no usan autoincrementales), y otros controles que son necesarios para la coordinacion de usuarios concurrentes.
Por supuesto que, toda la apertura y cierre de tablas conviene que sea manejado por un procedimiento o clase, que centralice toda dicha manipulacion de acceso.
Saludos: Miguel (Santa Rosa LP)

ricardo peña

unread,
Oct 29, 2011, 9:17:54 AM10/29/11
to GRUPO-VFP GRUPO-VFP
Hola colegas:
 
A mí me ha dado mucho resultado usar la función FLOCK()
 
Si una tabla está compartida, usando algo así como
 
select MiTabla
if FLOCK()
   PACK                        && o también REINDEX o lo que sea
   UNLOCK
endif
 
Saludos

Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
011-15-4440-7378
 

Date: Sat, 29 Oct 2011 09:43:02 -0300
Subject: Re: [vfp] Hacer PACK en una tabla
From: carlosmig...@gmail.com
To: publice...@googlegroups.com

Carlos Miguel FARIAS

unread,
Oct 29, 2011, 6:42:07 PM10/29/11
to publice...@googlegroups.com
Pero el que obtengas el bloqueo de la tabla entera, no significa que la tengas en uso exclusivo, o si?

2011/10/29 ricardo peña <rl...@hotmail.com>

ricardo peña

unread,
Oct 29, 2011, 6:59:49 PM10/29/11
to GRUPO-VFP GRUPO-VFP
Sí.  Si la función FLOCK() es existosa, lo obtienes.


Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
011-15-4440-7378
 

Date: Sat, 29 Oct 2011 19:42:07 -0300

Luis Maria Guayan

unread,
Oct 29, 2011, 7:06:34 PM10/29/11
to publice...@googlegroups.com
Para hacer un PACK de una tabla, esta tiene que estar abierta en EXCLUSIVO.

De la ayuda de VFP: "... You must first open the table exclusively before using the PACK command..."



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Carlos Alfaro

unread,
Oct 29, 2011, 7:32:47 PM10/29/11
to publice...@googlegroups.com

Por la duda hice la prueba, abri la tabla en shared le di flock y no me dejo hacer el pack, será que no te entendí bien?

 

Carlos Alfaro

Walter R. Ojeda Valiente

unread,
Oct 29, 2011, 10:26:37 PM10/29/11
to publice...@googlegroups.com
No, no es cierto, FLOCK() te permite bloquear la tabla completamente pero no cambia el modo de apertura (exclusivo o compartido). Prueba esto:

SET EXCLUSIVE OFF
USE MiTabla
? FLOCK()     && verifica que te devuelta .T.
PACK            && te muestra un mensaje diciendo que el archivo debe ser abierto exclusivamente

Saludos.

Walter.





From: rl...@hotmail.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Hacer PACK en una tabla
Date: Sat, 29 Oct 2011 22:59:49 +0000

Carlos Miguel FARIAS

unread,
Oct 30, 2011, 12:58:51 PM10/30/11
to publice...@googlegroups.com
Entonces, es lo que dije inicialmente. El FLOCK bloquea toda la tabla (otros usuarios o sesiones pueden leerla pero no modificar o insertar) y el usuario que obtuvo el bloqueo, puede hacer todas las operaciones, excepto las que implican pack, reindex del estructural y algunas cosas mas (como modificacion de la tabla, ALTER TABLE y demás).
Por eso recomendaba en otra parte, tener un archivo de control de uso de la tabla, que permite controlar si alguien pidio un acceso exclusivo, y ver si lo puede obtener y de paso que los demas conectados se enteren de la necesidad.
Esa misma tabla, permite chequear al abrir una tabla, si figura como abierta, es que se cerro intespestivamente, lo que probablemente implique que algun indice se puede haber roto, se mato una transaccion. Y los memo pueden haberse pegado un alzehimer.
Otra mas simple, mas "a lo bestia", pero sin dejar de ser cool

try
   use latabla exclusive
   pack
catch
   message( "La tabla no pudo obtenerse en exclusiva, siga participando" )
endtry
Miguel (La Pampa RA)

Irlandes 1960

unread,
Oct 31, 2011, 9:42:53 AM10/31/11
to publice...@googlegroups.com
Hola, todo bien, pero ... ¿para que quieren hacer un pack de una tabla? no se me ocurre una razón válida para incluir como parte del diseño la eliminación física de registros.

Jairo

unread,
Oct 31, 2011, 11:04:46 AM10/31/11
to publice...@googlegroups.com

Pienso que es una buena medida para maximizar el uso de las tablas, en el sentido que se debe borrar los registros que ya no se usan o no se tiene pensado accesarlos, por lo cual se libera espacio no solo en el disco sino también se hace menos pesada la tabla . esto es en el caso de los cierres de periodos.. por ejemplo:

 

Cierres contables.  El archivo de transacciones antes de hacer el cierre del un mes de proceso se copia a un archivo histórico , para que cualquier consulta de saldos se haga allí. Y en el archivo de transacciones se hace un delete all (si se tiene un ID autoincremental no se pierde ) el consecutivo , y luego un pack para entonces iniciar el nuevo mes contable.

 

Conclusión.. el pack solo debe hacerse en el momento que sea meramente necesario .

 

JM

ricardo peña

unread,
Oct 31, 2011, 11:19:21 AM10/31/11
to GRUPO-VFP GRUPO-VFP
Tengan todos la amabilidad de disculparme, pero
cuando dije que el FLOCK() bloqueaba la tabla y se
podía hacer pack, cometí un error.
En mi sistema, cuando el FLOCK() me da true
cierro la tabla, la abro exclusive y hago el pack.
 
No lo recordaba.


Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
011-15-4440-7378
 

Date: Sun, 30 Oct 2011 13:58:51 -0300

Carlos Miguel FARIAS

unread,
Oct 31, 2011, 2:50:43 PM10/31/11
to publice...@googlegroups.com
Lograr un FLOCK sobre la tabla, no te garantiza que no este abierta en otra sesion de la misma aplicación u otro usuario en modo compartido.

2011/10/31 ricardo peña <rl...@hotmail.com>

Ruth

unread,
Jan 24, 2014, 4:32:31 PM1/24/14
to publice...@googlegroups.com
hola como haria el pack si tengo registro remotos?
gracias!

Carlos Miguel FARIAS

unread,
Jan 24, 2014, 6:39:29 PM1/24/14
to Grupo Fox
Que quieres indicar con registro remotos?
A través vpn?
Sugiero que el indexado de recupero, pack de tabla y demás se hagan desde una aplicación local a donde están las tablas.
Un pack implica copiar toda la tabla, e impacta en todos los indices. Si eso lo haces a través de una red, puede demandar un tiempo enorme, a riesgo además de que cualquier problema en la conexión, rompa severamente las tablas.
Saludos: Miguel, La Pampa (RA)

HernanCano

unread,
Jan 24, 2014, 6:57:12 PM1/24/14
to publice...@googlegroups.com
Miguel:
pero Ruth debe aclarar también si está hablando de datos nativos o datos en motores externos a VFP.

Carlos Miguel FARIAS

unread,
Jan 25, 2014, 5:06:21 PM1/25/14
to Grupo Fox
Esta mencionando FLOCK, PACK, etc. evidentemente son tablas nativas.
Si no, está testeando si somos adivinos.

HernanCano

unread,
Jan 26, 2014, 3:15:25 PM1/26/14
to publice...@googlegroups.com
Perdón, Miguel.

El comando PACK y la función  FLOCK() lo estamos mencionando los que queremos responderle a Carlos Mauricio (que se olvidó del tema).

Ruth es quien involucra la palabra "remotos" en el hilo.

Y yo quiero que ella aclare si está hablando de archivos DBF en un servidor remoto, o de un SGBD.

La conclusión es tu segundo renglón: ella está chequeando si nosotros somos adivinos.

Mario Escudero

unread,
Jan 26, 2014, 8:58:37 PM1/26/14
to publice...@googlegroups.com
Lo que yo hago es ejecutar una rutina "Purgar" a la hora de salir del sistema.
Alli abro las tablas en modo exclusivo desde otra tabla q x contiene a las demas y le doy Pack.
Para esto uso On Error por si alguna tabla esta en uso.
El ultimo en salir sera el q ejecute correctamente los Packs.
Esta rutina "Purgar" tambien esta en el Menu Principal para hacerlo manualmente cuando se quiera.
Saludos

Ruth

unread,
Jan 27, 2014, 8:54:20 AM1/27/14
to publice...@googlegroups.com
Lamento creo que no me di ha entender tendre que habrir un nuevo hilo con el tema que quiero abordar 
les agradezco mucho sus aportes; por lo que tengo entendifo el pack se utiliza para eliminar registros completamente.  

Carlos Miguel FARIAS

unread,
Jan 27, 2014, 10:00:35 AM1/27/14
to Grupo Fox
Si ella quiere pack, son nativas, Mario, muy llamativa tu rutina, pero quien limpia?
Creo que el Pack de una tabla debe hacerse en modo administrativo exclusivo. O sea aplicación aparte, u opción de usuario "responsable", en momentos de "aislado total", sobre la máquina que almacena las tablas (pseudo servidor).
Saludos: Miguel, La Pampa (RA)
Reply all
Reply to author
Forward
0 new messages