25 de mayo de 2018

Tableupdate

TableUpdate() en Visual FoxPro

Autor: Jim Booth

Traducido por: Roberto Alfredo Moré

TableUpdate() es una de las funciones usadas muy frecuentemente cuando se utiliza buffering en Visual FoxPro.  La versión 5.0 de Visual FoxPro ha mejorado la funcionalidad de esta función. Este mes, examinaremos las mejoras a la función TableUpdate().

La sintaxis.

En Visual FoxPro versión 5 se ha mejorado la función TableUpdate().  Hay nuevas opciones que pueden usarse para hacer que esta función sea más útil a nosotros como desarrolladores. TableUpdate() tiene cuatro argumentos que controlan sus acciones. La siguiente es la sintaxis para la función TableUpdate.

TableUpdate( <nFilas>, <lForzar>, <cAliasTabla or nÁreaTrabajo>, <cMatrizErrores> )

nFilas.

Miremos cada uno de los argumentos de esta función. El primer argumento controla como la función trabajará con múltiples registros en el buffer.  Este es probablemente el argumento más confuso de la función.

nFilas aceptará uno de los tres valores 0, 1, o 2.  Un valor de 0 sólo actualizará el registro actual independientemente si el buffering es tabla o fila. Este argumento puede ser usado para controlar la edición de un único registro cuando se usa buffering de tabla o para procesar cada registro en el buffer separadamente.

Un valor de 1 actualizará todos los registros en el buffer en una llamada a TableUpdate.  Si TableUpdate encuentra un registro que no puede ser actualizado, fallará en ese punto y retornará un valor de .F., indicando que ha fallado. Ningún registro más allá del que tiene el problema será procesado.

Usando 2 como valor de nFilas también actualiza todos los registros en una llamada a la función, pero reacciona diferentemente si falla en un registro. Si un registro no puede ser actualizado, continuará con el resto de los registros y actualizará todos los que pueda.  TableUpdate retornará un valor .F. indicando que hubo un problema y llenará la matriz referenciada en el cuarto argumento con los registros que no pudo actualizar.

Si no se define un valor para nFilas se usa el valor 0.

lForzar.

El segundo argumento es un valor lógico .T. o .F. y controla como TableUpdate tratará los conflictos cuando otro usuario haya cambiado el registro mientras estábamos trabajando sobre él. Un valor de .T. forzará nuestra actualización y sobrescribirá los cambios realizados por el otro usuario, mientras que un valor de .F. no realizará la actualización si otro usuario ha hecho modificaciones al mismo registro.

Es una buena idea usar .F. para este argumento, ya que el sobrescribir los cambios de otros usuarios puede producir resultados no deseados en la tabla. Siempre podemos escribir código de recuperación para un TableUpdate fallido que pueda rectificar las diferencias y luego forzar una actualización (discutiremos este tipo de código el próximo mes).

cAliasTabla/nÁreaTrabajo

Este argumento es usado para determinar qué área de trabajo o alias será afectado por el llamado a la función TableUpdate.  Si se omite este argumento, se afecta el área de trabajo actualmente seleccionada. Se recomienda que siempre se indique el nombre de alias a la función TableUpdate() para prevenir resultados inesperados. En Visual FoxPro es muy fácil encontrarse con un área de trabajo cambiada y mediante el uso de este argumento no quedará ninguna duda sobre que área de trabajo debe ser actualizada.

cMatrizErrores

Este argumento es el nombre de una matriz unidimensional que contendrá los números de registro de aquellos registros que no hayan podido actualizarse cuando se usa como valor del primer argumento 2. Este argumento debería indicarse siempre cuando se usa un valor de 2 para el primer argumento, ya que no hay otra manera de averiguar cuáles son los registros no actualizados.

Cuando el primer argumento es 0 o 1 el puntero de registro en el alias que está siendo actualizado permanece en el registro que no pudo actualizarse. f

Muéstranos algo de código.

Con todas estas opciones en la función, habría varias maneras de utilizarla en nuestro código. Examinemos algunos escenarios.

 Escenario 1 – Actualización de un registro único.

Tenemos un formulario que permite la edición de sólo un registro de cliente y está usando solamente la tabla de clientes (Customer). El código que podríamos tener en el método de grabado de este formulario se muestra en el Listado 2.

LOCAL lcFldState

lcFldState = GetFldState( -1,”Customer”)

IF “2” $ lcFldState OR “4” $ lcFldState

   * Se ha editado un registro existente o bien uno nuevo.

   IF NOT TableUpdate( 0, .F., “Customer” )

      * The update failed

      TableRevert(.F., “Customer”)

   ENDIF

ENDIF

 Listado 2 – Un ejemplo de actualización de un registro único.

 Escenario 2 – Múltiples registros, todos o ninguno.

En esta situación tenemos un formulario para editar clientes que permite al usuario editar varios registros de clientes antes de guardar el trabajo. Deseamos guardar todas las ediciones o no guardar ninguna.

* Se ha editado un registro existente o bien uno nuevo.

BEGIN TRANSACTION

IF NOT TableUpdate( 1, .F., “Customer” )

   * The update failed

   ROLLBACK

   TableRevert(.T., “Customer”)

ELSE

   END TRANSACTION

ENDIF

Listado 3 – Actualizando múltiples registros usando 1 como primer argumento de TableUpdate()

 Escenario 3 – Múltiples registros, haga lo que pueda.

En este ejemplo tenemos la misma situación de edición que en el Escenario 2, pero deseamos guardar todo lo que podamos y revertir únicamente los registros que no puedan ser guardados.

*  Se ha editado un registro existente o bien uno nuevo.

DIMENSION laBadRecs(1)

IF NOT TableUpdate( 2, .F., “Customer”, laBadRecs )

   * The update failed

   FOR EACH nRecord IN laBadRecs

      GOTO nRecord

      TableRevert(.F., “Customer”)

   ENDFOR

ENDIF

Listado 4 – Actualizando múltiples registros usando 2 como el primer argumento de TableUpdate()

En resumen.

La función TableRevert() fue usada en cada uno de los ejemplos. Esta función toma dos argumentos. El primero es  .T. para revertir todos los registros y .F. para revertir sólo el registro actual. El segundo argumento es el alias a ser revertido.

En el segundo escenario, se usó una transacción para englobar toda la actualización en una operación de o todo o nada. Las transacciones serán el tema de otra publicación.

Las mejoras a la función TableUpdate nos dan un control muy fino sobre la forma de trabajar de la operación de actualización. Como usted puede ver en los ejemplos, podemos controlar la actualización de nuestras tablas de forma de lograr el comportamiento exacto que deseamos para cada uno de los formularios que construyamos.

No hay comentarios. :

Publicar un comentario

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.