Duda sobre shared y exclusive en VFP

Recién trabajo en la creación de un sistema en red para un punto de venta y cotizaciones, en el sistema puse la opción de poder generar paquetes (Prods.dbf) para venta a partir de catálogo de productos, el detalle es que al editar los paquetes según lo poco que sé, es que debo eliminar de una tabla auxiliar (PAQDET.dbf) los registros correspondientes al paquete generado previamente para poder crear uno nuevo, es decir si un paquete constaba de (refresco, frituras, postre) ahora va a constar de (refresco, ensalada, plato fuerte) lo cual me deja solo un producto en común, el refresco y los demás son nuevos.
El problema es que debo abrir la tabla PAQDET. Dbf como EXCLUSIVE para poder eliminar los registros que se requieran eliminar, pero si otro usuario quiere acceder a la tabla en cuestión para consulta en otro módulo, la abro como SHARED (lo cual no me permite eliminar)

¿Cómo puedo hacer para quitar los registros (PACK) sin tener que "pausar" el uso de la tabla desde otra terminal por abrirlas en dos terminales con atributos diferentes (SHARED Y EXCLUSIVE)?
¿Se puede en un módulo abrir como SHARED y en otro como EXCLUSIVE sin generar error en caso de que se accedan al mismo tiempo desde terminales diferentes?
Aclaro, las tablas están libres y no pertenecen a una base de datos instaladas en una pc que hace las veces de servidora de datos.

Respuesta
1

Podrías abrir las tablas como SHARED y ajustar SET DELETE en ON para que no se vean los registros marcados para borrar; entonces cuando los elimines desaparecerán, luego cuando cierras la aplicación haces el PACK de la tabla para que libere todo lo que esté marcado para borrar.

También se me ocurre que podrías usar el comando TRY ENTRY en conjunto con un DO WHILE ENDDO

Entonces, por ejemplo:

Do While .T.
   Try 
      USE MiTabla EXCLUSIVE
      Exit
   Catch to oError
      nError = oError.ErrorNo
      nLinea = oError.LineNo
   Finally
      if !empty(nError)
         nOpcion = Messagebox([Tabla en Uso, Aguarde],50+4096,[Error],2000)
         Do Case
         Case nOpcion = 3 && Abort.
            Quit
         Case nOpcion = 5 && Ignore.
            Exit
         Endcase
      Endif
    Entry
Enddo

Esta linea de comando lo que hace es esperar a que si la otra tabla esta en uso se detiene con un mensaje y continuará por si sola cuando se desocupe.

¡Gracias! Muchas gracias mi hermano, te agradezco tu tiempo y respuesta, lo pondré en práctica y ya te cuento el resultado, excelente día, un abrazo...

1 respuesta más de otro experto

Respuesta
1

Cuando se trabaja con tablas en VFP es un poco engorroso y no tiene la potencia de SQL Server u otros. Un truco para cuando todo lo demás falla es que le cambies el campo del indice que vincula los registros, por ejemplo: refresco, frituras y postre pertenecen al paquete A (que tiene ID 20) en el detalle todos los registros tendrán en común el ID del padre (20) en algún lado, bastará con cambiar ese ID a 99999999999 (por ejemplo) y las búsquedas ya no lo encontrarán, posteriormente puedes borrar todos los ID 99999999999 sin que nadie los este utilizando. Como te menciono este es un truco de ultimo recurso en lo que encuentras una manera mejor.

Esa también es buena, "perder" los registros momentáneamente según lo entiendo, es correcto?

Disculpa la tardanza en responder Freddo, es correcto, hay que "perder" los registros para poderlos eliminar en una rutina separada. Que bueno que te haya servido la idea.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas