Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Entorno multiusuario...
Message
From
14/06/2006 10:09:27
Hilmar Zonneveld
Independent Consultant
Cochabamba, Bolivia
 
General information
Forum:
Visual FoxPro
Category:
Other
Miscellaneous
Thread ID:
01128992
Message ID:
01128994
Views:
18
>.- Tengo un form con el entorno de datos, en él utilizo un pageframe (page1: consultas, page2: procesar) y un grid. En la page1 de consultas utilizo el grid, y en la page2 para procesar y donde lo hago por medio de varios cuadro de texto.
>
>.- En la propiedad del form lo tengo en DataSession = 2
>
>.- En él load del form utilizo esto:
>Set Confirm On
>Set Exclusive Off
>Set Multilock On
>Set Refresh To 0.5
>Set Refresh To 0,5
>Set Reprocess To Automatic
>Set Lock Off
>Set Procedure To
>
>.- En el botón procesar tengo colocado esto:
>=CursorSetProp("Buffering",3,"deudasproveedores")
>*-----------
>lcBloqueaRnc=factura
>If Seek(lcBloqueaRnc,"deudasproveedores")
> Rlock("deudasproveedores")
>Endif
>If IsRLocked()=.F.
> Messagebox('El registro con la factura número '+lcBloqueaRnc+' está siendo utilizado por otro usuario.',0+16,'ERROR AVISPAO')
> Messagebox(IsRLocked()) && de prueba para verificar el estado aquí
> If Seek(lcBloqueaRnc,"Acreencias")
> Unlock
> Endif
> Thisform.cmdeshacer.Click
>Else
> Messagebox("El registro no lo están utilizando, POR ESO AHORA LO BLOQUEO")
> Messagebox(IsRLocked()) && de prueba para verificar el estado acá
> * Aquí habilito los cuadro de texto
>Endif
>*-----------
>
>Mis preguntas son:
>
>1.- ¿Estoy haciendo bien el bloqueo y el desbloqueo?

Tal vez, pero cuando se usa buffering, normalmente no es necesario bloquear explícitamente. Visual FoxPro bloquea implícitamente (brevemente), cuando haces el TableUpdate(). Recomiendo usar buffering optimista (3 ó 5); en tu caso lo hiciste.

Código de ejemplo:
* Form.GuardarCambios()
local llExito
llExito = TableUpdate
if not llExito
  * Buscar información sobre el error
  local laError(1)
  aerror(laError)
  MessageBox("Error al guardar: Error #" + trans(laError(1);
    + " - " + laError(2))
endif
laError(1) y laError(2) tendrán el número y el mensaje del error, respectivamente.

En el caso del buffering optimista, TableUpdate() bloquea los datos brevemente, al momento de guardar. Además, con las opciones default, verifica si hay conflicto de actualización (otro usuario cambió los datos mientras tanto).

Todo lo anterior se ejecuta cuando el usuario hace click en un botón "Guardar" - o en la opción de menú "Archivo | Guardar" o algo similar.

>
>2.- Cuando aparece el mensaje (el que yo puse ERROR AVISPAO) porque otro usuario trata de usar el registro y este usuario quiere cerrar el form aparece este mensaje del VFP: "Otra persona está usando el registro." Aceptar, volver, ayuda. ¿Cómo corrijo este problema?

Con el intento de TableUpdate(), la lógica cambia totalmente.

Si el usuario hace click en "Anular" (Deshacer), se ejecuta TableRevert().

En el caso algo improbable de un conflicto de actualización (otro usuario hizo cambios mientras tanto, en el mismo registro), en realidad no queda otra que anular el cambio, hacer un ThisForm.Refresh() para obtener los últimos datos, y comenzar de nuevo.

Y bueno, TableUpdate() tiene una opción de reemplazar los cambios hechos por el otro usuario, pero considero esto demasiado peligroso.

Nota: Por si no queda 100% claro, se debe habilitar Buffering ANTES de que el usuario haga el primer cambio.
Difference in opinions hath cost many millions of lives: for instance, whether flesh be bread, or bread be flesh; whether whistling be a vice or a virtue; whether it be better to kiss a post, or throw it into the fire... (from Gulliver's Travels)
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform