Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/09/2011, 18h45   #1
Nouveau Membre du Club
 
Femme Kali
Inscription : septembre 2008
Messages : 130
Détails du profil
Informations personnelles :
Nom : Femme Kali
Localisation : France

Informations forums :
Inscription : septembre 2008
Messages : 130
Points : 33
Points : 33
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 :
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 :
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.
prugne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2012, 15h02   #2
Membre confirmé
 
Inscription : février 2012
Messages : 203
Détails du profil
Informations forums :
Inscription : février 2012
Messages : 203
Points : 267
Points : 267
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
Scriuiw est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/02/2012, 15h12   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
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 :
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
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h27.


 
 
 
 
Partenaires

Hébergement Web