Bloqueo de un registro
Gracias por esa bienvenida, Queria comenzar la discución con el bloqueo de registros de Bases de datos compartidas en ambiente multiusuario. He intentado el rlock, lock... y no me sirve... en realidad estoy confundida... Alguien me puede decir donde encuentro algo más especifico referente a este tema... Gracias (? . .)
Si estas usando visual fox 5 en adelante, te cuento que para el bloqueo de registros ya no hay que pensar tanto sino que fox lo maneja practicamente solo, para eso investiga las propiedades de los formularios como ser buffermode y las funciones TABLEUPDATE() Y TABLEREVERT().
Desde la versión 5 fox implementa el uso de buffers de tablas y de registros, lo que hace esto es que si eliges trabajar con un buffermode optimista el registro actual se copia a una variable en memoria, todos los cambios que hagas sobre el registro serán guardados cuando le des la orden con TABLEUPDATE(), para revertir los cambios lo unico que haces es usar TABLEREVERT() y vuelves a tener el registro viejo. Cuando fox intente guardar el registro, el mismo bloqueará el mismo y guardará los cambios. Generalmente en todos los tipos de aplicaciones realizadas con fox esto sirve y es muy práctico, salvo raras ocasiones donde si debes forzar el bloqueo a mano, pero son las menos. Cualquier duda quedo a tu disposicion.
Desde la versión 5 fox implementa el uso de buffers de tablas y de registros, lo que hace esto es que si eliges trabajar con un buffermode optimista el registro actual se copia a una variable en memoria, todos los cambios que hagas sobre el registro serán guardados cuando le des la orden con TABLEUPDATE(), para revertir los cambios lo unico que haces es usar TABLEREVERT() y vuelves a tener el registro viejo. Cuando fox intente guardar el registro, el mismo bloqueará el mismo y guardará los cambios. Generalmente en todos los tipos de aplicaciones realizadas con fox esto sirve y es muy práctico, salvo raras ocasiones donde si debes forzar el bloqueo a mano, pero son las menos. Cualquier duda quedo a tu disposicion.
Si trabajas con formularios basta que configures los Set para que automaticamente se bloquen o desbloquen las tablas y el resto de operaciones como mantenimiento puedes crear formularios que realizen estas operaciones a partir de la version 6 el visual foxpro no tienes que preocuparte de bloquear o desbloquear en todo caso dependeria del modo que estes trabajando tus aplicaciones ya sea como contenedor de base de datos o tablas libres, para cualquier cosa estoy a disposición.
gracias y saludos
gracias y saludos
Cuando trabajas en un ambiente de bases de datos compartidas, debes respetar lo siguiente:
*Abrir en modo compartido para que varios *usuarios accesen a las tablas.
Use (nombre de tabla.dbf) shared
*Buscas el registro a actualizar
locate (condición) * o con Seek, segun tu caso.
*Al grabar o actualizar un registro debes *bloquear el registro o la tabla para que otro *usuario no trate de modificarlo o eliminarlo al *mismo tiempo.
*La siguiente instrucción hace que si el registro *no se bloquea a la 1a. se seguira intentando *hasta que se logre dicha acción.
set reprocess to automatic
*Con la siguiente secuencia se efectua el bloqueo *de la tabla (Rlock para bloquear registros)
if flock()
...(tu instrucciones para grabar en tablas)
endif
*Ahora hay que quitar el bloqueo para que otro *usuario pueda tener acceso al registro o tabla.
unlock all
*Recuerda, esto se hara en cada tabla compartida *y puedes marcar para eliminación uno o varios *registros, pero no eliminarlos de manera *definitiva (pack o zap) hasta que la(s) tabla(s) *se habran en modo exclusivo.
Espero que esto te ayude a aclarar tus dudas.
*Abrir en modo compartido para que varios *usuarios accesen a las tablas.
Use (nombre de tabla.dbf) shared
*Buscas el registro a actualizar
locate (condición) * o con Seek, segun tu caso.
*Al grabar o actualizar un registro debes *bloquear el registro o la tabla para que otro *usuario no trate de modificarlo o eliminarlo al *mismo tiempo.
*La siguiente instrucción hace que si el registro *no se bloquea a la 1a. se seguira intentando *hasta que se logre dicha acción.
set reprocess to automatic
*Con la siguiente secuencia se efectua el bloqueo *de la tabla (Rlock para bloquear registros)
if flock()
...(tu instrucciones para grabar en tablas)
endif
*Ahora hay que quitar el bloqueo para que otro *usuario pueda tener acceso al registro o tabla.
unlock all
*Recuerda, esto se hara en cada tabla compartida *y puedes marcar para eliminación uno o varios *registros, pero no eliminarlos de manera *definitiva (pack o zap) hasta que la(s) tabla(s) *se habran en modo exclusivo.
Espero que esto te ayude a aclarar tus dudas.
