Vistas de página en total

martes, 28 de junio de 2011

PC3 2010-1 A

PREGUNTA 1
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...