Tablas en modo Buffering y Variables

Una Pregunta y una Ayuda
Primero: Si por ejemplo yo abro un sistema que trabaja en forma multiusuario en el cual están trabajando dos o más usuarios, y este sistema por ejemplo tiene un modulo llamado CARGOS que tiene un texbox donde se escribe la descripción del cargo. Mi duda es, si yo guardo el valor de del textbox en una variable publica y al darle guardar ya otro usuario ha cambiado el valor de esta variable en otro terminal, ¿ese valor no afecta el valor de la variable de mi terminal? ¿Osea se guardara el valor que yo le di y no el del otro usuario?
Segundo: ¿Podrías facilitarme un código para poner en un botón guardar de un formulario donde las tablas estén en modo buffering?

1 Respuesta

Respuesta
1
En cuanto a tu pregunta si eso afecta y es de la siguiente manera:
Si el usuario modifica el registro y guarda sus cambios y luego haces tú lo mismo, entonces la tabla quedará con los cambios que tú relizaste, pero si sucede lo contrario, entonces lógicamente la tabla quedará con los cambios que realizó el otro usuario.
En el caso de que los dos hagan cambios en el mismo registro sin bloquearlo casi en el mismo momento, se presentará un conflicto de actualización de datos (Error 1585 en Visual FoxPro falló una llamada interna a la cláusula Update de SQL, Visual FoxPro llama a esta cláusula a través de la función TableUpdate) entonces el sistema mostrará un mensaje de error al último usuario que guardo los cambios realizados en dicho registro donde deberá decidir si forzar la grabación de los cambios realizados este (utilizar Tableupdate(.F.,.T., "NombreTabla") o de lo contrario dejar los cambios que hizo el otro usuario de la red (utilizar TableRevert(.F., "NombreTabla")).
En cuanto a lo de la segunda pregunta en el Evento init del formulario escribes la siguiente línea de comando
Set Multilocks On
Luego estableces las propiedades Datasession y BufferMode del formulario a valor 2 y en el evento clic del botón guardar puedes escribir un código como el siguiente:
Local lcError
lcError = !TableUpdate(.T.)
  If lcError Then
    If AError(lcAerror) > 0
      Thisform. Error(lcAerror(1))
    Endif
Endif
En el Evento Error del Formulario debes suministrar código para los errores más comunes que comete el usuario algo parecido a lo siguiente:
Local aErrors
Aerror(aErrors)
  Do Case
    Case aErrors[1,1] = 1539 && Falló el desencadenante          
        Código para tratar el error.
    Case aErrors[1,1] = 1581 && Un campo no acepta valores nulos.     
        Código para tratar el error.
    Case aErrors[1,1] = 1582 && Se ha infringido una regla de campo
        Código para tratar el error.
    Case aErrors[1,1] = 1585 && Conflicto de actualización de datos.     
        nNextModified = getnextmodified(0)
        DO WHILE nSigModificado <> 0
            GO nSigModificado
            RLOCK()
            FOR nField = 1 to FCOUNT()
              lcCampo = FIELD(nCampo)
              if OLDVAL(lcCampo) <> CURVAL(lcCampo). 
                nResult = MESSAGEBOX;
                ("Otro usuario ha " + ;
                 "modificado los datos "+ ;
                 "¿Desea mantener los cambios?", 4+48, ;
                 "Registro modificado")
                 If nResultado = 7
                    TABLEREVERT(.F.)
                    UNLOCK record nSigModificado
                 Endif
                 Exit
           Endif
       Endfor
    Case aErrors[1,1] = 109 && El registro actual está bloqueadopor otro usuario.     
        Código para tratar el error.
    Case aErrors[1,1] = 1583 && Se ha infringido una regla de inserción de registro.
        Código para tratar el error.
    Case aErrors[1,1] = 1884 && Se violó la unicidad del campo que es llave primaria.   
        Código para tratar el error.
    Otherwise
        Messagebox( "Error desconocido "+;
        " mensaje: " + STR(aErrors[1,1]))
EndCase
Hola buenos días.
El código que me mandaste esta buenísimo, pero cuando me refería a las dos preguntas, me refería a la hora de grabar un nuevo registro en la tabla y no de modificar o eliminar un registro, porque por lo que veo para eso es el código que me mandaste.
Lo que pasa es que tengo que realizar una aplicación en red muy sencilla para la empresa donde trabajo, claro, a mi no me gusta usar el modo Buffering por que yo trabajo casi todo (grilla, combobox, etc) con instrucciones Sql (Select, cursores) y mientras las tablas están en modo buffering los cursores no se actualizan, ya que visual foxpro no tiene esa capacidad. CREO. Y necesito trabajar el sistema en modo buffering porque hay algunas operaciones en donde a veces se necesita revertir algunas operaciones antes de que sean actualizadas en la tabla original
Saludos, y disculpa las molestias. Gracias
Estás compleatamente errado, el código que te envié sirve para todo lo que tu dices, Agregar (inclusive un nuevo registro), Guardar, eliminar, revertir cambios, etc y Visual FoxPro tiene la capacidad para todas esas tareas, consulta en la documentación de Visual FoxPro, y si gustas, pásame tu correo para enviarte un ejemplo sencillo de un formulario que realiza estas tareas.
Cuando tú agregas un nuevo registro en la tabla con almacenamiento en búfer, este registro lo podrán ver los demás usuarios de la red hasta que ejecutes la función TableUpdate que es la que guarda el nuevo registro directamente en la tabla física o los cambios realizados en uno ya existente.
Hola buenos días
De verdad te lo agradecería muchísimo si me envías un ejemplo con todos estos procesos (guardar, eliminar, modificar)
Y otra cosita, ¿de verdad verdad no hay ninguna forma de actualizar un cursor sql mientras no se le aplique TableUpDate a la tabla original?
Saludos y gracias por todo.
Mis correos:
(xxxxxx)
(xxxxxx)
No, pues Visual FoxPro toma los registros directamente desde la tabla física y no desde un cursor con almacenamiento en búfer y, por eso, cuando agregas un nuevo registro o realizas cambios en uno ya existente estos no los podrán ver los demás usuarios de la red hasta que ejecutes la función TableUpdate(), vuelvo y te repito esta función se encarga de enviar las actualizaciones a la tabla física ya sean registro nuevos o registros modificados, el almacenamiento en búfer no es más que una copia de los registros de la tabla física en un cursor SQL una vez que un usuario ha agregado registros o ha modificado otros y luego ejecuta tableupdate, los demás usuarios podrán ver reflejados esos cambios en la tabla cuando llaman al evento Refresh del formulario (ejecutan Thisform. Refresh() o Set Refresh To nIntérvalodeSegundos) si el usuario que realiza cambios o agrega un nuevo registro no ejecuta tableupdate, los demás usuarios de la red no podrán ver esos cambios aún cuando llamen al evento Refresh del formulario.
Con lo anterior creo que ya está claro como funciona el almacenamiento en búfer y ya envié un ejemplo a tu correo de un sistema de entorno multiusuario.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas