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
|
martes, 19 de febrero de 2013
Clásico Trigger para Actualizar Inventario
jueves, 14 de febrero de 2013
Red Ad-Hoc Inalámbrica
lunes, 4 de febrero de 2013
Conteo Condicional en SQL Server
Conteo Condicional en SQL Server
Recientemente he tenido la necesidad de hacer un conteo de datos condicional
en SQL Server, lo que en Excel es un CONTAR.SI, aprovechando la ocasión
decidí documentar con ejemplo la tarea, para futuras oportunidades
Suponiendo contamos con una tabla llamada ProductList, con los datos
que se muestran en la imagen de abajo y
necesitamos contar los productos mayores a 0 de la categoría “Condiments”.
Pues bien antes de realizar el conteo debemos tener en cuenta que la función COUNT() de SQL Server si la usamos como COUNT(*) contara todas las filas, por ejemplo
Y si lo que contamos es un campo de la tabla por ejemplo
COUNT(UNITPRICE), como en el ejemplo UNITPRICE tiene valores nulos en
productos de la categoría “Seafood” estos no los contara.
Ahora como lo que necesitamos es contar los productos mayores que 0
de la categoría “Condiments”, si
volviéramos Nulos los valores en 0 no los contaría, para esto usaremos la
instrucción CASE
Finalmente usamos, nuevamente la función COUNT, pero esta vez
encerrando la función CASE creada.
Fuente de apoyo para la intruccion CASE
|
Suscribirse a:
Entradas (Atom)