Los Triggers o Desencadenantes ‘Antes de’

En este módulo nos vamos a centrar en los triggers o desencadenantes que se ejecutan antes de la actualización de datos en las acciones de inserción y actualización de registros.

30-May-2017

Desencadenantes Antes del cambio

¿Qué son?

Estos desencadenantes están controlados en realidad por una sola Macro de Datos llamada ‘Antes del cambio’.

La manera de distinguir si el desencadenante que se está ejecutado es por una inserción o por una actualización es realizando una pregunta a través del indicador booleano [EsInsertar] que valdrá true si se trata de una inserción o false si se trata de una actualización.

Una vez que sabemos el tipo de desencadenante que se está ejecutando, se realizan las comprobaciones necesarias para permitir los cambios o para cancelar la acción si no se cumplen las condiciones establecidas.

 

Diagrama funcionamiento de la Macro de Datos "Antes del cambio"

Control Stock (Aprender con un ejemplo)

Continuando con el ejemplo que vimos en la primera entrega de los desencadenantes, ahora vamos a aprovechar la macro de datos ‘Antes del cambio’ para comprobar si hay suficientes existencias del artículo para realizar la venta.

Si a la hora de guardar los cambios de la línea de ventas no hay suficientes existencias del artículo para satisfacer la cantidad indicada en la línea de venta, mostraremos un mensaje de error para avisar de la situación y cancelaremos la operación.

Desencadenantes utilizados

Macro Antes del Cambio
  • Antes de insertar una nueva línea de venta y Antes de actualizar una línea de venta
    • Utilizando la Macro de Datos: Antes del cambio

Lógica de datos

  • Antes de insertar una nueva línea de venta:
    1. Buscaremos en la tabla de artículos el artículo introducido en la nueva línea de venta.
    2. Comprobaremos si el stock disponible es suficiente para satisfacer la cantidad de artículos que se van a vender.
    3. En el caso de no haber suficientes existencias cancelaremos la acción de insertar registro.
  • Antes de actualizar una venta ya existente:
    1. Buscaremos en la tabla de artículos el artículo que aparece en la línea de venta.
    2. Sólo en el caso de que el campo Cantidad haya sido actualizado, comprobaremos si el stock disponible es suficiente para satisfacer la cantidad de artículos que se van a modificar en el caso de que indique una cantidad superior a la anterior.
    3. En el caso de no haber suficientes existencias cancelaremos la acción de actualizar registro.

Macros necesarias

Macros utilizadas para el desencadenante "Antes de…"

La Macro de Datos ‘Antes del cambio

La macro de datos ‘Antes del cambio’ tomará el ID del artículo y los valores anterior y nuevo del campo cantidad de la línea de venta para realizar la comprobación del stock actual del artículo.

Pasos

  1. Creará una variable local para almacenar el ID del Artículo.
  2. Buscará el Stock actual del artículo.
  3. Comprobará la naturaleza del evento consultando el indicador [EsInsertar]
  4. Si estamos en un evento de insertar, comprobará si el Stock es mayor o igual a la cantidad solicitada. En el caso de no ser así cancelará el evento.
  5. Si estamos en un evento de actualizar y sólo en el caso de que se haya actualizado el campo Cantidad, comprobará si la diferencia entre la cantidad actual y la anterior no supera el Stock actual del artículo. En el caso de ser así cancelará el evento.

Diseño

En la ficha DISEÑO de las HERRAMIENTAS DE TABLA, desplegaremos las opciones ‘Crear macros de datos’ y seleccionaremos ‘Antes del cambiopara la macro que deseemos crear.

Crear Macro de Datos "Antes del cambio"
  1. 1. Se nos abrirá la ventana de diseño de macros donde seleccionaremos la acción ‘EstablecerVariableLocal’ de la lista desplegable.
  • En la propiedad Nombre introduciremos el nombre de la variable: Articulo
  • En la propiedad Expresión introduciremos la expresión: [IDArticulo]
Establecer Variable Local

De esta manera tendremos almacenado la ID del artículo que se muestra en la línea de venta, necesaria para realizar el siguiente paso de buscar el Stock actual del artículo.

  1. 2. Para buscar el artículo del que deseamos conocer su Stock, desplegaremos el cuadro combinado ‘Agregar nueva acción’ y seleccionaremos ‘BuscarRegistro’.
  • En la propiedad Buscar un registro en introduciremos el nombre de la tabla Articulos
  • En la propiedad Condición WHERE introduciremos la expresión: [Articulos].[ID]=[Articulo]

Para localizar el artículo cuyo ID coincida con el valor de la variable local Articulo creada en el paso anterior.

Acción Buscar Registro
  1. 3. Una vez localizado el registro, seleccionaremos la acción ‘EstablecerVariableLocal del cuadro combinado de acciones que se muestra dentro del bloque ‘Buscar un registro en’.
  • En la propiedad Nombre introduciremos el nombre de la variable: StockArticulo
  • En la propiedad Expresión introduciremos la expresión: [Articulos].[Stock]
Establecer Variable Local con resultado de la búsqueda

Es el momento de comprobar que evento es el que se está ejecutando, insertando una condicional ‘If else’ que pregunte por el valor del indicador [EsInsertar].

  1. 4. Seleccionaremos la acción ‘Si’ de la lista de acciones y nada más insertarla aprovecharemos para añadir la parte correspondiente al else de la condicional pulsando la opción ‘Agregar Si no’ que se muestra en la parte inferior derecha de la acción.
  • En la propiedad Expresión condicional introduciremos el nombre del indicador: [EsInsertar]
Sentencia condicional para comprobar el tipo de evento que se ejecuta

Dentro del bloque de la condicional Si, agregaremos una nueva condicional que comprueba que hay suficientes existencias para realizar la nueva venta.

  1. 5. Seleccionaremos de nuevo la acción Si.
  • En la propiedad Expresión condicional introduciremos la expresión:
    [StockArticulo]<[Cantidad]
Condicional para comprobar si hay suficientes existencias

Si se cumple la expresión condicional, mostraremos un mensaje de aviso y cancelaremos el evento de inserción.

  1. 6. Seleccionamos la acción ‘ProvocarError’ que nos permitirá generar un error que muestra un mensaje al usuario.
  • En la propiedad Número de error introduciremos un número que identifique el error, que en nuestro caso nos lo vamos a inventar: 112233
  • En la propiedad Descripción del error introduciremos el texto del mensaje que deseamos mostrar al usuario: Imposible satisfacer las unidades indicadas del artículo
Acción ProvocarError que muestra mensaje al usuario
  1. 7. A continuación cancelaremos el evento seleccionando la acción ‘DetenerMacro’ de la lista de acciones disponibles.
Acción DeterMacro que nos permite cancelar el evento

Ahora que ya hemos diseñado el bloque de acciones para el evento de inserción, vamos a diseñar las necesarias para el evento de actualización utilizando para ello el bloque Si no de la primera condicional.

Añadimos una condicional que compruebe si se ha actualizado el valor del campo Cantidad de la línea de venta.

  1. 8. Seleccionaremos de nuevo la acción Si.
  • En la propiedad Expresión condicional introduciremos la expresión:
    Actualizado(“Cantidad”)
Comprobar si el campo Cantidad ha sido modificado

En caso afirmativo, es decir; realmente el campo Cantidad ha sido modificado, insertaremos una nueva condicional que compruebe si la diferencia entre las nuevas unidades y las antiguas superan el Stock actual del artículo.

  1. 9. Insertaremos de nuevo la acción Si
  • En la propiedad Expresión condicional introduciremos la expresión:
    ([Cantidad]-[Antiguo].[Cantidad]) > [StockArticulo]
Comprobar si la diferencia entre las nuevas unidades y las antiguas superan el Stock actual del artículo.

Si se cumple la expresión condicional, mostraremos un mensaje de aviso y cancelaremos el evento de actualización.

  1. 10. Seleccionamos la acción ‘ProvocarError’ que nos permitirá generar un error que muestra un mensaje al usuario.
  • En la propiedad Número de error introduciremos un número que identifique el error, que en nuestro caso nos lo vamos a inventar: 112233
  • En la propiedad Descripción del error introduciremos el texto del mensaje que deseamos mostrar al usuario: Imposible satisfacer las unidades indicadas del artículo
Acción ProvocarError que muestra mensaje al usuario
  1. 11. Por último sólo nos queda cancelar el evento seleccionando la acción ‘DetenerMacro’ de la lista de acciones disponibles.
Acción DeterMacro que nos permite cancelar el evento

Con esta última acción podremos dar por finalizada la macro de datos ‘Antes del cambio’ que nos permita cancelar la inserción o la actualización si no disponemos de suficientes existencias para satisfacer la venta.

Macro de Datos "Antes del cambio" completa

Video Demostrativo