Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
Est-ce quelqu'un a une petite fonction de jours fériés nationaux et utilisable librement ?
Merci.
Doctor Z.
Hors ligne
Dans les PFC nous avons bien of_SetHolidays, mais je voudrai m'en affranchir (dans le
projet pour lequel je travail, nous n'utilisons pas les PFC).
Si je n'ai pas le choix, quitte à copier la fonction et l'intégrer dans le projet.
Hors ligne
Salut, je l'ai fait en PL/SQL, mais pas en PB
Hors ligne
Oui je sais c'est un peu vieux mais moi j'ai ecris qq chose mais en avec une procédure stockée.
Si ça intéresse qq'un d'autre.
Hors ligne
salut
Cela peut toujours etre interessant ...
Hors ligne
voilà quelques fonctions utiles pour Oracle (facilement traduisibles en PB) :
/* FN_JOUR_OUVRE = retourne 1 si le jour donné est ouvré, 0 sinon */ FUNCTION FN_JOUR_OUVRE(ad_jour IN DATE) RETURN NUMBER IS li_ouvre NUMBER ; BEGIN li_ouvre := 1 ; -- 1) samedis, dimanches IF TO_CHAR( ad_jour , 'D' ) IN (6,7) THEN li_ouvre := 0 ; -- 2) jours fériés -- 2.1) 1er janvier ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '0101' THEN li_ouvre := 0 ; -- 2.2) lundi Pâques ELSIF FN_DATE_LUNDI_PAQUES( ad_jour ) = ad_jour THEN li_ouvre := 0 ; -- 2.3) 1er mai ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '0501' THEN li_ouvre := 0 ; -- 2.4) 8 mai ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '0508' THEN li_ouvre := 0 ; -- 2.5) jeudi ascension ELSIF FN_DATE_JEUDI_ASCENSION( ad_jour ) = ad_jour THEN li_ouvre := 0 ; -- 2.6) 14 juillet ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '0714' THEN li_ouvre := 0 ; -- 2.7) 15 août ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '0815' THEN li_ouvre := 0 ; -- 2.8) toussaint ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '1101' THEN li_ouvre := 0 ; -- 2.9) 11 novembre ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '1111' THEN li_ouvre := 0 ; -- 2.) Noël ELSIF TO_CHAR( ad_jour , 'MMDD' ) = '1225' THEN li_ouvre := 0 ; END IF; RETURN li_ouvre ; END FN_JOUR_OUVRE ; /* FN_DATE_PAQUES = retourne la date de Paques pour l'année donnée */ FUNCTION FN_DATE_PAQUES(ad_date IN DATE) RETURN DATE IS ld_paques DATE ; li_annee NUMBER ; li_n NUMBER ; li_a NUMBER ; li_b NUMBER ; li_c NUMBER ; li_d NUMBER ; li_e NUMBER ; li_f NUMBER ; BEGIN -- calcul par l'algorithme de O'Beirne li_annee := TO_NUMBER( TO_CHAR( ad_date, 'YYYY' ) ) ; li_n := li_annee - 1900 ; li_a := MOD( li_n, 19 ) ; li_b := FLOOR( ( 7 * li_a + 1 ) / 19 ); li_c := MOD( 11 * li_a - li_b + 4, 29 ) ; li_d := FLOOR( li_n / 4 ) ; li_e := MOD( li_n - li_c + li_d + 31, 7 ) ; li_f := 25 - li_c - li_e ; IF li_f > 0 THEN ld_paques := TO_DATE( TO_NUMBER( TO_CHAR( TO_DATE( li_annee || '0401', 'YYYYMMDD' ), 'J')) + li_f - 1, 'J') ; ELSE ld_paques := TO_DATE( TO_NUMBER( TO_CHAR( TO_DATE( li_annee || '0331', 'YYYYMMDD' ), 'J')) + li_f, 'J') ; END IF ; RETURN ld_paques; END FN_DATE_PAQUES ; /* FN_DATE_LUNDI_PAQUES = retourne la date du lundi de Paques pour l'année donnée */ FUNCTION FN_DATE_LUNDI_PAQUES(ad_date IN DATE) RETURN DATE IS ld_lundi_paques DATE ; ld_paques DATE ; BEGIN -- jour de Paques + 1 ld_paques := FN_DATE_PAQUES( ad_date ) ; ld_lundi_paques := TO_DATE( TO_NUMBER( TO_CHAR( ld_paques, 'J') ) + 1, 'J' ) ; RETURN ld_lundi_paques; END FN_DATE_LUNDI_PAQUES ; /* FN_DATE_JEUDI_ASCENSION = retourne la date du jeudi de l'ascension pour l'année donnée */ FUNCTION FN_DATE_JEUDI_ASCENSION(ad_date IN DATE) RETURN DATE IS ld_jeudi_ascension DATE ; ld_paques DATE ; BEGIN -- jour de Paques + 39 ld_paques := FN_DATE_PAQUES( ad_date ) ; ld_jeudi_ascension := TO_DATE( TO_NUMBER( TO_CHAR( ld_paques, 'J') ) + 39, 'J' ) ; RETURN ld_jeudi_ascension; END FN_DATE_JEUDI_ASCENSION ;
Hors ligne
Pour Sybase (en fait cela aurait plutôt sa place dans BD mais bon ^_^)
La table des jours fériés fixes, des fois qu'il faille en rajouter ^_^ (mais surtout pas en supprimer) ou gérer le pays ;)
CREATE TABLE ferie(ferie char(5) not null) alter table ferie add constraint PK_FERIE primary key (ferie) INSERT INTO ferie VALUES ('01/01') INSERT INTO ferie VALUES ('01/05') INSERT INTO ferie VALUES ('01/11') INSERT INTO ferie VALUES ('08/05') INSERT INTO ferie VALUES ('11/11') INSERT INTO ferie VALUES ('14/07') INSERT INTO ferie VALUES ('15/08') INSERT INTO ferie VALUES ('25/12')
J'ai fait des procédures stockées car je n'ai pas encore franchi le pas de la fonction SQL Sybase.
La procédure qui calcule les jours qui dépendent de Pâques :
CREATE PROCEDURE jours_paques @annee INTEGER, @paques DATETIME OUTPUT, @lundi_paques DATETIME OUTPUT, @ascension DATETIME OUTPUT, @pentecote DATETIME OUTPUT, @lundi_pentecote DATETIME OUTPUT AS BEGIN DECLARE @date DATETIME, @a INTEGER , @b INTEGER , @c INTEGER , @d INTEGER , @e INTEGER , @f INTEGER , @p INTEGER SELECT @a = @annee - 1900 SELECT @b = @annee%19 SELECT @c = CEILING(( 7*@b + 1 ) / 19) SELECT @d = ( 11*@b + 4 - @c )%29 SELECT @e = CEILING( @a / 4 ) SELECT @f = ( @a + @e + 31 - @d )%7 SELECT @p = 25 - @d - @f SELECT @date = convert(datetime,'31/03' + '/' +convert(char(4),@annee),103) SELECT @paques = dateadd(day, @p, @date) SELECT @lundi_paques = dateadd(day, 1, @paques) SELECT @ascension = dateadd(day, 39, @paques) SELECT @pentecote = dateadd(day, 49, @paques) SELECT @lundi_pentecote = dateadd(day, 1, @pentecote ) END
Je ne sais plus où j'ai trouvé cet algorithme (wikipédia peut-être) mais il est fiable.
La procédure stockée qui détermine si le jour passé en argument est un jour férié ou non :
CREATE PROCEDURE jours_feries @date DATETIME, @retour INTEGER OUTPUT AS BEGIN DECLARE @ferie VARCHAR(5), @ferme DATETIME, @annee INTEGER, @jour VARCHAR(5), @paques DATETIME, @lundi_paques DATETIME, @ascension DATETIME, @pentecote DATETIME, @lundi_pentecote DATETIME SELECT @jour = SUBSTRING(CONVERT(CHAR(12),@date,103),1,5) SELECT @annee = CONVERT(INTEGER,SUBSTRING(CONVERT(CHAR(12),@date,103),7,4)) SELECT @ferie = ferie FROM ferie WHERE ferie = @jour IF @jour = @ferie BEGIN SELECT @retour = 1 END ELSE BEGIN EXECUTE jours_paques @annee, @paques OUTPUT, @lundi_paques OUTPUT, @ascension OUTPUT, @pentecote OUTPUT, @lundi_pentecote OUTPUT IF @date = @paques OR @date = @lundi_paques OR @date = @ascension OR @date = @pentecote BEGIN SELECT @retour = 1 END ELSE BEGIN IF @annee < 2004 and @date = @lundi_pentecote BEGIN SELECT @retour = 1 END ELSE BEGIN SELECT @retour = 0 END END END END
La procédure stockée qui détermine si le jour passé en argument est un jour ouvré (= du lundi au vendredi) ou non :
CREATE PROCEDURE jour_ouvre @date DATETIME, @retour_ouvre INTEGER OUTPUT AS BEGIN DECLARE @num_jour INTEGER, @retour_ferie INTEGER /* Numéro du jour dans la semaine (1 à 7)*/ SELECT @num_jour = DATEPART(dw,@date) /* Le jour 1 n'est pas Lundi */ IF @num_jour >= 2 AND @num_jour <= 6 BEGIN EXECUTE jours_feries @date, @retour_ferie OUTPUT IF @retour_ferie = 0 BEGIN SELECT @retour_ouvre = 1 END ELSE BEGIN SELECT @retour_ouvre = 0 END END ELSE BEGIN SELECT @retour_ouvre = 0 END END
La procédure stockée qui détermine un nombre de jours ouvrés (lundi à vendredi) entre 2 dates passées en arguments :
CREATE PROCEDURE nb_jour_ouvre @date_deb DATETIME, @date_fin DATETIME, @nbj_ouvre INTEGER OUTPUT AS BEGIN DECLARE @date DATETIME, @retour_ouvre INTEGER SELECT @date = @date_deb SELECT @nbj_ouvre = 0 WHILE ( @date <= @date_fin ) BEGIN EXECUTE jour_ouvre @date, @retour_ouvre OUTPUT IF @retour_ouvre = 1 BEGIN SELECT @nbj_ouvre = @nbj_ouvre + 1 END SELECT @date = DATEADD(day, 1, @date) END END
Dernière modification par Sailor LVCV (08-07-2009 10:36:49)
Hors ligne
Je me rappelle qu'on avait mis en place l'importation d'un fichier outlook dans une table qui contient l'ensemble des jours feries...
Hors ligne