Dudas sobre IFEXCLU - LOCK ,etc

Hola
Quisiera saber como verifico si una tabla esta abierta en otra PC (no en la mía). Para después tomarla EXCL en VFP 6.
Gracias
Respuesta
1
Lo que tenés que hacer es bloquearla con flock(). Por ej.
USE ...\TABLA.DBF EXCLUSIVE
SET REPROCESS TO 3 SECONDS
IF FLOCK()
IF ISEXCLUSIVE()
* Rutina que necesite la tabla exclusiva
Endif
Endif
Con esto lo que hacés es tratar de usarla exclusiva, bloquearla para que nadie más la use. Si consigue bloquearla, consultás si está exclusiva para vos (debería, solo paranoia) y hacés lo que necesitás con la tabla.
Antes que nada gracias por la información brindada.
Pero sigo sin poder solucionarlo.
En PC 1
USE "g:\xautoriza\sami\afiliado" shar
En PC 2
CLEAR ALL
IF !USED("g:\xautoriza\sami\afiliado")
WAIT WIND "LA TABLA NO ESTA EN USO - LA ABRE ACA"
USE "g:\xautoriza\sami\afiliado"
BROW
Endif
clear all
... y la abre en PC 2 siendo que esta abierta en PC 1
como hago para
1- No abrirla si esta siendo usada en PC 1 (siendo que no me avisa)
2 - el tema de usar flock() no entiendo el tema del alias que me pide
yo le pongo flock("g:\xautoriza\sami\afiliado") y me pide alias.
La idea es tomarla excl a la base y si esta en uso no seguir con la operación
Muchas gracias
En principio tené en cuenta que estás abriendo en PC1 la tabla como compartida (shared), por eso es que también la abra en PC2.
Por otra parte flock() intenta bloquer el alias en uso, por lo que no es necesario que lo pongas nada, de lo contrario tendrías que poner solo "afiliado" y no toda la ruta.
Si en el momento que intentás bloquear la tabla alguien la está usando, esto es, escribiendo sobre ella, borrando, agragando registros, no te va a dejar bloquearla y flock() va a devolver .F., para evitar un .F. casi seguro se usa SET REPROCHES, que reintenta bloquearla tantos segundos como le indiques.
Una vez que consigue bloquearla la a estar exclusiva como necesitás (verifícalo usando isexclusive()).
No deberías tener problemas.
Tené en cuenta que ! Used() consulta si vos, o la pc local la está usando, es decir eso no te sirve para tu caso.
Suerte. Cualquier duda, consultá tranquilo.
Hay alguna función que me meduelva .f. o algo que me indique que la tabla esta abierta, aunque sea de solo lectura en la otra pc.
Porque yo quiero actualizar todos los registros y no logro nada blockeandola por por tiempo.
La idea es ver si esta en uso en otra pc, si esta en uso el proceso lo hago después. Gracias
Volvamos. No es que la bloqueas por por tiempo, la bloqueás por todo el tiempo que se te ocurra, lo que haces por por tiempo es intentar bloquearla. Una vez que lo conseguís, solo la libera un unlock o que salgas de VFP.
Mientras la tengas bloqueada, podes hacer lo que se te ocurra, incluso borrarla del disco.
En fin...
Probá usando esto:
**********************
lcErrAnterior = ON("ERROR")
ON ERROR llUsada = .NULL.
USE ...\tabla.dbf EXCLUSIVE
IF ISNULL(llUsada)
Messagebox("La tabla está siendo usada por otro usuario")
ELSE
Messagebox("La tabla no está siendo usada")
ENDIF
ON ERROR &lcErrAnterior.
**************************
De esta forma, tratando de abrirla exlusiva y capturando el error podes saber si la están usando.
Aunque nada te asegura que no puedan leerla ya que la cláusula SHARED que incluís en cuando abrís las tablas en las otras pues' permite su lectura aunque SET EXCLUSIVE esté en ON.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas