Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 15-07-2008 15:54:31

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Fonction de jours fériés

Bonjour à tous,

Est-ce quelqu'un a une petite fonction de jours fériés nationaux et utilisable librement ?
Merci.

Doctor Z.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#2 15-07-2008 16:15:32

Doctor Z  
Moderador
Award: PanchoeNacho
Lieu: Vale Figueira (Lisbonne)
Date d'inscription: 30-05-2006
Messages: 756
Pépites: 1,003,082
Banque: 877,135,234,297,804

Re: Fonction de jours fériés

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.


http://www.userbars.com/i/543606.gif
Olivença, l'oubliée
Si tu es alentejane, que Dieu te bénisses, si tu ne l'es pas, que Dieu te pardonnes.

Hors ligne

 

#3 17-07-2008 09:41:19

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Fonction de jours fériés

Salut, je l'ai fait en PL/SQL, mais pas en PB


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#4 06-07-2009 15:09:58

Sailor LVCV  
N2I power
Lieu: Vigneux sur Seine
Date d'inscription: 04-03-2008
Messages: 54
Pépites: 1,253
Banque: 0

Re: Fonction de jours fériés

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.


Moi, Sailor LVCV, au nom d'Aldebaran, je vais vous punir !!!

Hors ligne

 

#5 07-07-2009 08:35:14

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: Fonction de jours fériés

salut
Cela peut toujours etre interessant ...


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#6 07-07-2009 08:50:00

pick ouic  
La bourse ou la vie ^^
Award: gearotter
Lieu: Massy-Verrières
Date d'inscription: 29-05-2006
Messages: 4658
Pépites: 942
Banque: 2,147,483,647
Site web

Re: Fonction de jours fériés

chez moi, c'est tous les jours....

ok, je sors   


Connaitre son ignorance est une grande part de la connaissance.
http://animegifs.free.fr/anime/mazinger/mazinger.gif

Hors ligne

 

#7 07-07-2009 10:23:01

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Fonction de jours fériés

voilà quelques fonctions utiles pour Oracle (facilement traduisibles en PB) :

Code: mssql

/* 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 ;

N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#8 08-07-2009 10:34:00

Sailor LVCV  
N2I power
Lieu: Vigneux sur Seine
Date d'inscription: 04-03-2008
Messages: 54
Pépites: 1,253
Banque: 0

Re: Fonction de jours fériés

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 ;)

Code: sql

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 :

Code: sql

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 :

Code: sql

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 :

Code: sql

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 :

Code: sql

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)


Moi, Sailor LVCV, au nom d'Aldebaran, je vais vous punir !!!

Hors ligne

 

#9 08-07-2009 12:34:55

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: Fonction de jours fériés


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...


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22