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.