1. Crear
un trigger que actualice la cantidad de unidades que se tiene en stock [Q_Stock] de la tabla Productos cuando el vendedor modifique el
pedido de un cliente.
Tener
presente que el campo [Q_Stock]
se debe actualizar de
forma correcta para los siguientes casos:
Ø El cliente aumenta la cantidad
unidades compradas
Ø El cliente disminuye la cantidad
unidades compradas
Ø Validar la cantidad de unidades
compradas (Mayor que cero).
Solución:
CREATE TRIGGER TRIGGER_VENTA
ON PRODUCTO
AFTER INSERT
AS
BEGIN
UPDATE PRODUCTO
SET Q_STOCK = Q_STOCK - (SELECT I.Q_CANTIDAD FROM INSERTED I)
WHERE C_PRODUCTO = (SELECT I.C_PRODUCTO FROM INSERTED I)
END
GO
Solución:
CREATE TRIGGER TRIGGER_VENTA
ON PRODUCTO
AFTER INSERT
AS
BEGIN
UPDATE PRODUCTO
SET Q_STOCK = Q_STOCK - (SELECT I.Q_CANTIDAD FROM INSERTED I)
WHERE C_PRODUCTO = (SELECT I.C_PRODUCTO FROM INSERTED I)
END
GO
2. Crear
un trigger que actualice el monto de la venta total [S_VentaTotal] de la tabla Ventas
cuando el vendedor anule o elimine la compra de uno de los productos en venta a
un cliente.
Solución:
CREATE TRIGGER TRIGGER2_VENTA
ON VENTA
AFTER INSERT
AS
BEGIN
UPDATE VENTA
SET S_VENTATOTAL = S_VENTATOTAL + (SELECT I.Q_CANTIDAD*P.S_PRECIO_UNITARIO*(1-I.S_DESCUENTO)
FROM INSERTED I JOIN PRODUCTO P ON (I.C_PRODUCTO = P.C_PRODUCTO))
WHERE C_VENTA = (SELECT I2.C_VENTA FROM INSERTED I2)
END
Solución:
CREATE TRIGGER TRIGGER2_VENTA
ON VENTA
AFTER INSERT
AS
BEGIN
UPDATE VENTA
SET S_VENTATOTAL = S_VENTATOTAL + (SELECT I.Q_CANTIDAD*P.S_PRECIO_UNITARIO*(1-I.S_DESCUENTO)
FROM INSERTED I JOIN PRODUCTO P ON (I.C_PRODUCTO = P.C_PRODUCTO))
WHERE C_VENTA = (SELECT I2.C_VENTA FROM INSERTED I2)
END
Solución:
UPDATE PRODUCTO SET Q_STOCK = Q_STOCK + 3 WHERE C_PRODUCTO = 1
UPDATE PRODUCTO SET Q_STOCK = Q_STOCK + 2 WHERE C_PRODUCTO = 10
UPDATE VENTA SET S_VENTATOTAL = 0.00 WHERE C_VENTA = 1
DELETE VENTA
*Trabajando con la base de datos “Ahorros”:
4. Crear un procedimiento que permita
abrir una cuenta de ahorros para un cliente con un saldo inicial.
Los parámetros del procedimiento son
el código del cliente y monto de apertura.
Considerar
las siguientes especificaciones:
· Las cuentas de ahorro son
secuenciales y se numeran anteponiendo la “C” de cuenta y un correlativo.
Ejemplo C0001, C0002, C0003,...etc.
· Al crear la cuenta su primer
movimiento será el de apertura de cuenta de ahorros.
· El monto de apertura de una cuenta
de ahorros será mayor a 100 nuevos soles.
Solución:
CREATE PROCEDURE ABRIR_CUENTA @CLIENTE VARCHAR(5), @MONTO MONEY
AS
BEGIN TRANSACTION
IF (@MONTO >= 100)
BEGIN
DECLARE @CTA INT
DECLARE @CTA_NUM CHAR(5)
SELECT @CTA = COUNT(*)
FROM CUENTA
SET @CTA_NUM = 'C' + RIGHT( '000' + CAST(@CTA +1 AS VARCHAR(5)),4)
INSERT INTO CUENTA VALUES(@CTA_NUM, @CLIENTE, @MONTO)
INSERT INTO MOVIMIENTO VALUES(@CTA_NUM,1,'10',@MONTO,GETDATE())
END
ELSE
BEGIN
PRINT 'NO ALCANZA EL MONTO MINIMO'
END
COMMIT
CREATE PROCEDURE ABRIR_CUENTA @CLIENTE VARCHAR(5), @MONTO MONEY
AS
BEGIN TRANSACTION
IF (@MONTO >= 100)
BEGIN
DECLARE @CTA INT
DECLARE @CTA_NUM CHAR(5)
SELECT @CTA = COUNT(*)
FROM CUENTA
SET @CTA_NUM = 'C' + RIGHT( '000' + CAST(@CTA +1 AS VARCHAR(5)),4)
INSERT INTO CUENTA VALUES(@CTA_NUM, @CLIENTE, @MONTO)
INSERT INTO MOVIMIENTO VALUES(@CTA_NUM,1,'10',@MONTO,GETDATE())
END
ELSE
BEGIN
PRINT 'NO ALCANZA EL MONTO MINIMO'
END
COMMIT
5. Crear un procedimiento que permita
realizar operaciones de retiro de un determinado monto en nuevos soles o en
dólares de una cuenta de ahorros en soles perteneciente a un cliente.
Los
parámetros del procedimiento serán el tipo de moneda, monto a retirar y el
número de la cuenta de ahorros del cliente.
Considerar las siguientes
especificaciones:
· El monto de retiro o su equivalente
traducido a nuevos soles no deberá ser mayor al saldo de la cuenta.
· Cuando el monto de retiro es en
dólares deberá obtener y aplicar el cambio del día (Venta dólares).
· Por las operaciones de retiro se
cobra una comisión de S/. 0.10
a partir del quinto retiro en un mes, el cual se cumula
en la cuenta “M0002” con sus movimientos de depósito respectivos.
· Se guarda en la cuenta “ITF02” la
aplicación del impuesto a las transacciones financieras correspondiente al 0.8
% del monto retirado en soles.
Solución:
CREATE PROCEDURE RETIRA_MONTO @CUENTA CHAR(5), @MONTO MONEY
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
SELECT @SALDO = C.S_SALDO -- LEER SALDO DE LA CUENTA
FROM CUENTA C
WHERE C.NRO_CUENTA = @CUENTA
IF @MONTO > @SALDO -- VALIDA EL MONTO A RETIRAR
ROLLBACK -- SOLO SI SE REALIZARON CAMBIOS
ELSE
BEGIN
DECLARE @NRO_MOV INT -- CALCULAR EL NRO_MOV SECUENCIAL
SELECT @NRO_MOV = MAX(C_SECUENCIA) + 1
FROM MOVIMIENTO
WHERE NRO_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 NRO_CUENTA = @CUENTA
COMMIT -- ACTUALIZA CAMBIOS
END
CREATE PROCEDURE RETIRA_MONTO @CUENTA CHAR(5), @MONTO MONEY
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
SELECT @SALDO = C.S_SALDO -- LEER SALDO DE LA CUENTA
FROM CUENTA C
WHERE C.NRO_CUENTA = @CUENTA
IF @MONTO > @SALDO -- VALIDA EL MONTO A RETIRAR
ROLLBACK -- SOLO SI SE REALIZARON CAMBIOS
ELSE
BEGIN
DECLARE @NRO_MOV INT -- CALCULAR EL NRO_MOV SECUENCIAL
SELECT @NRO_MOV = MAX(C_SECUENCIA) + 1
FROM MOVIMIENTO
WHERE NRO_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 NRO_CUENTA = @CUENTA
COMMIT -- ACTUALIZA CAMBIOS
END
6. Crear un procedimiento que permita
realizar la transferencia de un monto en nuevos soles de una cuenta de ahorros origen
a otra cuenta de ahorros destino ambas en soles.
Los
parámetros del procedimiento serán el monto a transferir, el número de la
cuenta de ahorros origen y el número de la cuenta de ahorros destino.
Considerar las siguientes
especificaciones:
·
El
monto de transferencia en nuevos soles no deberá ser mayor al saldo de la
cuenta.
·
Por
las operaciones de transferencia se cobra una comisión de S/.5 para montos
menores a S/.1000 y del 0.5% del monto de transferencia a partir de S/. 1000,
el cual se cumula en la cuenta “M0002” con sus movimientos de depósito
respectivos para transferencias entre cuentas de diferentes clientes.
·
Si
la cuenta origen y la cuenta destino pertenecen al mismo cliente no se cobra
ninguna comisión.
·
Se
guarda en la cuenta “ITF02” la aplicación del impuesto a las transacciones
financieras correspondiente al 0.8 % del monto transferido en soles.
Solución:
CREATE PROCEDURE CUENTABASE_CUENTADESTINO @CUENTAB CHAR(5), @CUENTAD CHAR(5),@MONTO MONEY
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
SELECT @SALDO = C.S_SALDO
FROM CUENTA C
WHERE C.NRO_CUENTA = @CUENTAB
IF @MONTO > @SALDO
ROLLBACK
ELSE
BEGIN
DECLARE @NRO_MOV INT
SELECT @NRO_MOV = MAX(C_SECUENCIA) + 1
FROM MOVIMIENTO
WHERE NRO_CUENTA = @CUENTAB
INSERT INTO MOVIMIENTO VALUES(@CUENTAB,@NRO_MOV,'40',@MONTO,GETDATE())
UPDATE CUENTA
SET S_SALDO = S_SALDO - @MONTO
WHERE NRO_CUENTA = @CUENTAB
UPDATE CUENTA
SET S_SALDO = S_SALDO + @MONTO
WHERE NRO_CUENTA = @CUENTAD
COMMIT
END
Solución:
CREATE PROCEDURE CUENTABASE_CUENTADESTINO @CUENTAB CHAR(5), @CUENTAD CHAR(5),@MONTO MONEY
AS
BEGIN TRANSACTION
DECLARE @SALDO MONEY
SELECT @SALDO = C.S_SALDO
FROM CUENTA C
WHERE C.NRO_CUENTA = @CUENTAB
IF @MONTO > @SALDO
ROLLBACK
ELSE
BEGIN
DECLARE @NRO_MOV INT
SELECT @NRO_MOV = MAX(C_SECUENCIA) + 1
FROM MOVIMIENTO
WHERE NRO_CUENTA = @CUENTAB
INSERT INTO MOVIMIENTO VALUES(@CUENTAB,@NRO_MOV,'40',@MONTO,GETDATE())
UPDATE CUENTA
SET S_SALDO = S_SALDO - @MONTO
WHERE NRO_CUENTA = @CUENTAB
UPDATE CUENTA
SET S_SALDO = S_SALDO + @MONTO
WHERE NRO_CUENTA = @CUENTAD
COMMIT
END
*Trabajando con la base de datos “Northwind”:
7.
Listar mediante una función los empleados que han
realizado ventas superiores al promedio durante el año 1997 junto a los
clientes que han realizado compras inferiores al promedio en el mismo año, la
función debe retornar los nombres, ciudad, región, código postal, país, ventas
y compras en una sola tabla.
Modificar la función de tal modo que se aplique lo mismo
pero para cualquier mes y año.
Solución:
CREATE FUNCTION PROMEDIO()
RETURNS TABLE
AS RETURN(SELECT Orders.OrderDate, Employees.FirstName, Employees.LastName, Employees.City, Employees.Region,
Employees.PostalCode, Employees.Country, Customers.CompanyName, Customers.City AS Expr1, Customers.Region AS Expr2,
Customers.PostalCode AS Expr3, Customers.Country AS Expr4
FROM dbo.Employees INNER JOIN
Orders ON Employees.EmployeeID = Orders.EmployeeID INNER JOIN
Customers ON Orders.CustomerID = Customers.CustomerID
WHERE (Orders.OrderDate >= '1997-01-01') AND (Orders.OrderDate <= '1997-12-31'))
CREATE FUNCTION PROMEDIO()
RETURNS TABLE
AS RETURN(SELECT Orders.OrderDate, Employees.FirstName, Employees.LastName, Employees.City, Employees.Region,
Employees.PostalCode, Employees.Country, Customers.CompanyName, Customers.City AS Expr1, Customers.Region AS Expr2,
Customers.PostalCode AS Expr3, Customers.Country AS Expr4
FROM dbo.Employees INNER JOIN
Orders ON Employees.EmployeeID = Orders.EmployeeID INNER JOIN
Customers ON Orders.CustomerID = Customers.CustomerID
WHERE (Orders.OrderDate >= '1997-01-01') AND (Orders.OrderDate <= '1997-12-31'))
8. Escribir un procedimiento que permita insertar,
modificar y eliminar productos considerando la integridad de los datos de
acuerdo a la operación a realizar.
Asumir
los parámetros de entrada/salida necesarios del procedimiento.
Solución:CREATE PROCEDURE GESTION_PRODUCTO @N INT, @CPROD INT, @NPROD NVARCHAR(40), @SUPLIER INT,
@CATEGO INT, @QUANT NVARCHAR(20), @UPRICE MONEY,
@UINSTOCK SMALLINT, @UONORDER SMALLINT, @REORDER SMALLINT,
@DISCON BIT, @STOCK INT
AS
BEGIN
IF @N = 1
INSERT INTO Products
values( @NPROD , @SUPLIER,@CATEGO, @QUANT, @UPRICE ,
@UINSTOCK , @UONORDER , @REORDER , @DISCON)
IF @N = 2
UPDATE Products
SET UnitsInStock = UnitsInStock - @STOCK
WHERE ProductID = @CPROD
IF @N = 3
DELETE FROM Products
WHERE ProductID = @CPROD
END
No hay comentarios:
Publicar un comentario