You are on page 1of 5

/*Crear un SP en Pubs, que, al entregarle el codigo de un Autor, presente los

apellidos y nombres del autor, la Ciudad de prodecedencia, la cantidad de libros


vendidos y el monto vendido correspondiente a dicho autor */
USE pubs
GO
SELECT
A.au_id,
A.au_lname,
A.au_fname,
A.city,
SUM(S.qty),
SUM(S.qty * T.price)
FROM AUTHORS A
INNER JOIN TITLEAUTHOR TA ON A.au_id=TA.au_id
INNER JOIN TITLES T ON TA.title_id=T.title_id
INNER JOIN SALES S ON T.title_id=S.title_id
GROUP BY A.au_id, A.au_lname, A.au_fname, A.city
HAVING A.au_id = '238-95-7766'
GO
-- 238-95-7766 Carson Cheryl Berkeley 30 688.50
-- Convirtiendo a SP
CREATE PROCEDURE SPU_VENTASAUTOR
@cod VARCHAR(11),
@ape VARCHAR(40) OUTPUT,
@nom VARCHAR(20) OUTPUT,
@ciudad VARCHAR(20) OUTPUT,
@can INT OUTPUT,
@monto MONEY OUTPUT
AS
SELECT
@cod = A.au_id,
@ape = A.AU_LNAME,
@nom = A.AU_FNAME,
@ciudad = A.CITY,
@can = SUM(S.QTY),
@monto = SUM(S.QTY*T.PRICE)
FROM AUTHORS A
INNER JOIN TITLEAUTHOR TA ON A.au_id=TA.au_id
INNER JOIN TITLES T ON TA.title_id=T.title_id
INNER JOIN SALES S ON T.title_id=S.title_id
GROUP BY A.au_id, A.au_lname, A.au_fname, A.city
HAVING A.au_id = @cod
GO

-- probando con datyos de prueba 238-95-776 Carson Cheryl Berkeley 30

DECLARE
@a VARCHAR(40),
@N VARCHAR(20),
@cD VARCHAR(20),
@cT INT,
@m MONEY
EXEC SPU_VENTASAUTOR
'238-95-7766'
@a OUTPUT,
@N OUTPUT,
@cD OUTPUT,
@cT OUTPUT,
@m OUTPUT
SELECT
@a AS APELLIDOS,
@N AS NOMBRES,
@cD AS CIUDAD,
@cT AS CANTIDAD,
@m AS MONTO
GO

-- PRESENTAR EL TOTAL DE VENTAS DE UN PRODUCTO, EN UN INTERVALO DE FECHAS


DETERMINADO
-- MOSTRAR TAMBIEN EL NOMBRE DEL PRODUCTO

USE Northwind
GO

SELECT *
FROM Orders O
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID =
P.ProductID
GO
SELECT
OD.ProductID,
P.ProductName,
ROUND(SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)), 2)
FROM Orders O
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID =
P.ProductID
GROUP BY OD.ProductID, P.ProductName
GO
SELECT OD.ProductID, P.ProductName,
ROUND(SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)),2)
FROM Orders O
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID =
P.ProductID
GROUP BY OD.ProductID, P.ProductName
HAVING OD.ProductID = 3
GO
SELECT OD.ProductID, P.ProductName,
ROUND(SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)),2)
FROM Orders O
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID =
P.ProductID
WHERE O.OrderDate BETWEEN '19970101' AND '19970331'
GROUP BY OD.ProductID, P.ProductName
HAVING OD.ProductID = 3
GO

-- Entradas: 3 '19970101' '19970331' -- Salidas: Aniseed Syrup


544
-- CONVIRTIENDO LA CONSULTA EN SP:

CREATE PROCEDURE spu_ventProFe


@cp INT, @fi DATETIME, @ff DATETIME,
@np NVARCHAR(40) OUTPUT, @MV MONEY OUTPUT
AS
SELECT
@cp = OD.ProductID,
@np = P.ProductName,
@MV = ROUND(SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount)),2)
FROM Orders O
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
INNER JOIN Products P ON OD.ProductID =
P.ProductID
WHERE O.OrderDate BETWEEN @fi AND @ff
GROUP BY OD.ProductID, P.ProductName
HAVING OD.ProductID = @cp
GO
-- PROBANDO EL SP:
DECLARE @M MONEY, @N NVARCHAR(40)
EXEC spu_ventProFe 3,'19970101','19970331',@N OUTPUT, @M OUTPUT
SELECT @N, @M
GO
/* Tarea: Crear un sp con varios parametros de entrada y salida
en las cuatro bd de prueba que tenemos de prueba */
--

-- -- eductec
-- escriba el script necesario para probar el sp
-- los valores de retorno son :+
-- 0 ok
-- 1 valor nulo
-- 2 curso no programado
-- 3 alumno no registrado
-- 4 no hay vacantes para el curso
-- 5 el curso ya no esta activo
-- 6 error de bd

use EduTec
go
CREATE PROCEDURE spu_MatriculaAlumno
@cursoprog INT,
@idalumno CHAR(5),
@fecmatricula DATETIME
AS
DECLARE @vacantes TINYINT
DECLARE @activo BIT
IF (@cursoprog IS NULL) OR
(@idalumno IS NULL) OR
(@fecmatricula IS NULL)
BEGIN
PRINT 'VALOR NULO'
RETURN 1
END
IF NOT EXISTS(SELECT idcursoprog FROM cursoprogramado
WHERE idcursoprog = @cursoprog)
BEGIN
PRINT 'ESTE CURSO NO ESTA PROGRAMADO'
RETURN 2
END
IF NOT EXISTS(SELECT apealumno + ', ' + nomalumno FROM alumno
WHERE IDALUMNO = @idalumno)
BEGIN
PRINT 'EL ALUMNO NO ESTA REGISTRADO'
RETURN 3
END
SELECT @vacantes = vacantes, @activo = activo FROM cursoprogramado
WHERE idcursoprog = @cursoprog
IF @vacantes = 0
BEGIN
PRINT 'YA NO HAY VACANTES PARA ESTE CURSO'
RETURN 4
END
IF @activo = 0
BEGIN
PRINT 'EL CURSO YA NO ESTA ACTIVO'
RETURN 5
END
BEGIN TRAN
UPDATE CursoProgramado
SET vacantes = vacantes -1, matriculados = matriculados + 1
WHERE idcursoprog = @cursoprog
INSERT INTO matricula (idcursoprog,idalumno,fecmatricula)
VALUES (@cursoprog,@idalumno,@fecmatricula)
IF @@ERROR <> 0
BEGIN
PRINT ' ERROR EN LA BD'
ROLLBACK TRAN
RETURN 6
END
COMMIT TRAN
RETURN 0
GO

-- PRUEBA DEL SP
-- CONDICIONES INICIALES

SELECT * FROM Matricula WHERE IdAlumno = 'A0010'


SELECT * FROM CursoProgramado WHERE IdCursoProg = 9
SELECT * FROM Matricula WHERE IdCursoProg = 9
GO
DECLARE @RET INT
EXEC @RET = spu_MatriculaAlumno 9, 'A0010','20200307'
SELECT @RET
GO

-- AHORA RPOBAMOS LOS ERRORES


-- CON UN ALUMNO NO REGISTRADO

DECLARE @RET INT


EXEC @RET = spu_MatriculaAlumno 9, 'B0010','20200307'
SELECT @RET
GO

DECLARE @RET INT


EXEC @RET = spu_MatriculaAlumno 51, 'A0002','20200307'
SELECT @RET
GO

-- CON UN CURSO QUE NO TIENE VACANTE


SELECT * FROM CursoProgramado
GO
-- CAMBIAMOS LOS DATOS DE LA TABLA PARA PROBAR
UPDATE CursoProgramado SET Vacantes = 0 , Matriculados = 20
WHERE IdCursoProg = 44
GO

SELECT * FROM CursoProgramado


GO

DECLARE @RET INT


EXEC @RET = spu_MatriculaAlumno 44, 'A0009','20200307'
SELECT @RET
GO

-- REGRESAMOS LA TABLA A SU ESTADO ORIGINAL

UPDATE CursoProgramado SET Vacantes = 20 , Matriculados = 0


WHERE IdCursoProg = 44
GO

-- VERIFICAMOS

SELECT * FROM CursoProgramado


GO

-- CASO DE QUE UN CURSO SE A DESCATIVADO

You might also like