Clásico Trigger para actualizar inventario
| 
 Clásico Trigger para actualizar inventario  
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 el detalle 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 tabla deleted 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 
 Link de Apoyo : http://www.youtube.com/watch?v=2FiUK8NWuXs 
 | 



Pingback: Clásico Trigger de Actualización de Inventario | MVPs de LATAM
GRANDE MAESTRO, MAS CLARO QUE EL AGUA
Excelente. Amigo muchas gracias
mire ud profesor yo tengo mi base datos en tablas y las funciones para insertar modificar y eliminar ventas los hago con procedimientos almacenados…bien cuando ejecuto la funcion trigger para descontar el stock simplemente me bloquea al realizar una venta y me dice que la funcion insertar_detalle_ventas no es valido…mi consulta es como podria hacer para que no me salga ese error a al espera de su atencion y de antemano gracias
Perdón por tardarme en contestar, el asunto es que el trigger esta mal planteado, hay que revisarlo, porque es este el que esta ocasionando el problema.
EXCELENTE!!
Muchas gracias
Excelente, me sirvió mucho, sin embargo, he estado investigando sin éxito la manera de actualizar varios items a la vez.
Este ejemplo ya actualiza varios items a la vez por esto es que se relaciona con las tablas inserted y deleted y no se usan variables en el proceso.
Excelente, se agradece.
Buenas noches a todos y todas una pregunta las tablas temporales han d estar creadas previamente o se crean cada vez y como en este caso? Muchas gracias
Las tablas temporales inserted, deleted se crean solo cuando ocurre la acción de de delete, insert, o update en una tabla. Y el trigger puede disponer de estas tablas. No existen previamente y no se pueden buscar a menos que ocurra la acción.
hola! Excelente trabajo, pero ahora que se trabaja en code first y realizando estas operaciones desde el lenguaje como harias este procedimiento si lo tuvieras en la Business Layer??