VISITAS (Un Click es bien recibido)

viernes, 23 de septiembre de 2011

Jerarquía de Tiempos III (Rellenando las tablas)

Procedimientos para poblar el modelo.


Para poder insertar datos en mi pequeña jerarquía he hecho una serie de procedimientostambién es Mysql, y como no, también admito sugerencias y mejoras porque lashay y muchas. He copiado tal cual los procedimientos unos detrás de otros. Si hayerrores en al nombre de algún campo es agradecería que alguien me lo dijera, así lo voy puliendo hasta que lo pase a Oracle.

----------------------------------------------------------------------------------------------
-- Completa la longitud del dia para que alaplicar el formato siempre quede como YYYYMMDD
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `DiaConCeros`(idDia TINYINT) RETURNSvarchar(2) CHARSET latin1
BEGIN
DECLARE dia VARCHAR(2);
IF (idDia <= 9) THEN
set dia = concat('0',idDia);
ELSE
set dia = concat(idDia);
END IF;
RETURN dia;
END
----------------------------------------------------------------------------------------------
-- Determina si el dia pasado como parámetro caeen fin de semana
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `FinDeSemana`(Descripcion VARCHAR(20))RETURNS tinyint(1)
BEGIN
DECLARE Resultado BOOLEAN DEFAULT FALSE;
IF (UPPER(Descripcion)='SATURDAY' orUPPER(Descripcion)='SUNDAY'
or UPPER(Descripcion)='SABADO' orUPPER(Descripcion)='DOMINGO') THEN
set Resultado =TRUE;
END IF;
RETURN Resultado;
END
----------------------------------------------------------------------------------------------
-- Completa la longitud del mes para que alaplicar el formato siempre quede como YYYYMMDD
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `MesConCeros`(idMes TINYINT) RETURNSvarchar(2) CHARSET latin1
BEGIN
DECLARE mes VARCHAR(2);
IF (idMes <= 9) THEN
set mes = concat('0',idMes);
ELSE
set mes = concat(idMes);
END IF;
RETURN mes;
END
----------------------------------------------------------------------------------------------
-- Traduce el dia del mes por su equivalente enletras
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `NombredelDia`(idDia TINYINT) RETURNSvarchar(12) CHARSET latin1
BEGIN
DECLARE Dia VARCHAR(12);
CASE idDia
WHEN 1 THEN set Dia ='Lunes';
WHEN 2 THEN set Dia ='Martes';
WHEN 3 THEN set Dia ='Miercoles';
WHEN 4 THEN set Dia ='jueves';
WHEN 5 THEN set Dia='Viernes';
WHEN 6 THEN set Dia ='Sabado';
WHEN 7 THEN set Dia ='Domingo';
ENDCASE;
RETURN Dia;
END

----------------------------------------------------------------------------------------------
-- CTraduce el mes por su equivalente en letras
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` FUNCTION `NombredelMes`(idMes TINYINT) RETURNSvarchar(12) CHARSET latin1
BEGIN
DECLARE Mes VARCHAR(12);
CASE idMes
WHEN 1 THEN set Mes ='Enero';
WHEN 2 THEN set Mes ='Febrero';
WHEN 3 THEN set Mes ='Marzo';
WHEN 4 THEN set Mes ='Abril';
WHEN 5 THEN set Mes ='Mayo';
WHEN 6 THEN set Mes ='Junio';
WHEN 7 THEN set Mes ='Julio';
WHEN 8 THEN set Mes ='Agosto';
WHEN 9 THEN set Mes ='Septiembre';
WHEN 10 THEN set Mes ='Octubre';
WHEN 11 THEN set Mes ='Noviembre';
WHEN 12 THEN set Mes ='Diciembre'; ENDCASE;
RETURN Mes;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de cuatrimestres a partir deaño pasado como parámetro
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Cuatrimestre_proc`(IN Anyo SMALLINT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE anyoActual SMALLINT DEFAULT 2011;
DECLARE idCuatrimestre SMALLINT DEFAULT 1;
DECLARE NCuatrimestre TINYINT DEFAULT 1;
DECLARE descripcion VARCHAR(20);
DECLARE idCuatrimestrePrevio SMALLINT DEFAULT 1;
DECLARE idCuatrimestreSiguiente SMALLINT DEFAULT 1;
DELETE from T_Cuatrimestre WHERE idYear=Anyo;
SET NCuatrimestre=1;
REPEAT
SET idCuatrimestre=concat(Anyo,NCuatrimestre);
CASE NCuatrimestre
WHEN 1 THEN
set descripcion= 'PrimerCuatrimestre';
set idCuatrimestrePrevio=concat(Anyo-1,3);
set idCuatrimestreSiguiente=concat(Anyo,2);
WHEN 2 THEN
set descripcion= 'SegundoCuatrimestre';
set idCuatrimestrePrevio=concat(Anyo,1);
set idCuatrimestreSiguiente=concat(Anyo,3);
WHEN 3 THEN
set descripcion= 'TercerCuatrimestre';
set idCuatrimestrePrevio=concat(Anyo,2);
set idCuatrimestreSiguiente=concat(Anyo+1,1);
END CASE;
INSERT INTO`t_cuatrimestre`(idCuatrimestre,Descripcion_Cuatrimestre,idCuatrimestrePrevio,IdCuatrimestreSiguiente,idYear,NCuantrimestre) VALUES (idCuatrimestre,descripcion ,idCuatrimestrePrevio ,idCuatrimestreSiguiente,Anyo,NCuatrimestre);
commit;
SET NCuatrimestre = NCuatrimestre +1;
UNTIL NCuatrimestre > 3 END REPEAT;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de dias del año a partir deaño y mes pasado como parámetro
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Dia_proc`(IN Anyo INT, IN nMes TINYINT)
BEGIN
DECLARE idDia INT DEFAULT 20000101;
DECLARE idMes INT;
DECLARE idMesAux INT;
DECLARE ultimoDia TINYINT;
DECLARE idCuatrimestre SMALLINT DEFAULT 1;
DECLARE idTrimestre SMALLINT DEFAULT 1;
DECLARE fecha DATE;
DECLARE esFindeSemana BOOLEAN;
DECLARE numSemana TINYINT;
DECLARE diaDelAnyo SMALLINT;
DECLARE descripcion VARCHAR(20);
DECLARE idDiaPrevio INT ;
DECLARE idDiaSiguienteINT ;
DECLARE nDia TINYINT DEFAULT 1;
set idMes = concat(Anyo,MesconCeros(nMes));
set idMesAux = idMes;
DELETE from T_Dia WHERET_Dia.idMes=idMesAux;
REPEAT
SETidDia=concat(Anyo,MesconCeros(nMes),diaConCeros(nDia));
SET fecha=idDia;
SET idDiaSiguiente= cast( DATE_FORMAT(DATE_ADD(date(fecha), INTERVAL 1DAY) ,'%Y%m%d') as char(8));
SET idDiaPrevio= cast( DATE_FORMAT(DATE_ADD(date(fecha), INTERVAL -1DAY) ,'%Y%m%d') as char(8));
SET numSemana=WEEK(fecha,1);
SET diaDelAnyo= DAYOFYEAR(fecha);
SELECT idTrimestre INTO idTrimestrefrom t_mes WHERE t_mes.idMes =idMes ;
SELECT idcuaTrimestre INTOidCuatrimestre from t_mes WHERE t_mes.idMes =idMes ;
-- - Descripcion del dia
SET descripcion = dayName(idDia);
SET EsFindeSemana=FinDeSemana(descripcion);
SET ultimoDia= day(LAST_DAY(concat(idMes,'01')));
INSERT INTO t_dia (idDia,Fecha,Descripcion_dia,IdDiaPrevio,idDiaSiguiente,Festivo,FinSemana,Semana, idMes,DiaDelAnio)VALUES(idDia,fecha,descripcion,idDiaPrevio,idDiaSiguiente,null,EsFindeSemana,numSemana,idMes,diaDelAnyo);
SET nDia = nDia +1 ;
UNTIL nDia> ultimoDia END REPEAT;
END
-- --------------------------------------------------------------------------------------------
-- Rellena la tabla de meses del año a partir deaño
----------------------------------------------------------------------------------------------
DELIMITER$$
CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Mes_proc`(IN Anyo INT)
BEGIN
DECLARE idCuatrimestre SMALLINT DEFAULT 1;
DECLARE idTrimestre SMALLINT DEFAULT 1;
DECLARE descripcion VARCHAR(20);
DECLARE idMesPrevio INT DEFAULT 1;
DECLARE idMesSiguiente INT DEFAULT 1;
DECLARE nMes TINYINT DEFAULT 1;
DECLARE idMes INT;
DECLARE dsMes CHAR(2);
DECLARE ultimoDia SMALLINT;

DELETE from T_Mes WHERE idYear=Anyo;
REPEAT
---Para pones el cero delante del mes en caso de meses menores de 9
IF (nMes <= 9) THEN
set idMes = concat(Anyo,'0',nMes);
ELSE
set idMes = concat(Anyo,nMes);
END IF;
SET descripcion = NombredelMes(nMes);
SET ultimoDia=day(LAST_DAY(concat(idMes,'01')));
-- -Mes Previo
---Mes Siguiente
CASE nMes
WHEN 1 then
SET idMesPrevio = concat(Anyo-1,'12');
SET idMesSiguiente =concat(Anyo,Mesconceros(nMes+1));
WHEN 12 THEN
SET idMesPrevio = concat(Anyo+1,'01');
SET idMesSiguiente =concat(Anyo +1,'01');
ELSE
SET idMesPrevio = concat(Anyo,Mesconceros(nMes-1));
SET idMesSiguiente =concat(Anyo ,Mesconceros(nMes+1));
END CASE;
-- -Busco el id del trimestre
CASE
WHEN nMes>=1 and nMes <=3 THEN SET idTrimestre = concat(Anyo, '1');
WHEN nMes>=4 and nMes <=6 THENSET idTrimestre = concat(Anyo, '2');
WHEN nMes>=7 and nMes <=9 THEN SET idTrimestre = concat(Anyo, '3');
WHEN nMes>=10 and nMes <=12 THEN SET idTrimestre = concat(Anyo, '4');
END CASE;
-- - Busco el Id del cuatrimestre
CASE
WHEN nMes>=1 and nMes <=4 THEN SET idCuatrimestre = concat(Anyo, '1');
WHEN nMes>=5 and nMes <=8 THEN SETidCuatrimestre = concat(Anyo, '2');
WHEN nMes>=9 and nMes <=12 THEN SETidCuatrimestre = concat(Anyo, '3');
END CASE;
INSERT INTO T_Mes(idMes,Descripcion_mes,idYear,nMes,NumDiasMes,idMesPrevio,idMesSiguiente,idTrimestre,idCuatrimestre,PrimerDiaMes,UltimoDiaMes)
VALUES ( idMes, descripcion,Anyo ,nMes ,ultimoDia ,idMesPrevio,idMesSiguiente ,idTrimestre ,idCuatrimestre ,1 ,ultimoDia);
call t_dia_proc(Anyo,nMes);
SET nMes = nMes +1 ;
UNTIL nMes> 12 END REPEAT;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de trimestres a partir deaño pasado como parámetro
----------------------------------------------------------------------------------------------
DELIMITER$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `t_Trimestre_proc`(IN Anyo SMALLINT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE anyoActual SMALLINT DEFAULT 2011;
DECLARE idTrimestre SMALLINT DEFAULT 1;
DECLARE NTrimestre TINYINT DEFAULT 1;
DECLARE descripcion VARCHAR(20);
DECLARE idTrimestrePrevio SMALLINT DEFAULT 1;
DECLARE idTrimestreSiguiente SMALLINT DEFAULT 1;
DELETE from T_Trimestre WHERE idYear=Anyo;
SET NTrimestre=1;
REPEAT
SET idTrimestre=concat(Anyo,NTrimestre);
CASE NTrimestre
WHEN 1 THEN
set descripcion= 'PrimerTrimestre';
setidTrimestrePrevio=concat(Anyo-1,4);
set idTrimestreSiguiente=concat(Anyo,2);
WHEN2 THEN
set descripcion= 'SegundoTrimestre';
set idTrimestrePrevio=concat(Anyo,1);
set idTrimestreSiguiente=concat(Anyo,3);
WHEN 3 THEN
set descripcion= 'TercerTrimestre';
set idTrimestrePrevio=concat(Anyo,2);
set idTrimestreSiguiente=concat(Anyo,4);
WHEN 4 THEN
set descripcion= 'Cuarto Trimestre' ;
set idTrimestrePrevio=concat(Anyo,3);
set idTrimestreSiguiente=concat(Anyo+1,1);
END CASE;
INSERT INTO T_Trimestre(idTrimestre, Descripcion_trimestre, idTrimestrePrevio, IdTrimestreSiguiente,idYear,NTrimestre)
VALUES (idTrimestre,descripcion ,idTrimestrePrevio ,idTrimestreSiguiente ,Anyo,NTrimestre);
commit;
SET NTrimestre = NTrimestre +1;
UNTIL NTrimestre > 4 END REPEAT;
END
----------------------------------------------------------------------------------------------
-- Rellena la tabla de años, se le pasan dosparámetros de año de inicio y fin de fechas a cargar.
----------------------------------------------------------------------------------------------
DELIMITER$$

CREATEDEFINER=`root`@`localhost` PROCEDURE `t_year_proc`(IN AnyoInicio SMALLINT ,INAnyoFin SMALLINT)
BEGIN
DECLARE anyoActual SMALLINT DEFAULT2011;
DECLARE dni VARCHAR(20);
DECLARE unNumero INTEGER;
DECLARE esBisiesto BOOLEAN;
set anyoActual=anyoInicio;
truncate table T_Year;
WHILE anyoActual <= AnyoFin DO
SELECT DATEDIFF(concat(anyoActual,'-12-31'),concat(anyoActual,'-01-01'))+1 into unNumero;
CASE unNumero
WHEN 365 THEN setesBisiesto= false ;
WHEN 366 THEN setesBisiesto= true;
END CASE;
INSERT INTO T_Year (idYear,Num_dias_anyo, Bisiesto, idYearPrevio, idYearSiguiente)
VALUES (anyoActual ,unNumero,esBisiesto ,anyoActual-1 ,anyoActual+1);
call t_Trimestre_proc(anyoActual);
call t_Cuatrimestre_proc(anyoActual);
call t_Mes_proc(anyoActual);
set anyoActual =anyoActual +1;
END WHILE;
END

No hay comentarios: