Prueba Velneo Gratis

Te ofrecemos todo el poder de Velneo durante 1 mes para desarrollar la aplicación que tu empresa necesita.

Saber más
Thank you! Check your email for confirmation.

¿Cuándo se disparan las actualizaciones?

La definición de actualización que encontramos en la ayuda dice:

"Una actualización es un subobjeto de tabla que permite actualizar el valor de los campos de un registro de una tabla enlazada cada vez que se produce un alta, una modificación o una baja en la tabla origen en la que definimos las actualizaciones."

La cuestión que se plantea en este artículo es ¿Cuándo se ejecutan las actualizaciones en la tabla enlazada? Ya que cuando se declara una actualización no se ejecuta siempre que se produce un alta, baja o modificación en la tabla. La respuesta es que una actualización se ejecuta siempre que cambie alguno de los campos utilizados en las siguientes propiedades:

  • Caso A: Campo enlazado a la tabla en la que se produce la actualización.
  • Caso B: Campos utilizados en la condición del componente de actualización.
  • Caso C: Campos utilizados en la propiedad valor a actualizar.

Ejemplos

Ahora voy a poner un ejemplo de cada caso:

  • Ejemplo caso A. Si el campo enlazado donde se produce la actualización cambia de valor, entonces se lanza la actualización.
  • Ejemplo caso B: Si existe una condición que debe cumplirse para que se ejecute el componente de actualización, cualquier cambio de valor en alguno de los campos que intervengan en la fórmula producirá la evaluación de la condición y que se dispare la actualización.
  • Ejemplo caso C: Si en la fórmula del valor a actualizar, tanto por acumulación como por valor absoluto, se usan campos y alguno de ellos cambia de valor, el componente de actualización se dispara.

Como vemos hay una relación directa entre las variaciones de los valores de los campos que intervienen en estas tres propiedades. Por lo tanto, conociendo su funcionamiento podemos utilizar una astucia (recuerdos para Figueroa padrino de las astucias en Velneo) para forzar la ejecución de los componentes de actualización y usarlas en lugar de tener que crear tres eventos de tabla.

Supuesto

Supongamos que un campo de la tabla de artículos se calcula en base al valor que devuelve una función, lo que hace internamente esta función no tiene importancia en esta explicación. Supongamos que queremos que cada vez que se produce un alta, modificación o baja en la tabla histórica de referencias de un artículo se ejecute esta función y que se actualice el valor de un campo en la tabla de artículos. Podríamos plantear 3 posibles soluciones:

Soluciones

Solución A

  • Crear 3 eventos de tabla (interno o posterior a alta, baja y modificación).
  • En cada evento de tabla verificar si ha cambiado, por ejemplo, el campo referencia #REF. En caso afirmativo, se deberá cargar el registro del maestro para su modificación y ejecutar, por ejemplo, la función ART_ACT_REF(#ART) a la que le pasaremos el valor del campo artículo como parámetro. En caso de alta y baja se debería actualizar sobre el valor del campo artículo, sin embargo, en el caso de la baja habría que verificar si ha cambiado el artículo para lanzar el cálculo tanto para el artículo antigüo como para el nuevo, por lo que el código del evento de tabla se complica.

El handicap de esta solución es que hay que crear 3 eventos, además para no repetir código podría ser conveniente crear una función y lo más complicado es que en el evento de la modificación habría que controlar manualmente el cambio de artículo para deshacer con el viejo y rehacer con el nuevo.

Solución B

  • Crear una actualización a la tabla artículos desde la tabla referencias.
  • No ponemos nada en la condición para modificar del componente.
  • En la propiedad fórmula, llamamos a la función ART_ACT_REF_DSC(#ART, #REF), como vemos pasándole 2 parámetros. En realidad el parámetro #REF no se usa en la función, pero al estar presentes en la fórmula forzamos a que se evalúe y si cambia el valor de ese campo se fuerza la ejecución del componente de actualización.

El handicap de esta opción es que obliga a crear parámetros adicionales en la función cuando realmente no son necesarios.

Solución C (variación alternativa a la solución B)

  • Crear una actualización a la tabla artículos desde la tabla referencias.
  • En la condición para modificar del componente ponemos #REF=#REF. Como se puede observar la condición se cumple siempre por lo que no afecta a la ejecución de la actualización, la ventaja es que con esa fórmula estamos forzando que la actualización se ejecute si cambia la referencia del registro histórico del artículo.
  • En la propiedad fórmula, valor a ejecutar ejecutamos la función ART_ACT_REF_DSC(#ART) pasándole el artículo.

Esta es la opción que a priori deja el código de nuestra aplicación más sencillo de interpretar. Sería conveniente que en la propiedad comentario se podría especificar el motivo de incluir esa condición para modificar en el componente.Con esta simple astucia nos ahorramos la creación de 3 eventos de tabla y el control manual del cambio del artículo lo que facilita en gran medida la programación además de convertirse en una alternativa de ejecución más óptima.

Jesús Arboleya
23/10/2011
Regístrate ahora y nuestro equipo se pondrá en contacto muy pronto