Tratar conflictos de datos en la aplicación de cliente-servidor de ejemplo

Si se modifican los datos de la tabla de origen mientras otro usuario la esté modificando, es posible que surja un conflicto. Hay varias formas de solucionar este conflicto en el área Actualizar opciones del formulario de ejemplo de cliente-servidor.

Si selecciona Forzar en el área Actualizar opciones, se pasarán por alto todos los cambios realizados en los datos después de que usted empezara la modificación, cuando actualice los datos con sus modificaciones.

Si elige Resolver conflictos en el área Actualizar opciones, la aplicación de cliente-servidor de ejemplo localizará los conflictos cuando se produzcan y le permitirá ver los datos conflictivos y decidir si desea invalidar los cambios existentes o descartar sus propios cambios. Si no elige Resolver conflictos, no se actualizarán sus datos si se detecta un conflicto:

IF THIS.parent.chkConflicts.Value
   THISFORM.ResolveConflicts
ELSE
   WAIT WINDOW 'Update failed' NOWAIT TIMEOUT 5
ENDIF

Si elige Reglas comerciales en el área Actualizar opciones, la aplicación actualizará los datos según sus reglas comerciales. Para obtener más información acerca de la opción Reglas comerciales, vea Implementar reglas comerciales en la aplicación de cliente-servidor de ejemplo.

Para generar un conflicto de datos

  1. Ejecute dos instancias por separado de Visual FoxPro para simular el acceso de varios usuarios a la base de datos.
  2. Ejecute la aplicación de cliente-servidor de ejemplo en cada instancia.
  3. Active el almacenamiento en búfer en ambas sesiones.
  4. Asegúrese de que la casilla de verificación Forzar no está activada en ninguna de las dos instancias de Visual FoxPro.
  5. Realice modificaciones en cada sesión en los mismos campos de la misma fila de la tabla.
  6. Actualice la tabla de una de las sesiones.
  7. Actualice la tabla de la otra sesión.

Cuando elija actualizar la tabla por segunda vez, la siguiente línea de código del evento Click de cmdUpdate intentará actualizar la tabla.

llUpdate = TABLEUPDATE(lnUpdateType, llForce)

Si llForce está establecido como verdadero (.T.), se invalidarán las modificaciones realizadas en la otra sesión. Si llForce está establecido como falso (.F.), se detectará un conflicto de datos y la función TABLEUPDATE( ) devolverá falso. Si llUdate está establecido como falso, se llamará al método ResolveConflicts:

IF llUpdate
   WAIT WINDOW 'Update succeded' NOWAIT TIMEOUT 5
ELSE
   frmConflicts = CREATEOBJECT('Conflicts')
   frmConflicts.Show
ENDIF

El código del evento Activate del formulario Conflicts crea un cursor con tres registros en blanco para mostrar los valores actuales, los valores antiguos y los valores modificados de la fila.

=AFIELDS('aEmployee')
SELECT 0
CREATE CURSOR CS_CONFLICTS FROM ARRAY aEmployee

APPEND BLANK
APPEND BLANK
APPEND BLANK

El código asociado al método Next del formulario Conflicts obtiene el cursor con Populate, que es la cuadrícula conflictiva con los valores nuevos, antiguos y modificados. Por ejemplo, el siguiente bucle FOR llena un registro con los valores antiguos de la tabla:

FOR m.i = 1 TO ALEN(aEmployee, 1)
   REPLACE (aEmployee[m.i,1]) WITH ;
      OLDVAL(aEmployee[m.i,1], lcEmployee)
ENDFOR

Cuando los usuarios pueden ver exactamente cuáles son los conflictos de datos, se encuentran en una mejor posición para decidir si van a invalidar los valores nuevos, si van a revertir los cambios realizados por ellos, o si van a pasar por alto el conflicto.

El código del evento Click de cmdUpdate en el formulario Conflicts fuerza la actualización:

llUpdate = TABLEUPDATE(.F., .T.)

El código del evento Click de cmdRevert elimina los cambios realizados por el usuario:

lnRows = TABLEREVERT(.F.)

Si el usuario elige Pasar por alto en el formulario Conflicts, continuará el procesamiento de los otros conflictos de la tabla.

Vea también

Ejemplos de soluciones | Ejemplo de cliente-servidor | Clases de la aplicación de cliente-servidor de ejemplo | Base de datos de la aplicación de cliente-servidor de ejemplo | Implementar reglas comerciales en la aplicación de cliente-servidor de ejemplo | Actualizar datos en la aplicación de cliente-servidor de ejemplo