SOLUCION
CREATE TRIGGER tr_actStock ON VENTA_DETALLE
FOR UPDATE
AS
DECLARE @CANT INT
DECLARE @AUX INT
DECLARE @PROD INT
begin
if update(Q_CANTIDAD)
BEGIN
SELECT @AUX = Q_CANTIDAD FROM inserted
select @PROD = C_PRODUCTO FROM INSERTED
SELECT @CANT = Q_CANTIDAD FROM deleted
IF (@CANT - @AUX) != 0
BEGIN
UPDATE PRODUCTO
SET Q_STOCK = Q_STOCK + @CANT - @AUX
WHERE C_PRODUCTO = @PROD
END
END
end
-- Para probar nuestro trigger actualizamos el detalle del pedido del producto 1, lo actualizamo de 5 a 10, es decir se disminuira la cant de stock de productos en 5 desde 97.
UPDATE VENTA_DETALLE
SET Q_CANTIDAD = 10
WHERE C_PRODUCTO = 1
SELECT * FROM PRODUCTO
SELECT * FROM VENTA_DETALLE
PREGUNTA 2
SOLUCION
CREATE TRIGGER TR_ACT_VENTOT ON VENTA_DETALLE
FOR DELETE
AS
DECLARE @cant_prod int;
DECLARE @prec_unit money;
BEGIN
SELECT @cant_prod = Q_CANTIDAD FROM DELETED
SELECT @prec_unit = S_PRECIO_UNITARIO FROM PRODUCTO
WHERE C_PRODUCTO = (SELECT C_PRODUCTO FROM DELETED)
update VENTA
SET S_VENTA_TOTAL = S_VENTA_TOTAL - @cant_prod*@prec_unit
WHERE C_VENTA = (SELECT C_VENTA FROM DELETED)
END
-- probamos el trigger para un delete
DELETE FROM VENTA_DETALLE WHERE C_PRODUCTO = 10 AND C_VENTA=2
SELECT * FROM VENTA_DETALLE
SELECT * FROM VENTA
PREGUNTA 3
alter trigger tr_actStock on VENTA_DETALLE
for update
as
DECLARE @CANT INT
DECLARE @AUX INT
DECLARE @PROD INT
begin
if update(Q_CANTIDAD)
BEGIN
SELECT @AUX = Q_CANTIDAD FROM inserted
select @PROD = C_PRODUCTO FROM INSERTED
SELECT @CANT = Q_CANTIDAD FROM deleted
IF (@CANT - @AUX) != 0
BEGIN
UPDATE PRODUCTO
SET Q_STOCK = Q_STOCK + @CANT - @AUX
WHERE C_PRODUCTO = @PROD
END
END
end
UPDATE VENTA_DETALLE
SET Q_CANTIDAD = 10
WHERE C_PRODUCTO = 1
SELECT * FROM PRODUCTO
SELECT * FROM VENTA_DETALLE
ALTER TRIGGER TR_ACT_VENTOT ON VENTA_DETALLE
FOR DELETE
AS
DECLARE @cant_prod int;
DECLARE @prec_unit money;
BEGIN
SELECT @cant_prod = Q_CANTIDAD FROM DELETED
SELECT @prec_unit = S_PRECIO_UNITARIO FROM PRODUCTO
WHERE C_PRODUCTO = (SELECT C_PRODUCTO FROM DELETED)
update VENTA
SET S_VENTA_TOTAL = S_VENTA_TOTAL - @cant_prod*@prec_unit
WHERE C_VENTA = (SELECT C_VENTA FROM DELETED)
END
DELETE FROM VENTA_DETALLE WHERE C_PRODUCTO = 10 AND C_VENTA=2
UPDATE VENTA SET S_VENTA_TOTAL = 1000 WHERE C_VENTA = 2
SELECT * FROM VENTA_DETALLE
SELECT * FROM VENTA
--3. Crear un trigger que actualice la cantidad de unidades que se tiene en stock
--[Q_Stock] de la tabla Productos cuando el vendedor anule o elimine la compra
--de uno de los productos en venta a un cliente.
create trigger Actualiza_stock on VENTA_DETALLE
for delete
as
declare @cantidad int;
begin
select @cantidad = Q_Cantidad from Deleted
where C_Producto = (select C_Producto from Deleted)
update PRODUCTO
SET Q_STOCK = Q_STOCK + @cantidad
where C_PRODUCTO = (Select C_PRODUCTO from Deleted)
end
Select * from Venta_Detalle
Select * from PRODUCTO
DElete from VENTA_DETALLE where C_PRODUCTO = 12
PREGUNTA 4
ALTER PROCEDURE SP_Crea_cuenta @C_Client char(5), @Monto money
AS
BEGIN TRANSACTION
DECLARE @CTA CHAR(5)
DECLARE @CONT INT
SET @CTA = NULL
SELECT @CTA = MAX(C_CUENTA)
FROM CUENTA
IF @CTA = NULL
BEGIN
SET @CTA = 'C0001'
INSERT INTO CUENTA VALUES(@CTA, @C_Client, @Monto)
INSERT INTO MOVIMIENTO VALUES(@CTA,1,'10',@Monto,GETDATE())
END
ELSE
BEGIN
SET @CONT = CONVERT(INT,RIGHT(@CTA,4))
SET @CONT = @CONT+ 1
SET @CTA = 'C' + RIGHT('0000' + CONVERT(VARCHAR,@CONT),4)
INSERT INTO CUENTA VALUES(@CTA, @C_Client, @Monto)
INSERT INTO MOVIMIENTO VALUES(@CTA,1,'10',@Monto,GETDATE())
END
COMMIT
PREGUNTA 5
Retiro y deposito de un monto definido a una cuenta...
CREATE PROCEDURE DEPOSITA_MONTO @CUENTA CHAR(5), @MONTO MONEY
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
-- LEER SALDO DE LA CUENTA
SELECT @SALDO = C.S_SALDO
FROM CUENTA C
WHERE C.C_CUENTA = @CUENTA
DECLARE @NRO_MOV INT
-- CALCULAR EL NRO_MOV SECUENCIAL
SELECT @NRO_MOV = MAX(C_MOV) + 1
FROM MOVIMIENTO
WHERE C_CUENTA = @CUENTA
-- INSERTA EL NUEVO MOVIMIENTO
INSERT INTO MOVIMIENTO VALUES(@CUENTA,@NRO_MOV,'20',@MONTO,GETDATE())
-- ACTUALIZA EL SALDO
UPDATE CUENTA
SET S_SALDO = S_SALDO + @MONTO
WHERE C_CUENTA = @CUENTA
COMMIT -- ACTUALIZA CAMBIOS "LA BD DEBE SER CONSISTENTE"
-------------------------------------------------------------------------------------------------------
-- USE AHORROS
CREATE PROCEDURE RETIRA_MONTO @CUENTA CHAR(5), @MONTO MONEY
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
-- LEER SALDO DE LA CUENTA
SELECT @SALDO = C.S_SALDO
FROM CUENTA C
WHERE C.C_CUENTA = @CUENTA
-- VALIDA EL MONTO A RETIRAR
IF @MONTO > @SALDO
ROLLBACK -- SOLO SI SE REALIZARON CAMBIOS
ELSE
BEGIN
DECLARE @NRO_MOV INT
-- CALCULAR EL NRO_MOV SECUENCIAL
SELECT @NRO_MOV = MAX(C_MOV) + 1
FROM MOVIMIENTO
WHERE C_CUENTA = @CUENTA
-- INSERTA EL NUEVO MOVIMIENTO
INSERT INTO MOVIMIENTO VALUES(@CUENTA,@NRO_MOV,'30',@MONTO,GETDATE())
-- ACTUALIZA EL SALDO
UPDATE CUENTA
SET S_SALDO = S_SALDO - @MONTO
WHERE C_CUENTA = @CUENTA
COMMIT -- ACTUALIZA CAMBIOS "LA BD DEBE SER CONSISTENTE"
END
PREGUNTA 6
SOLUCIÓN
Para esta pregunta creamos los procedimientos almacenados adicionales DEPOSITA_MONTO y
RETIRA_MONTO
CREATE PROCEDURE SP_TRANSF_FIN @monto money, @cuenta_orig char(5),@cuenta_dest char(5)
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
DECLARE @MONTO_TOTAL MONEY
-- LEER SALDO DE LA CUENTA
SELECT @SALDO = C.S_SALDO
FROM CUENTA C
WHERE C.C_CUENTA = @cuenta_orig
-- CALCULO DE COMISIONES
DECLARE @ITF MONEY
DECLARE @COMISION MONEY
SET @ITF = @monto*0.008
SET @COMISION = 0
IF @cuenta_dest != @cuenta_orig
BEGIN
--CALCULAMOS LA COMISION
IF(@monto<1000)
BEGIN
SET @COMISION = 5
END
ELSE SET @COMISION = @monto*0.05
END
SET @MONTO_TOTAL = @monto + @ITF + @COMISION
IF @SALDO < @MONTO_TOTAL
ROLLBACK
ELSE
BEGIN TRANSACTION
EXEC RETIRA_MONTO @cuenta_orig , @MONTO_TOTAL
EXEC DEPOSITA_MONTO @cuenta_dest, @MONTO_TOTAL
EXEC DEPOSITA_MONTO 'ITF02',@ITF
EXEC DEPOSITA_MONTO 'M0002',@COMISION
COMMIT
COMMIT
EXEC SP_TRANSF_FIN 500,'C0001','C0002'
SELECT * FROM CUENTA
SELECT * FROM MOVIMIENTO
-- Aqui vemos los resultados la cuenta C0001 estaba inicialmente con un sado de 1000 y la cuenta C0002 estaba 0 soles...