lunes, 25 de junio de 2018

 

Trigger para actualizar inventario en sql server 2018

Muchas veces hacemos la venta  de nuestro productos ,emitiendo comprobantes como boleta o factura  .Pero necesitamos actualizar el stock de nuestros productos .por cada venta que hacemos.
hay muchas maneras de actualizar el stock del productos ,Pero hay una forma de hacerlo con triggers

para este ejemplo utilizamos trigger.

¿ Pero que es triger?
Los Triggers o Disparadores son objetos que se asocian con tablas y se almacenan en la base de datos. Su nombre se deriva por el comportamiento que presentan en su funcionamiento, ya que se ejecutan cuando sucede algún evento sobre las tablas a las que se encuentra asociado. Los eventos que hacen que se ejecute un trigger son las operaciones de inserción (INSERT), borrado (DELETE) o actualización (UPDATE), ya que modifican los datos de una tabla.

La utilidad principal de un trigger es mejorar la administración de la base de datos, ya que no requieren que un usuario los ejecute. Por lo tanto, son empleados para implementar las REGLAS DE NEGOCIO (tipo especial de integridad) de una base de datos. Una Regla de Negocio es cualquier restricción, requerimiento, necesidad o actividad especial que debe ser verificada al momento de intentar agregar, borrar o actualizar la información de una base de datos. Los triggers pueden prevenir errores en los datos, modificar valores de una vista, sincronizar tablas, entre otros.

 Ejemplo de como actualizar el stock de nuestro producto utilizando trigger
 


Cada vez que se efectua


una orden (orders) en el detalle de la orden (order details) se  almacenan los productos pedidos (productid) y su cantidad (quantity), la  cantidad pedida de un producto en eldetalle  de la orden (order details) debe rebajarse de las Unidades en Inventario (UnitInStock  de la tabla products) de los Productos.
La modificación al  inventario se da cada vez que se afecta la tabla detalle de la orden(order details) porque si vendo un producto  tengo que hacer una inserción del  producto que estoy vendiendo y debe rebajar al inventario (UnitsInStock).  Si borro una fila de la tabla detalle de la orden (order details)  porque el cliente ya no quiere ese producto lo esta devolviendo por lo que debe  volver a cargarle las unidades al inventario. Y si el cliente en una orden ya  hecha ya no quiere cinco unidades de un producto si no 10 entonces debo


regresarle al inventario las  5  unidades pedidas anteriormente y luego restarle 10 (a si funciona con los


triggers).
Para que este caso se  pueda resolver con un trigger debemos tener en cuenta que:
      1.  Los triggers se ponen  sobre la tabla detalle de ordenes  (order details) y son varios triggers no solo uno, dicho sea de paso la tabla  puede tener mas de un trigger asociado
      2. Cuando se inserta un dato  en una tabla en SQL Server se crea una tabla temporal con la misma estructura  de la tabla donde estoy insertando que se llama inserted esta tabla temporal tiene el dato que se esta  insertando.  Igual ocurre cuando se elimina un dato, se crea una tabla temporal que se


llama deleted que tiene la misma  estructura de la tabla donde estoy borrando y el o los datos que se están eliminando.


Y cuando ocurre un Update se crean las dos tablas con la misma estructura de  la tabla donde estoy haciendo update, Deleted e Inserted donde deleted tiene  el dato antiguo a modificar e inserted tiene el nuevo dato.
 

3. Cuando se hace un nuevo  pedido y se insertan a la tabla detalle  de ordenes(order details) el producto y las unidades a pedir debemos  tener en cuenta que el trigger se vale de la tabla inserted que se crea con la misma estructura que [order details] para  obtener el producto (productid) y la cantidad (quantity) pedida que debe  debitar de unidades en estock. Y el trigger quedaria de la siguiente forma:
   Create trigger Debitar_Stock
   on [order details]
   for Insert
   as
   Update P set P.UnitsInStock=P.UnitsInStock-D.Quantity
   from products as P inner join
   INSERTED as D on D.ProductID=P.ProductID
       4. Cuando es necesario  eliminar un registro a la tabla detalle  de ordenes(order details) debemos tener en cuenta que el trigger se vale  de la tabladeleted que se crea  con la misma estructura que [order details] para obtener el producto (productid)  y la cantidad (quantity) eliminada que debe regresar a las  unidades en estock. Y el trigger quedaría de
la siguiente forma:
   Create trigger Regresar_Stock
   on [order  details]
   for Delete
   as
   Update P set P.UnitsInStock=P.UnitsInStock+D.Quantity
   from products as P inner join
   DELETED as D on D.ProductID=P.ProductID

      5. Y cuando ocurre un update  se crean las dos tablas Deleted con el dato antiguo a modificarse y Inserted  con el dato nuevo que va a modificar por lo que el trigger debe de regresar a  inventario lo que esta en Deleted y luego volver a debitar lo que esta en  inserted.
   Create trigger Actualizar_Stock
   on [order  details]
   for Updete
   as
   Update P set P.UnitsInStock=P.UnitsInStock+D.Quantity
   from products as P inner join
   DELETED as D on D.ProductID=P.ProductID
    
   Update P set P.UnitsInStock=P.UnitsInStock-D.Quantity
   from products as P inner join
   INSERTED as D on D.ProductID=P.ProductID

 





Share: