You are on page 1of 2

1

Uso de tablas compartidas y bloqueo de registros en FoxPro


Asumamos que tienes 2 tablas libres que quieres compartir. Estas tablas se llaman
CLIENTES.DBF y PRODUCTOS.DBF
Primera forma:

Set Exclusive Off
Use CLIENTES in 0
Use PRODUCTOS in 0

Explicacin:
Toda tabla que abras despus de haber dado la instruccin "Set Exclusive Off" se abrir en
modo compartido. Si deseas dejar de seguir abriendo tablas en modo compartido, debers
incluir el comando "Set Exclusive On" para que las tablas que abras luego de este comando
no sean compartidas sino "exclusivas".
Segunda forma:
Use CLIENTES in 0 Shared again
Use PRODUCTOS in 0 Shared again
Explicacin:
Toda tablas que al abrirla de agregues la palabra "Shared" se abrir en modo compartido.
Si NO DESEAS que la tabla se abra en modo compartido, debers usar la palabra
"Exclusive" en vez de la palabra "Shared".
Adicionalmente:
Por razones de la "lgica" de tu programa o razones de cdigo de FOX, algunas veces
necesitars "bloquear" una tabla que habas abierto en modo "compartido". "Bloquearla"
significa que solo el usuario que la bloqueo podr escribir en ella, hasta que este mismo
usuario la haya desbloqueado. Por ejemplo, si estas modificando el Saldo Pendiente de un
cliente, sera sabio "Bloquear la tabla" mientras cambias el saldo para que no pueda entrar
un usuario desde otra estacin y trastornar tu trabajo.
2

Luego de que hayas hecho tu modificacin, NO SE TE DEBE OLVIDAR desbloquear la
tabla para que cualquier otro usuario pueda trabajar con ella de la manera que tu lo hiciste.
Para bloquear una tabla, debes usar la funcin FLOCK(tabla). Esta funcin te devuelve .T.
si logr bloquear la tabla y .F. si no lo logr. Puede ser que el usuario "A" no logre
bloquear la tabla porque el usuario "B" ya la tena bloqueada y hay que esperar a que el
usuario "B" la "libere". Por ejemplo
IF FLOCK("CLIENTES")
* Quiere decir que si se pudo bloquear "CLIENTES", entonces pones
aqu tu
* cdigo que modifica el Saldo del Cliente.
ELSE
* Quiere decir que no se pudo bloquear "CLIENTES", entonces debes
poner un
* aviso indicndole al operador que debe esperar unos segundos en
lo que alguien
* que tiene agarrada la tabla, por fin la libera. Esto debera ir
en un LOOP.
ENDIF
Para liberar las tablas que estn bloqueadas debes utilizar el comando UNLOCK.
Finalmente 2 cositas:
1- A veces no es necesario bloquear TODA la tabla, sino solamente un registro de la
tabla (o ciertos registros). Para bloquear un registro especfico solamente, debes
usar la funcin RLOCK() en lugar de la funcin FLOCK()
2- Otros comandos relativos al bloqueo y desbloqueo son: SET MULTILOCKS
ON/OFF que le avisa a Fox que permita o no permita bloquear a la vez varios
registros individuales de una tabla (o las tablas). SET REPROCESS TO "n" que le
indica a Fox cuantos segundos debe esperar para reintentar lograr un bloqueo
exitoso con FLOCK() o RLOCK(). Si le pones -1, Fox se quedar eternamente
intentando bloquear la tabla hasta que lo logre.

You might also like