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
- Utilice la función GETNEXTMODIFIED( ).
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
- Utilice la función OLDVAL( ).
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
- Utilice la función CURVAL( ).
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 |
---|---|
|
Hace un bucle a través del búfer. Bloquea el registro modificado. |
|
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. |
|
Si el usuario selecciona "No", invierte este registro y, a continuación, elimina el bloqueo. Busca el siguiente registro modificado. |
|
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( )