Ayuda ejercicios unidad 9: Programación en TRANSACT SQL (III)


8. Hacer que no se pueda insertar un pedido si no hay suficiente stock.


  PRINT 'Empieza el ejercicio 8'

  USE Gestion10

  IF OBJECT_ID('ControlStock','P') IS NOT NULL DROP PROC ControlStock

  GO

  CREATE TRIGGER  ControlStock

  ON pedidos INSTEAD  OF INSERT -- Tenemos que comprobar el stock antes de que se realice  la inserción

  AS

  BEGIN

        INSERT INTO Pedidos (numpedido,fechapedido,rep,clie,fab,producto,cant,importe)

              SELECT      numpedido,fechapedido,rep,clie,fab,producto,cant,importe   

              FROM Productos  INNER JOIN Inserted  ON idfab=fab AND idproducto=producto

              WHERE existencias-cant  >= 0

              -- Si existencias-cant < 0 es que no hay suficiente  stock, por lo que no se insertará el pedido.

  END;

  GO

  SELECT 'Antes',* FROM productos WHERE idfab='bic' AND idproducto=41003; -- Para comprobar las existencias del producto

  INSERT INTO  Pedidos (numpedido,fechapedido,rep,fab,producto,clie,cant,importe) 

                    VALUES (010101123,GETDATE(),108,'bic',41003,2103,10,1000);

        -- Intentamos insertar un pedido de 10 unidades del  producto en cuestion (no hay suficiente stock).

        SELECT 'Después  INSERT',* FROM  productos WHERE idfab='bic' AND idproducto=41003;

        -- Comprobamos que el campo  existencia no se ha reducido   

        SELECT 'Después INSERT',* FROM pedidos WHERE numpedido=010101123;

        -- Comprobamos que el pedido no se ha introducido    

  INSERT INTO  Pedidos (numpedido,fechapedido,rep,fab,producto,clie,cant,importe) 

                    VALUES (010101123,GETDATE(),108,'bic',41003,2103,2,1000);

        -- Intentamos insertar un pedido de 2 unidades del producto  en cuestion (hay suficiente stock).

        SELECT 'Después  INSERT',* FROM  productos WHERE idfab='bic' AND idproducto=41003;

        -- Comprobamos que el campo  existencia se ha reducidoen 2 unidades (por el otro trigger)

        SELECT 'Después INSERT',* FROM pedidos WHERE numpedido=010101123;

        -- Comprobamos que el pedido ahora sí se ha introducido

9. Crea un procedimiento que impida eliminar varias oficinas en una sóla operación DELETE.


  PRINT 'Empieza el ejercicio 9'

  USE Gestion10

  IF OBJECT_ID('Borrarvarias','P') IS NOT NULL DROP PROC Borrarvarias

  GO

  CREATE TRIGGER Borrarvarias

  ON Oficinas INSTEAD OF  DELETE 

  AS

  BEGIN

        IF (SELECT COUNT(*) FROM Deleted)  = 1

              DELETE  Oficinas WHERE oficina IN  (SELECT oficina  FROM Deleted)

        ELSE

              PRINT 'ERROR, no  se pueden eliminar varias oficinas a la vez'

  END;

  GO

  DELETE Oficinas WHERE  oficina IN (31,32)  -- intentamos  eliminar 2 oficinas

  SELECT 'Después  DELETE',* FROM  Oficinas;

        -- Comprobamos que las oficinas siguen en la tabla   

  DELETE Oficinas WHERE  oficina = 31   -- intentamos eliminar 1 oficina

  SELECT 'Después  DELETE',* FROM  Oficinas;

      -- Comprobamos que la oficina ya no está

Atrás  Inicio    





Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies


© aulaClic. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.