Utilizando el comando ZAP

1,484 views
Skip to first unread message

integral

unread,
Jul 16, 2014, 10:48:34 AM7/16/14
to mundovis...@googlegroups.com
Estimados Amigos :
 
Nuevamente recurro a vuestra ayuda con respecto a lo siguente :
 
Antes de terminar de ejecutar un proceso necesito eliminar el contenido de una tabla para evitar se llene de informacion por duplicidad, el proceso se realiza en modo multiusuario, pero no logro eliminar el contenido de dicha tabla...
 
Inicialmente me indicaba el error de "FILE IS IN USE"
 
Estoy utilizando el siguiente codigo que ya no me genera el error pero no elimina ningun registro.
 
IF USED("Seleccion")
 SELECT Seleccion
ELSE
 USE Seleccion IN 0 EXCLUSIVE 
 ZAP
ENDIF
Agrradezco sus comentarios y sugerencias...
 
Saludos,
 
INTEGRAL

Analyzer

unread,
Jul 16, 2014, 11:01:23 AM7/16/14
to mundovisualfoxpro
>el proceso se realiza en modo multiusuario.

No uses ZAP sobre una tabla en modo multiusuario. Te va dar muchos problemas además de ser incorrecto.


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



Utilizar un Select seguro para preservar los grids



Según lo veo tus opciones podrían ser:

1. Usar Delete all

La ayuda de VFP8 dice:

El uso de ZAP equivale a especificar DELETE ALL y a continuación PACK, pero ZAP es mucho más rápido.

Si la memoria no me falla, ZAP no borra los campos memos, DELETE ALL si.

2. Usar un cursor en vez de una tabla.

Es incorrecto "empacar" registros con PACK (incluido en el ZAP) en ambiente multiusuario. Eso solo se haría como parte de las utilerías del sistema y asegurándose de tener a todos los usuarios purgados del sistema.

Saludos!


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Simon Apaza

unread,
Jul 16, 2014, 3:31:23 PM7/16/14
to Mundo Visual FoxPro

Use dbf('seleccion') exclu
Zap

--

Gerardo Baron

unread,
Jul 16, 2014, 3:36:29 PM7/16/14
to mundovis...@googlegroups.com

Antes del zap usa el comando SELECT seleccion

--

Carlos Miguel FARIAS

unread,
Jul 16, 2014, 5:31:48 PM7/16/14
to mundovisualfoxpro
Mande una respuesta a pulices.

TRY
   USE laTabla IN 0 EXCLUSIVE
   ZAP
CATCH TO lePifiaste
   =MESSAGEBOX(lePifiaste.message)
ENDTRY

cesar.y...@gmail.com

unread,
Jul 16, 2014, 5:55:30 PM7/16/14
to mundovis...@googlegroups.com
Y puede ser un cursor em lugar de tabla o es una tabla con datos genericos para todo el mundo
Enviado desde mi BlackBerry

From: integral <gabriel_...@hotmail.com>
Date: Wed, 16 Jul 2014 07:48:34 -0700 (PDT)
Subject: [Mundo Visual FoxPro] Utilizando el comando ZAP
--

integral

unread,
Jul 19, 2014, 11:37:46 PM7/19/14
to mundovis...@googlegroups.com
Gracias a todos los Colegas y Amigos...Logre resolver el problema presentado...
 
En verdad es complicado borrar los registros de manera fisica en un programa multiusuario durante el proceso de generacion de archivos...
 
Al final obte por borrar los registros de manera logica por decirlo de alguna manera...
 
Gracias totales.
 
atte.,
 
INTEGRAL

Analyzer

unread,
Jul 20, 2014, 6:37:02 PM7/20/14
to mundovisualfoxpro
Así es..

VFP no es el único que funciona de esa forma. Por ejemplo Access hace algo similar. La utilería de compactar y reparar de access es en cierta forma similar a hacer un PACK y un REINDEX con VFP.

Pero como te explicamos, eso requiere parar a todo mundo.

Lo normal es hacer un DELETE que solo marca para borrado los registros y dependiendo de la configuracion de SET DELETED, seran observables o no.

Ahora bien, si se requiere una tabla temporal lo mejor es usar un cursor cuya duración será hasta que se haga el próximo:

Select micursor
USE && Cerramos el cursor

o

USE IN (SELECT("micursor"))

Y con eso el cursor se borra de la memoria y con eso ya no tendrías que estar destruyendo tablas o borrando registros.










Saludos!


--

HernanCano

unread,
Jul 22, 2014, 5:44:03 PM7/22/14
to mundovis...@googlegroups.com
Considero que aún no tienes solución a tu inconveniente.

Te propongo lo sgte:

IF .not.USED("Seleccion")

 USE Seleccion IN 0 EXCLUSIVE 
ENDIF
 SELECT Seleccion
 ZAP

Pero debes garantizar que si archivo esté abierto EXCLusive.


El miércoles, 16 de julio de 2014 09:48:34 UTC-5, integral escribió:

Carlos Miguel FARIAS

unread,
Jul 23, 2014, 8:43:35 AM7/23/14
to mundovisualfoxpro

No sirve. Si otro usuario tiene abierta la tabla, le da error. Si la tabla no está, le da error.
Ese tipo de instrucciones debería envolverlas con un try.
Pase el código antes.
Saludos: Miguel, La Pampa (RA)

--

Daniel Manuel López

unread,
Jul 23, 2014, 11:19:48 AM7/23/14
to Zorros verdaeros
Amigo,
Y porqué en lugar de darle un ZAPato no borras los registros?
Con un simple Delete all los borras aún estando en un ambiente
multiusuario y que tengan abierta tu tabla...
Pruébalo y nos comentas



Date: Wed, 23 Jul 2014 09:43:33 -0300
Subject: Re: [Mundo Visual FoxPro] Re: Utilizando el comando ZAP
From: carlosmig...@gmail.com
To: mundovis...@googlegroups.com

integral

unread,
Jul 23, 2014, 12:57:16 PM7/23/14
to mundovis...@googlegroups.com
Estimados Colegas y Amigos :
 
Agradezco sus comentarios y sugerencias pero el tema ya lo llegue a resolver hace varios dias...
 
Pero en agradecimiento y ademas por que sus integrantes de los foros me han brindado su ayuda, publico el codigo
con la solucion al problema.
 
***********************************************************************
* Permite Borrar los Registros que fueron Seleccionados y Procesados   && Multiusuario
***********************************************************************
 USE IN SELECT("Seleccion")
 USE Seleccion
 IF RECCOUNT("Seleccion") > 0
   DELETE FROM Seleccion WHERE Serie = 1              
   Messagebox("OK, la Tabla [ SELECCION.DBF ] esta Limpia.",0+64,"Aviso del Sistema",700)
 ELSE
   Messagebox("No hay Registros para Eliminar.",0+64,"Aviso del Sistema",500)
 ENDIF
ENDDO
Saludos,
 
INTEGRAL
(Lima-Perú)

El miércoles, 16 de julio de 2014 09:48:34 UTC-5, integral escribió:

Cesar Yamunaque Baca

unread,
Jul 23, 2014, 1:02:22 PM7/23/14
to mundovis...@googlegroups.com
Sigo sin entender,
si es un archivo compartido,  y un usuario elimina todos los registros, deja en el limbo a los que estan guardando información en el mismo,
cual es la utilidad..¿?
Si es un archivo de trabajo se puede usar un Cursor , se elimina cuando finaliza el programa, rutina, aplicación u otro nombre que quieran darle.
Estamos  en LOOP, deberías replanterar tu pregunta para ayudarte.
Saludos

Reply all
Reply to author
Forward
0 new messages