IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Récuperer le prochain jour ouvrable (weekend et jour ferié)


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Par défaut Récuperer le prochain jour ouvrable (weekend et jour ferié)
    Bonjour,


    J'ai besoin de savoir la prochaine journée ouvrable en tenant compte des weekend (samedi, dimanche) et des jours fériés.

    Je dispose d'une table des jours fériés qui contient une colonne de la date, et une colonne du nombre de jours de vacances.

    Cette table contient deux lignes (deux fêtes d'un jour chacune) ayant des dates successifs : une fête le 01/10 et une autre le 02/10.
    D'autre fêtes ont deux jours de vacances.

    Les weekend je les gère comme suit :
    Code PL/SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- Prochain Jour Ouvrable .
       X_PROCHAIN_JOUR_OUVRABLE := G_DATEJOUR_D + 1;
       IF TRIM(TO_CHAR(X_PROCHAIN_JOUR_OUVRABLE,'DAY')) IN ('SAMEDI','SATURDAY') THEN 
          X_PROCHAIN_JOUR_OUVRABLE := X_PROCHAIN_JOUR_OUVRABLE + 2;
       ELSIF TRIM(TO_CHAR(X_PROCHAIN_JOUR_OUVRABLE,'D')) IN ('DIMANCHE','SUNDAY') THEN 
          X_PROCHAIN_JOUR_OUVRABLE := X_PROCHAIN_JOUR_OUVRABLE + 1;
       END IF;
    Reste la problématique des jours fériés !

    Merci pour votre aide.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Fais une boucle infinie (avec une gestion de boucle infinie au cas où) qui rajoute un jour à chaque boucle.
    Dans la boucle, tu testes le week end ou l'existence d'un jour férié. Si aucun des 2, tu sors du loop (par un exit).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    LOOP
    	v_nb := v_nb + 1; 
            IF v_nb > 365
            THEN
            	v_date := TO_DATE('99/99/99999'); -- On Force une erreur de date car il y a une boucle infinie.
            END IF;
     
            v_date := v_date + 1;
     
    		  -- Si le site est fermé, ou que c'est un jour férié, on continue.
    	 IF v_ferm1 = TRIM(TO_CHAR(v_date, 'DAY', 'NLS_DATE_LANGUAGE=French')) 
            OR v_ferm2 = TRIM(TO_CHAR(v_date, 'DAY', 'NLS_DATE_LANGUAGE=French')) 
            OR F_JOUR_FERIE(v_date)
    	THEN
    		NULL;
            ELSE
    		EXIT;
    	END IF;
    END LOOP; -- Fin boucle jour ouvert suivant.
    F_JOUR_FERIE est une fonction qui renvoie TRUE si la date est un jour férié, sinon FALSE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    BEGIN SELECT 1 INTO v FROM TABLE_JOUR_FERIE WHERE ladate = p_date; v_retour : TRUE; EXCEPTION WHEN OTHERS THEN NULL; END; 
    Return FALSE;
    Attention ton code pour le dimanche a 'D' au lieu de 'DAY', et je te conseille d'utiliser le NLS_LANG pour tester le jour SAMEDI, ça évite d'être dépendant de la base.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut
    Bonjour,

    Supposons que la table où est stockée les jours fériés est appelée TAB et ses colonnes sont C_DAT et NBR.

    Alors on commence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    -- Prochain Jour Ouvrable .
        -- compter le nombre d´entrée pour le lendemain dans la table TAB s´ils existent
       select count(*) into VC from TAB where G_Datejour_d+1=C_DATE;
     
       X_PROCHAIN_JOUR_OUVRABLE := G_DATEJOUR_D + 1;
     
       IF TRIM(TO_CHAR(X_PROCHAIN_JOUR_OUVRABLE,'DAY')) IN  ('SAMEDI','SATURDAY') and VC = 0 THEN 
          X_PROCHAIN_JOUR_OUVRABLE := X_PROCHAIN_JOUR_OUVRABLE + 2;
       ELSIF TRIM(TO_CHAR(X_PROCHAIN_JOUR_OUVRABLE,'D')) IN ('DIMANCHE','SUNDAY') AND VC = 0 THEN 
          X_PROCHAIN_JOUR_OUVRABLE := X_PROCHAIN_JOUR_OUVRABLE + 1;
       ELSIF VC = 1 THEN 
            --Affecter le champs NBR de la table tab qui contient le nombre de jours ferriée
           SELECT NBR INTO VN FROM TAB WHERE G_DATEJOUR_D + 1=C_DATE
              X_PROCHAIN_JOUR_OUVRABLE:=X_PROCHAIN_JOUR_OUVRABLE+ 1+ VN
     
                 -- SI la date du prochain jour ouvrable apres la vacance arrive le weekend
                IF TRIM(TO_CHAR(X_PROCHAIN_JOUR_OUVRABLE,'DAY')) IN    ('SAMEDI','SATURDAY') THEN 
          X_PROCHAIN_JOUR_OUVRABLE := X_PROCHAIN_JOUR_OUVRABLE + 2;
                ELSIF TRIM(TO_CHAR(X_PROCHAIN_JOUR_OUVRABLE,'D')) IN ('DIMANCHE','SUNDAY') THEN 
          X_PROCHAIN_JOUR_OUVRABLE := X_PROCHAIN_JOUR_OUVRABLE + 1;
                END IF;
       END IF;
    Si la notation des variables était moins longue, le code serait plus lisible.

  4. #4
    Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Par défaut
    Merci bcp pour votre aide.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut
    Il reste encore un cas qui n´est pas traité, celui ou le lundi (jour apres le weekend) sera un jour ferrié.

    Cad, il faut ajouter un autre ELSIF.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OpenOffice][Tableur] formule de calcul de jours ouvrables (sur 6 jours)
    Par leelou2 dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 23/05/2008, 17h45
  2. Prochain jour ouvrable
    Par aragornlor dans le forum SQL
    Réponses: 2
    Dernier message: 05/05/2008, 12h44
  3. Réponses: 4
    Dernier message: 14/03/2007, 09h25
  4. [VBA-E] Jours ouvrables
    Par vuldos dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 06/04/2005, 11h46
  5. [VB6] Avec num. de semaine, savoir le 1er et der. jour ouvrable?
    Par lololefada dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/01/2004, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo