vivero
USE master
GO
IF EXISTS (SELECT NAME FROM sys.databases
WHERE name = ‘StockArticulos’)
BEGIN
DROP DATABASE StockArticulos END
CREATE DATABASE StockArticulos
GO
USE StockArticulos
GO
CREATE TABLE dbo.Articulos (ID INT PRIMARY KEY, NOMBRE VARCHAR(100),STOCK DECIMAL(18,2))
GO
CREATE TABLE dbo.Movimientos(TRANSACCION INT,FECHA DATEDEFAULT(GETDATE()),ARTICULO_ID INT FOREIGN KEY
REFERENCES DBO.ARTICULOS(ID),CANTIDAD DECIMAL(18,2), TIPO CHAR(1) CHECK (TIPO =’I’ OR TIPO = ‘O’))
GO
– Insertamos registros ala tabla Articulos
INSERT INTO dbo.Articulos(ID,NOMBRE,STOCK) VALUES (1,’Monitores’,0),(2,’CPU’,0),(3,’Mouse’,0)
GO
– Creamos los triggers para tener actualizado los articulos
CREATETRIGGER dbo.MovimientosInsert ON dbo.Movimientos
FOR INSERT
AS
BEGIN
— No retorna el mensaje de cantidad de registros afectados
SET NOCOUNT ON
UPDATE DBO.ARTICULOS
SET STOCK = STOCK +T.PARCIAL
FROM DBO.ARTICULOS A
INNER JOIN
( SELECT ARTICULO_ID,
SUM(CASE WHEN TIPO=’I’ THEN CANTIDAD ELSE -CANTIDAD END)
AS PARCIAL FROM INSERTED
GROUP BY ARTICULO_ID
) T ON
A.ID = T.ARTICULO_ID
END
GO
CREATE TRIGGER dbo.MovimientosDelete ON dbo.Movimientos
FOR DELETE
AS
BEGIN
— No retorna el mensaje de cantidad de registros afectados
SET NOCOUNT ON UPDATE dbo.Articulos
SET STOCK = STOCK – T.PARCIAL
FROM dbo.Articulos A
INNER JOIN
( SELECT ARTICULO_ID,
SUM(CASE WHEN TIPO=’I’ THEN CANTIDAD ELSE -CANTIDAD END) AS PARCIAL FROM DELETED
GROUP BY ARTICULO_ID
) T
ON
A.ID = T.ARTICULO_ID
END
GO
– Probemos el ejercicio
– Mostremos el Stock actual
SELECT A.ID,A.NOMBRE,A.STOCK FROM dbo.Articulos A
–Insertemos un registro para el articulo 1
INSERT INTO dbo.Movimientos (TRANSACCION,ARTICULO_ID,FECHA,CANTIDAD,TIPO)
VALUES (1,1,GETDATE(),100,’I')
– Mostremos el Stock actual para el ID 1...
Regístrate para leer el documento completo.