1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| CREATE OR REPLACE FUNCTION statutDevoirsSemaine RETURN NUMBER AS
--Variables relatives à la date du jour.
nomDuJour varchar2(10);
numDuJour varchar2(2);
numMois varchar2(2);
annee varchar2(4);
bissextile number(1,0):=0; --Valeurs: 0 si l'année n'est pas bissextile, 1 sinon.
numMaxMois type_tab; --Tableau regroupant les numéros maximaux des jours de chaque mois
termine NUMBER(1,0):=1; --Variable retournée: 1 si tous les devoirs de la semaine sont terminés, 0 sinon.
cpt NUMBER(1,0):=0; --Compteur de boucle
jourParcouru varchar2(2); --Numéro du jour parcouru pour la vérification des statuts des devoirs
nbJoursVerifies NUMBER(5); --Nombre de jours à vérifier (Dépend de la date du jour)
BEGIN
--On enregistre le nom du jour
nomDuJour:=to_char(sysdate, 'day');
--Suppression des espaces (Voir explications dans le rapport)
nomDuJour:=TRANSLATE(nomDuJour, '1 ','1');
--On enregistre le numéro du jour
numDuJour:=to_char(sysdate, 'DD');
--Puis le numéro du mois
numMois:=to_char(sysdate, 'MM');
--On cherche à savoir si l'on est dans une année bissextile ou non.
--Algorithme expliqué dans le rapport.
annee:=to_char(sysdate, 'YYYY');
IF mod(annee,4)= 0 THEN
bissextile:=1;
IF mod(annee,100) = 0 THEN
bissextile:=0;
IF mod(annee,400) = 0 THEN
bissextile:=1;
END IF;
END IF;
END IF;
--Selon que l'année soit bissextile ou non, on enregistre dans un tableau le numéro maximal du jour. NOTE; C'est ici que je voulais faire appel à une fonction de remplissage.
IF bissextile = 0 THEN --Si l'année n'est pas bissextile
numMaxMois:= type_tab('31','28','31','30','31','30','31','31','30','31','30','31');
ELSE --Si l'année est bissextile
numMaxMois:= type_tab('31','29','31','30','31','30','31','31','30','31','30','31');
END IF;
IF nomDuJour='monday' THEN
--On doit vérifier les devoirs pour les 5 prochains jours (Mardi, Mercredi, Jeudi, Vendredi, Samedi)
nbJoursVerifies:=5;
ELSIF nomDuJour='tuesday' THEN
--On doit vérifier les devoirs pour les 4 prochains jours (Mercredi, Jeudi, Vendredi, Samedi)
nbJoursVerifies:=4;
ELSIF nomDuJour='wednesday' THEN
--On doit vérifier les devoirs pour les 3 prochains jours (Jeudi, Vendredi, Samedi)
nbJoursVerifies:=3;
ELSIF nomDuJour='thursday' THEN
--On doit vérifier les devoirs pour les 2 prochains jours (Vendredi, Samedi)
nbJoursVerifies:=2;
ELSIF nomDuJour='friday' THEN
--On doit vérifier les devoirs pour le lendemain (Samedi)
nbJoursVerifies:=1;
ELSIF nomDuJour='saturday' THEN
--On doit vérifier les devoirs pour la semaine suivante
nbJoursVerifies:=6;
numDuJour:=numDuJour+1; --On fait comme si on était dimanche [A modifier, partiellement incorrect]
ELSE
--On est dimanche, on doit vérifier les devoirs pour la semaine suivante.
nbJoursVerifies:=6;
END IF;
WHILE (termine = 1 AND cpt < nbJoursVerifies) LOOP
IF numDuJour + (cpt+1) <= numMaxMois(numMois) THEN
jourParcouru:=numDuJour + (cpt+1) || numMois || annee;
ELSE
jourParcouru:=(cpt+1);
END IF;
termine:=statutDevoirs(jourParcouru); --Appel à la fonction unitaire
cpt:=cpt+1;
END LOOP;
RETURN termine;
END; |
Partager