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 :

Problème de logique à transcrire en PL [Débutant(e)]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 134
    Par défaut Problème de logique à transcrire en PL
    Bonjour,
    Je suis sur un problème, et je n'arrive pas à transcrire en PL/SQL cette logique suivante :
    Une personne suit une formation ou plusieurs formations.
    Une formation à une date de début de formation et une date de fin de formation et la personne peut avoir plusieurs formations sur l'année.

    la logique est la suivante :
    Si la date du jour est comprise dans une période de formation alors prendre date du jour sinon prendre la 1ère date de la prochaine période de formation :


    je récupère mes dates de formations en fonction des paramètres et je boucle sur celles ci :
    /*si la date du jour est dans la période prendre sysdate comme période de formation*/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in 1..w_t_dateFormation.count loop
       if trunc(sysdate) >=  w_t_dateFormation(i).debut and  trunc(sysdate) <= 
       w_t_dateFormation(i).fin then
        w_x_date := trunc(sysdate);
        exit;
      end if;
    end loop;
    /*si la date du jour est hors période de formation, prendre la date de la prochaine période de formation*/

    Je pense que je dois boucler à nouveau sur mes dates de formations mais ce qui me gêne, c'est comment prendre la date de la période de formation2 une fois que j'ai testé que la période de formation ne jouait pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in 1..w_t_dateFormation.count loop
       if trunc(sysdate) <=  w_t_dateFormation(i).debut and  trunc(sysdate) >= 
       w_t_dateFormation(i).fin then
        w_x_date := w_t_dateFormation(i).debut;
        exit;
      end if;
    end loop;
    Je me demandais si un between n'était pas plus approprié et je ne suis pas sur de mes bornes >= et <= selon la logique.
    De plus dans mon code, comment récupérer la bonne date du fait que je passe dans les deux boucles...désolé un peu confus.

    merci d'avance de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Je ne pense pas que tu aies besoin d'une boucle pour faire ça, c'est réalisable directement dans la requête de ton curseur

  3. #3
    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
    En simple select, l'algo est le suivant : Prendre toutes les formations en cours, plus toutes les futures formations.
    Ensuite prendre la date mini (en limitant à sysdate).

    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
    WITH F AS (SELECT 1 personne, TO_DATE('01.01.2012', 'DD.MM.RRRR') date_deb, TO_DATE('31.05.2012', 'DD.MM.RRRR') date_fin FROM dual
    UNION ALL SELECT 1 personne, TO_DATE('01.08.2012', 'DD.MM.RRRR') date_deb, TO_DATE('02.08.2012', 'DD.MM.RRRR') date_fin FROM dual
    UNION ALL SELECT 2 personne, TO_DATE('01.01.2012', 'DD.MM.RRRR') date_deb, TO_DATE('02.01.2012', 'DD.MM.RRRR') date_fin FROM dual
    UNION ALL SELECT 2 personne, TO_DATE('01.02.2012', 'DD.MM.RRRR') date_deb, TO_DATE('02.02.2012', 'DD.MM.RRRR') date_fin FROM dual
    UNION ALL SELECT 2 personne, TO_DATE('01.04.2012', 'DD.MM.RRRR') date_deb, TO_DATE('02.04.2012', 'DD.MM.RRRR') date_fin FROM dual
    )
    SELECT personne, greatest(MIN(date_deb), sysdate) date_form
    FROM F
    WHERE SYSDATE BETWEEN date_deb AND date_fin
    OR date_deb > SYSDATE
    GROUP BY personne
     
    PERSONNE	DATE_FORM
    1	29/02/2012 15:10:28
    2	01/04/2012

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

Discussions similaires

  1. problèmes de logique ! ne fait pas dans l'ordre.
    Par djibb dans le forum Tkinter
    Réponses: 3
    Dernier message: 29/05/2007, 17h06
  2. Problème de logique
    Par soso78 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 03/04/2007, 22h05
  3. Problème de logique :)
    Par deaven dans le forum Oracle
    Réponses: 1
    Dernier message: 13/10/2006, 18h49
  4. Réponses: 10
    Dernier message: 14/07/2006, 20h22
  5. Petit problème de logique...
    Par insomniak dans le forum C++
    Réponses: 15
    Dernier message: 31/10/2005, 20h13

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