Uso de ZAP/PACK en ambiente multiusuario.

241 views
Skip to first unread message

Analyzer

unread,
Feb 28, 2014, 11:01:37 AM2/28/14
to vfpl...@googlegroups.com
Esta pregunta va en especial para el amigo Fidel Charny.

Veo una recomendación suya de usar esto:

En lugar de 
DELETE ALL
PACK

Utiliza
select tabla2
ZAP
APPEND FROM TABLA1
Thisform.grid1.refresh

Cito textualmente un comentario de Walter R. Ojeda sobre este tema:

La forma correcta es la siguiente: 

- El RecordSource de tu grilla es una tabla temporal o vista (por ejemplo: Cursor1) 
- Los datos los tienes en otra tabla (por ejemplo: MiTabla) 
- Cuando quieres actualizar la grilla: 
     a) ZAP de Cursor1 
     b) Copias los registros de MiTabla que te interesan en Cursor1 
     c) Refrescas la grilla 

Así, nunca perderás la configuración de tu grilla porque siempre el RecordSource de la misma es Cursor1 y siempre se trata de la misma tabla temporal, no de dos tablas temporales con el mismo nombre que sería el caso si haces un nuevo SELECT


Obvio que Walter hablaba de cursores, y Fidel parece referirse a tablas. Aunque alguna vez leí en algún manual que desaconsejaba el uso de ZAP porque no borraba los campos memos o algo asi..

Mi preguntas son:

1. ¿Para que me serviría un código como el de Fidel si se supone que no debo hacer nunca un PACK en un ambiente multiusuario? (A menos que por mantenimiento purguemos a todos los usuarios del sistema)

2. ¿Cómo se entiende eso de que los cursores son locales según lo que solía mencionar Walter?

Saludos!

Fidel Charny

unread,
Feb 28, 2014, 4:34:39 PM2/28/14
to vfpl...@googlegroups.com
Analyzer
1) La recomendación está hecha de de esa forma, porque el sujeto que pregunta tiene asociada la tabla a un grid. Al hacer PACK (con o sin previo Delete All), la tabla se cierra (por el mecanismo interno del PACK) y por lo tanto, el RecordSource del grid se desenlaza. El grid queda en blanco.
ZAP es un comando que no cierra la tabla, sino que solamente ajusta la cabecera (registros y tamaño) de modo de desentenderse de cualquier registro que tenga. Por eso es extremadamente rápido (y definitivo). La gran ventaja es que el REcordSource del control grid sigue igual que antes, y verás la cuadrícula vacía pero no en blanco. No necesitas reasignar los ControlSource ni los formatos particulares, sino solamente un thisform.grid1.refresh.

2) Si las tablas se abren en modo SHARED, no puedes utilizar ni PACK ni ZAP, porque ambos comandos requieren uso Exclusivo de la tabla.

3) Los cursores son elementos de memoria (de la memoria del equipo que los genera). No soportan PACK. La única forma de eliminar todos los registros de un cursor es mediante ZAP. Y resulta muy lógico sin pensamos que lo que hace PACK es copiar todos los registros NOT DELETED() a una tabla temporal, cierra la tabla y renombra la temporal en reemplazo de la original. 
También puedes utilizar DELETE ALL en un cursor. Los registros no se han eliminado, sino que están marcados como Deleted() y los verás o no según la configuración de SET DELETED.

4) Si te fijas en el hilo del que extraes la información, verás que el preguntante, tras DELETE / PACK, hace un append from tabla2, con lo que está muy cerca del comentario de Walter Ojeda, solo que trabajando con una tabla temporal en lugar de un cursor.

5) Ese cursor1 al que se refiere Walter Ojeda, pudo haberse generado así, en el Load del form
SELECT * FROM MITABLA WHERE .F. INTO CURSOR1 READWRITE  && creas un cursor con la estructura de MiTabla, sin datos.
Thisform.grid1.RecordSource='Cursor1'

Fidel.

Analyzer

unread,
Feb 28, 2014, 4:51:15 PM2/28/14
to vfpl...@googlegroups.com
>ZAP es un comando que no cierra la tabla, sino que solamente ajusta la cabecera (registros y tamaño) de modo de desentenderse de cualquier registro que tenga. Por eso es extremadamente rápido (y definitivo). La gran ventaja es que el REcordSource del control grid sigue igual que antes, y verás la cuadrícula vacía pero no en blanco. No necesitas reasignar los ControlSource ni los formatos particulares, sino solamente un thisform.grid1.refresh.

Gracias amigo! Creo que hoy aprendí más de Fox..!!



>También puedes utilizar DELETE ALL en un cursor.

Eso es lo que leí en este manual, donde recomienda nunca usar ZAP porque no borra los memos o algo así..

Domine Visual FoxPro 9.0 SP2 / Expert in Visual FoxPro 9.0 SP2

http://www.portalfox.com/index.php?name=News&file=article&sid=2699

Por otro lado acerca de lo de Walter:

>La forma correcta es la siguiente: 

- El RecordSource de tu grilla es una tabla temporal o vista (por ejemplo: Cursor1) 
- Los datos los tienes en otra tabla (por ejemplo: MiTabla) 
- Cuando quieres actualizar la grilla: 
     a) ZAP de Cursor1 
     b) Copias los registros de MiTabla que te interesan en Cursor1 
     c) Refrescas la grilla 

Así, nunca perderás la configuración de tu grilla porque siempre el RecordSource de la misma es Cursor1 y siempre se trata de la misma tabla temporal, no de dos tablas temporales con el mismo nombre que sería el caso si haces un nuevo SELECT


Siempre me ha intrigado ese método de Walter de jugarle la vuelta a lo del select seguro para no usar 2 tablas (una temporal)


Trabajando con Grids, ZAP y PACK, porque no se llevan?

Utilizar un Select seguro para preservar los grids



Te agradezco la excelente explicación!

Saludos!


--
Has recibido este mensaje porque estás suscrito al grupo "Visual Foxpro Latinoamérica" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/vfplatino.

Mariela Rodriguez

unread,
May 1, 2020, 2:11:49 PM5/1/20
to Visual Foxpro Latinoamérica
una consulta a mi me pasa lo mismo cuando hago pack la gria se vuelve en blanco pierde el foco
cual es la solucion
segun leo tener 2 tablas
la primera que sea recordsorce en la gria
y la segunda que sea identica pero de uso temporal

cuando hago select de la tabla 1 y hago pack se pierde foco
que se tiene q hacer antes o despues

favor de explicar gracias

Mariela Rodriguez

unread,
May 1, 2020, 2:12:47 PM5/1/20
to Visual Foxpro Latinoamérica
una consulta a mi me pasa lo mismo cuando hago pack la gria se vuelve en blanco pierde el foco
cual es la solucion
segun leo tener 2 tablas
la primera que sea recordsorce en la gria
y la segunda que sea identica pero de uso temporal

cuando hago select de la tabla 1 y hago pack se pierde foco
que se tiene q hacer antes o despues

favor de explicar gracias



El viernes, 28 de febrero de 2014, 11:01:37 (UTC-5), Analyzer escribió:
Reply all
Reply to author
Forward
0 new messages