Compartir a través de


Detectar y resolver conflictos

Durante las operaciones de actualización de datos, sobre todo en entornos compartidos, puede resultar conveniente determinar qué campos han cambiado o cuáles son los valores originales o actuales de los campos modificados. El almacenamiento en búfer de Visual FoxPro y las funciones GETFLDSTATE( ), GETNEXTMODIFIED( ), OLDVAL( ) y CURVAL( ) permiten determinar qué campo ha cambiado, buscar los datos modificados y comparar los valores actuales, originales y modificados para decidir cómo solucionar un error o un conflicto.

Para detectar un cambio en un campo

  • Después de una operación de actualización, utilice la función GETFLDSTATE( ).

GETFLDSTATE( ) funciona sobre datos no almacenados en búfer. Sin embargo, esta función es aún más efectiva cuando se ha activado el almacenamiento de registros en búfer. Por ejemplo, utilice GETFLDSTATE( ) en el código de un botón Omitir de un formulario. Cuando mueva el puntero de registro, Visual FoxPro comprobará el estado de todos los campos del registro como en el ejemplo siguiente:

lModified = .F.
FOR nFieldNum = 1 TO FCOUNT( ) && Check all fields 
   if GETFLDSTATE(nFieldNum) = 2  && Modified
      lModified = .T.
      EXIT && Insert update/Save routine here.
   ENDIF && See the next example
ENDFOR

Para detectar y localizar un registro modificado en datos almacenados en búfer

GETNEXTMODIFIED( ), con cero como parámetro, busca el primer registro modificado. Si otro usuario realiza cambios en la tabla almacenada en búfer, los cambios que encuentre el comando TABLEUPDATE( ) en el búfer ocasionarán conflictos. Puede evaluar los valores conflictivos y resolverlos mediante las funciones CURVAL( ), OLDVAL( ) y MESSAGEBOX( ). CURVAL( ) devuelve el valor actual de registro en el disco, mientras que OLDVAL( ) devuelve el valor del registro en el momento en que se almacenó en el búfer.

Para determinar el valor original de un campo almacenado en búfer

OLDVAL( ) devuelve el valor de un campo almacenado en búfer.

Para determinar el valor actual de un campo almacenado en búfer en el disco

CURVAL( ) devuelve el valor actual en el disco de un campo almacenado en búfer antes de realizar modificaciones.

Puede crear un procedimiento de control de errores que compare los valores actual y original, lo que le permitirá determinar si desea confirmar el cambio actual o aceptar un cambio anterior en los datos de un entorno compartido.

El ejemplo siguiente utiliza GETNEXTMODIFIED( ), CURVAL( ) y OLDVAL( ) para proporcionar al usuario una opción informada en una operación de actualización. Este ejemplo continúa a partir de la detección del primer registro modificado y puede estar contenido en un botón Actualizar o Guardar de un formulario.

Código del evento Click para un botón Actualizar o Guardar

Código Comentarios
   nCurRec = GETNEXTMODIFIED(nCurRec)
   DO WHILE nCurRec <> 0   
   GO nCurRec
   RLOCK( )
Hace un bucle a través del búfer.

Bloquea el registro modificado.
   FOR nField = 1 TO FCOUNT(cAlias)   
      cField = FIELD(nField)
      IF OLDVAL(cField) <> CURVAL(cField)
         nResult = MESSAGEBOX("Data was ;
            changed by another user. ;
            Keep changes?", 4+48+0, ;
            "Modified Record")
Busca el conflicto.

Compara el valor original con el valor actual del disco y, a continuación, pregunta al usuario qué debe hacer en relación con el conflicto.
         IF nResult = 7   
            TABLEREVERT(.F.)   
            UNLOCK RECORD nCurRec   
         ENDIF
      ENDIF
   ENDFOR
   nCurRec = GETNEXTMODIFIED(nCurRec)
ENDDO
Si el usuario selecciona "No", invierte este registro y, a continuación, elimina el bloqueo.




Busca el siguiente registro modificado.
TABLEUPDATE(.T., .T.)   
Fuerza la actualización de todos los registros.

Detectar conflictos con campos memo

Puede usar la propiedad CompareMemo para controlar cuándo deben usarse campos memo para detectar conflictos en la actualización. Esta propiedad de la vista y del cursor determina si los campos memo (de los tipos M o G) están incluidos en la cláusula WHERE de actualización. La configuración predeterminada, True (.T.), significa que los campos memo están incluidos en la cláusula WHERE. Si establece esta propiedad como False (.F), los campos memo no participan en la cláusula WHERE de actualización, independientemente de la configuración de UpdateType.

La detección optimista de conflictos de los campos memo se desactiva cuando CompareMemo se establece como False. Para activarla, establezca CompareMemo como True (.T.).

Reglas para administrar conflictos

La administración de los conflictos encontrados en entornos multiusuario pueden requerir código extenso y repetitivo. Una rutina completa de administración de conflictos hace lo siguiente:

  • Detecta un conflicto
  • Identifica la naturaleza y la ubicación del conflicto
  • Proporciona suficiente información para que el usuario pueda resolver el conflicto correctamente

Para obtener un ejemplo de una rutina de administración de conflictos, vea la clase del comprobador de datos en Samples.vcx, ubicado en el directorio ...\Samples\Classes de Visual FoxPro. Simplemente agregue la clase a un formulario y llame al método CheckConflicts antes de realizar cualquier operación que escriba datos almacenados en búfer en la tabla, por ejemplo, mover el puntero de registro si está utilizando el almacenamiento de filas en búfer, cerrar una tabla o ejecutar TABLEUPDATE( ).

Vea también

Administrar conflictos | Programar para acceso compartido | Administrar actualizaciones mediante vistas | GETFLDSTATE( ) | GETNEXTMODIFIED( )