miércoles, 16 de noviembre de 2011

PC3 - Parte A

*Trabajando con la base de datos “Ventas”:

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 




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


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.


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


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



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
      
*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'))



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