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
| CREATE FUNCTION F_CALC_TBF(p_fam IN VARCHAR2, p_dom IN VARCHAR2, p_reseau IN VARCHAR2,
p_datedeb IN DATE, p_datefin IN DATE, p_nbJF IN NUMBER)
RETURN NUMBER IS
v_tbf NUMBER := 0;
date_boucle DATE;
BEGIN
IF p_dom IN ('EQVT', 'EQPT', 'S-TE')
OR (p_dom = 'EQ11' AND p_fam IN ('A001', 'A002'))
THEN
v_tbf := 24 * 60 * ( (p_datefin - p_datedeb) + 1);
ELSE
/*Je fais une boucle pour calculer par jour la durée*/
date_boucle := debextract;
WHILE date_boucle <= finextract
LOOP
IF p_reseau = 'METRO' AND TO_CHAR(date_boucle, 'day') = 'dimanche'
THEN
v_tbf := v_tbf + 21 * 60;
ELSE
v_tbf := v_tbf + 20 * 60;
END IF;
date_boucle := date_boucle + 1;
END LOOP;
-- S'il y avait des Jfériés autre que dimanche et METRO, on les a comptés en 20*60.
IF p_reseau = 'METRO' THEN
v_tbf := v_tbf - p_nbJF * 20 * 60 + p_nbJF * 21 * 60;
END IF;
END IF;
RETURN v_tbf;
END;
/
DECLARE
debextract DATE := :date1;
finextract DATE := :date2;
v_nbJF NUMBER := 0;
BEGIN
-- Calcul du nb de jfériés non dimanches.1 seule fois sur la période.
SELECT COUNT(*)
INTO v_nb_JF
FROM SI_CALENDRIER_20042020
WHERE cal_datejour BETWEEN p_datedeb AND p_datefin
AND cal_particularite = 'JF'
AND TO_CHAR(cal_datejour, 'day') <> 'dimanche';
UPDATE SI_PROC_DISPONIBILITE
SET tbf = F_CALC_TBF(prd_famille, prd_domaine, prd_reseau, debextract, finextract, v_nbJF)
WHERE (prd_domaine <> 'S-TE' AND prd_domaine <> 'S-EQ' )
OR (prd_code_bm LIKE 'SONO%' AND prd_code_bm <> 'SONOR-');
COMMIT;
END; |
Partager