lunes, 4 de julio de 2011

Procedimiento almacenado Jornas y partidos

Hola a tod@s, en nuestro ciclo superior en el IES. Gran Capitán, se nos presento el siguiente reto en la asignatura de bases de datos, el cual un consitia en: (teniendo una base de datos de baloncestos que guarde toda la informacion relevante a una competición que calcurara mediante un procedimiento almacenado las jornadas así como los enfrentamientos de las mismas, dando por rectricion que un equipo no puede cjugar en dos estadios al mimo tiempo.

En nuestro caso elegimos montar la base de datos en SQL server para compararo con el software libre que estabamos acostumbrados a utilizar.
Para la creacion de este triger fueron nesesarios un cursor(puntero que recorre el resultado de una consulta metida en una variable) y 4 if anidados os pongo este triger porque esta muy completo y dispone de 2 bucles anidados, lo cual es idoneo para ver un ejemplo o aprender sobre trans-SQL

CREATE PROCEDURE [dbo].[calculajornadas]

AS
--Declaracion de variables nesesesarias--
declare @id_jornada as int
declare @id_jornada_inicial as int
declare @id_jornada_final as int
declare @id_visitante as int
declare @id_local as int

--Cursor--
declare Cursorequipos cursor for select equipos.id,equipos1.id from equipos, equipos as equipos1 where equipos.id != equipos1.id
declare @fecha as Datetime
declare @salto as int
declare @contador as int
declare @bandeta as int
BEGIN
--asignaciones--
set @salto = (select count(*) from equipos)
set @contador = 1
set @fecha= GETDATE()

insert into jornadas (fecha) VALUES(@fecha)
set @id_jornada_inicial = (Select max(id) from jornadas)
--Creamos todas las jornadas--
while @salto * 2 > @contador
begin
insert into jornadas (fecha) VALUES(@fecha)
set @fecha = DATEADD(day, 1, @fecha)
set @contador = @contador + 1

end

set @id_jornada_final = (Select max(id) from jornadas)

open Cursorequipos
fetch next from Cursorequipos into @id_local, @id_visitante

while @@fetch_status = 0
begin

set @bandeta = 1
set @id_jornada = @id_jornada_inicial
--bucle 2 anidado
while @bandeta=1
begin
if (select count(*) from partidos where id_visitante=@id_local and id_jornada=@id_jornada ) = 0
begin
if (select count(*) from partidos where id_local=@id_local and id_jornada=@id_jornada ) = 0
begin


if (select count(*) from partidos where id_local=@id_visitante and id_jornada=@id_jornada ) = 0
begin
if (select count(*) from partidos where id_visitante=@id_visitante and id_jornada=@id_jornada ) = 0
begin
insert into partidos (id_jornada, id_local,id_visitante) values (@id_jornada,@id_local,@id_visitante)
set @bandeta = 0
end
else
begin
set @id_jornada = @id_jornada + 1
set @bandeta = 1
end
end
else
begin
set @id_jornada = @id_jornada + 1
set @bandeta = 1
end

end
else
begin
set @id_jornada = @id_jornada + 1
set @bandeta = 1
end
end
else
begin
set @id_jornada = @id_jornada + 1
set @bandeta = 1
end

--else
--begin
-- set @id_jornada = @id_jornada + 1
-- set @bandeta = 1
--end

--cierre del segundo bucle
end
--avansa un registro--
fetch next from Cursorequipos into @id_local, @id_visitante
end
close Cursorequipos
deallocate Cursorequipos
END

No hay comentarios:

Publicar un comentario