Está en la página 1de 10

BASE DE DATOS AVANZADAS

EXAMEN DE UNIDAD I

SISTEMA DE MATRÍCULAS

Implemente los scripts para la integridad de la base de datos del Sistema de matrículas de
la UNT, teniendo en cuenta los siguientes aspectos:

a) Verificar que la matrícula de un alumno en algún curso, se lleve a cabo sin problemas
siempre y cuando tenga el curso prerrequisito debidamente aprobado, en caso contrario
rechazar la matrícula.

b) Asimismo, verificar que el alumno no exceda el número de créditos permitido por ciclo
(máximo 22), en caso contrario, no permitir el registro de la matrícula.

c) También, verificar que el horario del curso no se cruce con el horario de otro curso,
caso contrario rechazar la matrícula en dicho curso.

d) Finalmente, verificar que exista vacante en el curso a matricular, en base a la capacidad


del aula o de laboratorio.

 Una matrícula solamente es posible en la lista de los cursos del plan de estudios
de la carrera profesional del alumno, así también, un alumno solamente se podrá
matricular en aquellos cursos que la escuela viene ofertando en el semestre actual.
 Implemente el trigger que permita aceptar o rechazar el registro de la matrícula
según corresponda. Cuando una matrícula ha sido aceptada, actualizar la vacante
ocupada en cada curso, y la lista de alumnos matriculados por curso; para el
docente.
 Elabore el diagrama de la base de datos en SQL.
 Desarrolle su solución integral utilizando: Funciones, triggers, cursores, vistas,
procedimientos almacenados o lo necesario.

--Crear BD_Examen_I

GO
CREATE DATABASE BD_Examen_I

--Crear Tablas
USE BD_Examen_I
go
CREATE TABLE ALUMNO
(
alumno_id integer IDENTITY ( 1,1 ) ,
nombre varchar(60) NULL
)
go

ALTER TABLE ALUMNO


ADD CONSTRAINT XPKALUMNO PRIMARY KEY CLUSTERED (alumno_id ASC)
go

CREATE TABLE CURSO


(
curso_id integer IDENTITY ( 1,1 ) ,
nombre varchar(60) NULL ,
creditos integer NOT NULL
)
go

ALTER TABLE CURSO


ADD CONSTRAINT XPKCURSO PRIMARY KEY CLUSTERED (curso_id ASC)
go

CREATE TABLE CURSOS_MATRICULA


(
matricula_id integer NOT NULL ,
curso_id integer NOT NULL ,
semestre_id integer NOT NULL ,
estado varchar(2) NULL
)
go

ALTER TABLE CURSOS_MATRICULA


ADD CONSTRAINT XPKCURSOS_MATRICULA PRIMARY KEY CLUSTERED (matricula_id
ASC,curso_id ASC,semestre_id ASC)
go

CREATE TABLE HORARIO


(
horario_id integer IDENTITY ( 1,1 ) ,
dias varchar(60) NULL ,
hora varchar(60) NULL
)
go

ALTER TABLE HORARIO


ADD CONSTRAINT XPKHORARIO PRIMARY KEY CLUSTERED (horario_id ASC)
go

CREATE TABLE MATRICULA


(
matricula_id integer IDENTITY ( 1,1 ) ,
alumno_id integer NOT NULL
)
go

ALTER TABLE MATRICULA


ADD CONSTRAINT XPKMATRICULA PRIMARY KEY CLUSTERED (matricula_id ASC)
go

CREATE TABLE PRERREQUISITOS


(
curso_IDD integer NOT NULL ,
curso_id integer NULL ,
autogenerado integer IDENTITY ( 1,1 )
)
go

ALTER TABLE PRERREQUISITOS


ADD CONSTRAINT XPKPRERREQUISITOS PRIMARY KEY CLUSTERED (curso_IDD
ASC,autogenerado ASC)
go

CREATE TABLE SEMESTRE


(
semestre_id integer IDENTITY ( 1,1 ) ,
año integer NOT NULL ,
periodo varchar(5) NOT NULL
)
go
ALTER TABLE SEMESTRE
ADD CONSTRAINT XPKSEMESTRE PRIMARY KEY CLUSTERED (semestre_id ASC)
go

CREATE TABLE SEMESTRE_CURSO


(
semestre_id integer NOT NULL ,
curso_id integer NOT NULL ,
numero_vacantes integer NULL ,
horario_id integer NOT NULL
)
go

ALTER TABLE SEMESTRE_CURSO


ADD CONSTRAINT XPKSEMESTRE_CURSO PRIMARY KEY CLUSTERED (curso_id
ASC,semestre_id ASC)
go

ALTER TABLE CURSOS_MATRICULA


ADD CONSTRAINT R_1 FOREIGN KEY (matricula_id) REFERENCES
MATRICULA(matricula_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE CURSOS_MATRICULA


ADD CONSTRAINT R_11 FOREIGN KEY (curso_id,semestre_id) REFERENCES
SEMESTRE_CURSO(curso_id,semestre_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE MATRICULA


ADD CONSTRAINT R_2 FOREIGN KEY (alumno_id) REFERENCES ALUMNO(alumno_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE PRERREQUISITOS


ADD CONSTRAINT R_12 FOREIGN KEY (curso_IDD) REFERENCES CURSO(curso_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE PRERREQUISITOS


ADD CONSTRAINT R_14 FOREIGN KEY (curso_id) REFERENCES CURSO(curso_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE SEMESTRE_CURSO


ADD CONSTRAINT R_4 FOREIGN KEY (semestre_id) REFERENCES
SEMESTRE(semestre_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE SEMESTRE_CURSO


ADD CONSTRAINT R_5 FOREIGN KEY (curso_id) REFERENCES CURSO(curso_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

ALTER TABLE SEMESTRE_CURSO


ADD CONSTRAINT R_10 FOREIGN KEY (horario_id) REFERENCES HORARIO(horario_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
go

-- Condiciones

GO
USE BD_Examen_I
GO
IF OBJECT_ID('SP_00_añadir_matricula') IS NOT NULL
DROP PROCEDURE SP_00_añadir_matricula

IF OBJECT_ID('dbo.indexOf') IS NOT NULL


DROP FUNCTION dbo.indexOf

GO
-- RETORNA UNA CADENA DE ACUERDO A LA POSICION SOLICITADA
CREATE FUNCTION dbo.indexOf(@cadena VARCHAR(1000),@indice INTEGER)
RETURNS VARCHAR(50) AS
BEGIN
declare @posicion int
declare @valor varchar(100)
declare @contador integer
set @contador = 0
set @cadena = @cadena + ','
while patindex('%,%' , @cadena) <> 0
begin
set @posicion = patindex('%,%' , @cadena)
set @valor = left(@cadena, @posicion - 1)
if @contador = @indice
return @valor
set @cadena = stuff(@cadena, 1, @posicion, '')
set @contador = @contador + 1
end
return 'error'
END

GO
CREATE PROCEDURE SP_00_añadir_matricula
@alumno_id INTEGER, @cursos_id VARCHAR(100), @numeroCursos INTEGER,
@periodo VARCHAR(5), @año INTEGER AS
BEGIN
declare @cont integer
declare @idCurso integer
declare @existe integer
declare @idPrerrequisito integer
declare @idMatricula integer
declare @aproboPrerequisito VARCHAR(5)
declare @llevoPrerrequisito integer
declare @numeroCreditos integer
declare @numeroTemp integer
declare @cadenaHorario VARCHAR(50)
declare @cont2 integer
declare @idCursoTemp integer
declare @idHorario integer
set @cadenaHorario = ''
set @cont = 0
set @cont2 = 0
set @existe = 1
set @numeroCreditos = 0
while(@cont < @numeroCursos)
begin
set @idCurso = CONVERT(integer,dbo.indexOf(@cursos_id,@cont))

-- APROBO PRERREQUISITO
declare idPrerequisitosCursor CURSOR FOR SELECT curso_id FROM
PRERREQUISITOS WHERE curso_IDD = @idCurso
open idPrerequisitosCursor
while @@FETCH_STATUS = 0
begin
fetch next from idPrerequisitosCursor into @idPrerrequisito
-- TENGO EN @idPrerrequisito el cursoprerequisto del curso
seleccionado
if @idPrerrequisito is null
break
SELECT @llevoPrerrequisito = COUNT(*) FROM ALUMNO AS A
INNER JOIN MATRICULA AS M ON M.alumno_id = A.alumno_id
INNER JOIN CURSOS_MATRICULA AS CM ON CM.matricula_id =
M.matricula_id
WHERE(@idPrerrequisito = CM.curso_id)

if @llevoPrerrequisito = 0
begin
close idPrerequisitosCursor
deallocate idPrerequisitosCursor
RAISERROR('No se puede matricular no llevas un curso
de prerequisito',16,8)
return
end
else
begin

SELECT @aproboPrerequisito = CM.estado FROM


ALUMNO AS A
INNER JOIN MATRICULA AS M ON M.alumno_id =
A.alumno_id
INNER JOIN CURSOS_MATRICULA AS CM ON
CM.matricula_id = M.matricula_id
WHERE(@idPrerrequisito = CM.curso_id)

if @aproboPrerequisito = 'NA'
begin
close idPrerequisitosCursor
deallocate idPrerequisitosCursor
RAISERROR('No se puede matricular, no aprobo
prerequisito',16,8)
return
end
end
end
close idPrerequisitosCursor
deallocate idPrerequisitosCursor

-- VERIFICAR NUMER DE CREDITOS


SELECT @numeroTemp = C.creditos FROM CURSO AS C WHERE
C.curso_id = @idCurso
set @numeroCreditos = @numeroCreditos + @numeroTemp
if @numeroCreditos >= 22
begin
RAISERROR('No se puede matricular, numero de creditos
exedio',16,8)
return
end

-- VERIFICAR EL NUMERO DE VACANTES


SELECT @numeroTemp = numero_vacantes FROM SEMESTRE_CURSO
AS SC
INNER JOIN SEMESTRE AS S ON S.semestre_id =
SC.semestre_id
WHERE S.año = @año AND S.periodo = @periodo AND
SC.curso_id = @idCurso
if @numeroTemp = 0
begin
RAISERROR('No existe vacante para un curso',16,8)
return
end

-- VERIFICAR HORARIO NO CRUZADO


SELECT @idHorario = SC.horario_id FROM SEMESTRE_CURSO AS SC
INNER JOIN SEMESTRE AS S ON S.semestre_id =
SC.semestre_id
WHERE S.año = @año AND S.periodo = @periodo AND
SC.curso_id = @idCurso

while(@cont2 < @numeroCursos)


begin
set @idCursoTemp =
CONVERT(integer,dbo.indexOf(@cursos_id,@cont2))
if @idCursoTemp <> @idCurso
begin
SELECT @numeroTemp = SC.horario_id FROM
SEMESTRE_CURSO AS SC
INNER JOIN SEMESTRE AS S ON S.semestre_id =
SC.semestre_id
WHERE S.año = @año AND S.periodo =
@periodo AND SC.curso_id = @idCursoTemp
if @idHorario = @numeroTemp
begin
RAISERROR('Horario Coincidente',15,16)
return
end
end
set @cont2 = @cont2 + 1
end

--SELECT @numeroTemp = H.horario_id FROM SEMESTRE_CURSO AS


SC
-- INNER JOIN SEMESTRE AS S ON S.semestre_id =
SC.semestre_id
-- INNER JOIN HORARIO AS H ON H.horario_id = SC.horario_id
--SET @cadenaHorario = CONCAT(@cadenaHorario,
CONCAT(',',CONVERT(VARCHAR(10),@numeroTemp)))

set @cont = @cont + 1

end

set @cont = 0
INSERT INTO MATRICULA(alumno_id) VALUES(@alumno_id)
set @numeroTemp = @@IDENTITY
declare @idSemestre integer
SELECT @idSemestre = S.semestre_id FROM SEMESTRE AS S WHERE S.año =
@año AND S.periodo = @periodo

while @cont < @numeroCursos


begin
INSERT INTO
CURSOS_MATRICULA(matricula_id,curso_id,semestre_id,estado)
VALUES(@numeroTemp,CONVERT(integer,dbo.indexOf(@cursos_id,@cont)),@idSemestre,'SA'
)
set @cont = @cont + 1
end

END
--Prueba
GO
USE BD_Examen_I
GO
BEGIN TRY
BEGIN TRANSACTION Transaccion
-- INSERTAR UN NUEVO SEMESTRE
INSERT INTO SEMESTRE(año,periodo) VALUES(YEAR(GETDATE()),'I')
-- INSERTAR CURSOS
INSERT INTO CURSO(nombre,creditos)
VALUES('Comunicacion',2),('Base de Datos',3),('Iso',3),('SISPOPE',22)
-- INSERTAR PREREQUISITOS
INSERT INTO PRERREQUISITOS(curso_IDD,curso_id) VALUES(1,2)
-- INSERTAR ALUMNO
INSERT INTO ALUMNO(nombre) VALUES('Jose Valverde'),('Alexis
Meregildo'),('Segundo Avila'),('Jorge Sosa')
-- CREAR HORARIO
INSERT INTO HORARIO(dias,hora)
VALUES('Lunes','8'),('Martes','8'),('Miercoles','8'),('Jueves','8')
-- INGRESAR SEMESTRE CURSO
INSERT INTO
SEMESTRE_CURSO(semestre_id,curso_id,horario_id,numero_vacantes)
VALUES(1,1,1,13),(1,2,2,0),(1,3,1,20),(1,4,3,10)

COMMIT TRANSACTION Transaccion


END TRY
BEGIN CATCH
ROLLBACK TRANSACTION Transaccion
PRINT ERROR_MESSAGE()
END CATCH

SELECT * FROM PRERREQUISITOS


SELECT * FROM CURSO
SELECT * FROM SEMESTRE_CURSO

SELECT * FROM MATRICULA


SELECT * FROM CURSOS_MATRICULA

--UPDATE SEMESTRE_CURSO SET numero_vacantes = 10 WHERE curso_id = 2

EXEC SP_00_añadir_matricula 1,'1,3',2,'I',2017

También podría gustarte