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

SQL Oracle Discussion :

Faire un calendrier avec les jours correspondant


Sujet :

SQL Oracle

  1. #1
    Invité
    Invité(e)
    Faire un calendrier avec les jours correspondant
    Bonjour,
    aidez moi s'il vous plait.
    Je vais faire un calendrier et mon souci ce de rendre les jours dynamiques en fonction du changement du moi.
    Je vais à ce que par exemple si le premier ( 1er ) de ce moi est un Mardi, que sa m'affiche le 1er et le jour "Mardi".
    j'ai déjà fait le calendrier , c la correspondance aux jours qui reste.



    Merci d'avance!!!





    Cordialement!

  2. #2
    Membre éclairé
    Bonjour,

    Quel genre de calendrier? C'est dans un IHM? En requête SQL? Pourriez-vous donner plus de détails?
    Merci

  3. #3
    Invité
    Invité(e)
    Bonjour,
    le calendrier c'est un planning.C'est à dire pour chaque mois.
    Quand je deroule ma liste des mois de l'année pour choisir le mois en cours, il doit m'afficher du 1er du mois au 30 ou 31 et je vais à ce que sa m'affiche les jours correspondant.



    merci!

  4. #4
    Invité
    Invité(e)
    C'est dans une procedure pl/sql.

  5. #5
    Expert éminent
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT LEVEL, TO_CHAR(TO_DATE('01.'|| :p_mois, 'DD.MM.RRRR') + LEVEL - 1, 'FMDay', 'NLS_DATE_LANGUAGE=French') jour
    FROM dual
    CONNECT BY LEVEL <= EXTRACT(DAY FROM LAST_DAY(TO_DATE('01.'|| :p_mois, 'DD.MM.RRRR')))

    Avec :p_mois = 'Mois.Année' exemple '09.2020'

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    LEVEL	JOUR
    1	Mardi
    2	Mercredi
    3	Jeudi
    ...
    28	Lundi
    29	Mardi
    30	Mercredi
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Expert éminent sénior
    bonjour,

    Comme ceci ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with tab1(Cnum, Cdat) as
        (select 1
              , cast('01-JAN-20' as date)
         from dual
         union all
         select Cnum + 1
              , Cdat + interval '-1' day
         from tab1
         where Cnum <100
        )
    select Cdat
         , TO_CHAR(Cdat, 'DY') as Xdat
         , case when substr(TO_CHAR(Cdat), 01, 02)='01' then 1 else 0 end as Prem
    from tab1

  7. #7
    Invité
    Invité(e)
    Bonjour Mr McM,
    Merci.

    Avec cette procedure comment je peux l'inserer?

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
       PROCEDURE proc_dates_mois IS
     
      cursor c_calendrier is
      select *
      from CALENDRIER
      where annee=:ENTETE.ANNEE
      AND mois=:ENTETE.MOIS;
     
      r_calendrier c_calendrier%ROWTYPE;
     
      v_premier date;
      v_dernier varchar2(10);
      v_date_dernier number;
      v_date number;
      v_date_jour date;
      v_jour_premier number;
     
    BEGIN
     
     if :entete.mois is not null and :entete.annee is not null then
    			 go_block('DATES');
    			 clear_block;
     
    	select to_date('01/'||:entete.mois||'/'||:entete.annee,'DD/MM/YYYY') into v_premier
      from dual;
     
      v_dernier := f_date_dernier_jour(:ENTETE.MOIS);
      v_date_dernier := v_dernier;
      v_jour_premier := to_char(v_premier,'D');
     
     end if; 
      -- Determination du Jour du 1er du mois : Jour de la semaine sur lequel tombe ler du mois
     
      if v_jour_premier = 1 then :j1 := 1;
    	  elsif v_jour_premier = 2 then :j2 := 1 ;
    	  elsif v_jour_premier = 3 then :j3 := 1 ;
    	  elsif v_jour_premier = 4 then :j4 := 1 ;
    	  elsif v_jour_premier = 5 then :j5 := 1 ;
    	  elsif v_jour_premier = 6 then :j6 := 1 ;
    	  elsif v_jour_premier = 7 then :j7 := 1 ; 
      end if;
     
     
      FOR v_date in 2..31
      LOOP
      	if v_jour_premier + v_date - 1 = 2 then :j2 := v_date;
      	elsif v_jour_premier + v_date - 1 = 3 then :j3 := v_date;
      	elsif v_jour_premier + v_date - 1 = 4 then :j4 := v_date;
      	elsif v_jour_premier + v_date - 1 = 5 then :j5 := v_date;
      	elsif v_jour_premier + v_date - 1 = 6 then :j6 := v_date;
      	elsif v_jour_premier + v_date - 1 = 7 then :j7 := v_date;
      	elsif v_jour_premier + v_date - 1 = 8 then :j8 := v_date;
      	elsif v_jour_premier + v_date - 1 = 9 then :j9 := v_date;
      	elsif v_jour_premier + v_date - 1 = 10 then :j10 := v_date;
      	elsif v_jour_premier + v_date - 1 = 11 then :j11 := v_date;
      	elsif v_jour_premier + v_date - 1 = 12 then :j12 := v_date;
      	elsif v_jour_premier + v_date - 1 = 13 then :j13 := v_date;
      	elsif v_jour_premier + v_date - 1 = 14 then :j14 := v_date;
      	elsif v_jour_premier + v_date - 1 = 15 then :j15 := v_date;
      	elsif v_jour_premier + v_date - 1 = 16 then :j16 := v_date;
      	elsif v_jour_premier + v_date - 1 = 17 then :j17 := v_date;
      	elsif v_jour_premier + v_date - 1 = 18 then :j18 := v_date;
      	elsif v_jour_premier + v_date - 1 = 19 then :j19 := v_date;
      	elsif v_jour_premier + v_date - 1 = 20 then :j20 := v_date;
      	elsif v_jour_premier + v_date - 1 = 21 then :j21 := v_date;
      	elsif v_jour_premier + v_date - 1 = 22 then :j22 := v_date;
      	elsif v_jour_premier + v_date - 1 = 23 then :j23 := v_date;
      	elsif v_jour_premier + v_date - 1 = 24 then :j24 := v_date;
      	elsif v_jour_premier + v_date - 1 = 25 then :j25 := v_date;
      	elsif v_jour_premier + v_date - 1 = 26 then :j26 := v_date;
      	elsif v_jour_premier + v_date - 1 = 27 then :j27 := v_date;
      	elsif v_jour_premier + v_date - 1 = 28 then :j28 := v_date;
      	elsif v_jour_premier + v_date - 1 = 29 then :j29 := v_date;
      	elsif v_jour_premier + v_date - 1 = 30 then :j30 := v_date;
      	elsif v_jour_premier + v_date - 1 = 31 then :j31 := v_date;
      	elsif v_jour_premier + v_date - 1 = 32 then :j32 := v_date;
      	elsif v_jour_premier + v_date - 1 = 33 then :j33 := v_date;
      	elsif v_jour_premier + v_date - 1 = 34 then :j34 := v_date;
      	elsif v_jour_premier + v_date - 1 = 35 then :j35 := v_date;
      	elsif v_jour_premier + v_date - 1 = 36 then :j36 := v_date;
      	elsif v_jour_premier + v_date - 1 = 37 then :j37 := v_date;	
      	end if;
     
      	exit when v_date = to_number(v_date_dernier);
      END LOOP;
     
     
      open c_calendrier;
      fetch c_calendrier into r_calendrier;
     
      if c_calendrier%notfound then
      	 insert into CALENDRIER
         values (:ENTETE.ANNEE, :ENTETE.MOIS,
    	 :j1,:j2,:j3,:j4,:j5,:j6,:j7,:j8,:j9,:j10,:j11,:j12,:j13,:j14,:j15,:j16,:j17,:j18,:j19,:j20,:j21,:j22, 
      				:j23,:j24,:j25,:j26,:j27,:j28,:j29,:j30,:j31,:j32,:j33,:j34,:j35,:j36,:j37); 
      				commit;
      end if;
     
      close c_calendrier;
     
    end;





    cordialement!

  8. #8
    Expert éminent
    La définition de ta table calendrier modifie la façon de gérer, vu que tu gères par semaine
    D'autre part, c'est inutile de faire tous les calculs pour arriver à ton test sur Calendrier%Not_found
    Evite les curseurs pour vérifier l'existence d'une ligne dans une table : Soit tu fais un select exception when no_data_found, soit tu insères et tu gères l'exception DUP_VAL_ON_INDEX

    Voici une façon de faire, l'autre façon c'est avec PIVOT, mais vu que j'ai l'impression que tu es sous Forms, pas sûr que ça fonctionne.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    DECLARE
    	v NUMBER;
    BEGIN
      SELECT 1 INTO v
      FROM CALENDRIER
      WHERE annee = :ENTETE.ANNEE
      AND mois = :ENTETE.MOIS;
     
    	INSERT INTO CALENDRIER(....)
      SELECT :ENTETE.ANNEE, :ENTETE.MOIS, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15, j16, j17, j18, j19, j20, j21, j22, j23, j24, j25, j26, j27, j28, j29, j30, j31, j32, j33, j34, j35, j36, j37
      FROM (
      SELECT num, 
            lead(jj, 0) OVER (ORDER BY num) j1, 	lead(jj, 1) OVER (ORDER BY num) j2, lead(jj, 2) OVER (ORDER BY num) j3, lead(jj, 3) OVER (ORDER BY num) j4, lead(jj, 4) OVER (ORDER BY num) j5, lead(jj, 5) OVER (ORDER BY num) j6, lead(jj, 6) OVER (ORDER BY num) j7,
            lead(jj, 7) OVER (ORDER BY num) j8, 	lead(jj, 8) OVER (ORDER BY num) j9, lead(jj, 9) OVER (ORDER BY num) j10, lead(jj, 10) OVER (ORDER BY num) j11, lead(jj, 11) OVER (ORDER BY num) j12, lead(jj, 12) OVER (ORDER BY num) j13, lead(jj, 13) OVER (ORDER BY num) j14,
            lead(jj, 14) OVER (ORDER BY num) j15, lead(jj, 15) OVER (ORDER BY num) j16, lead(jj, 16) OVER (ORDER BY num) j17, lead(jj, 17) OVER (ORDER BY num) j18, lead(jj, 18) OVER (ORDER BY num) j19, lead(jj, 19) OVER (ORDER BY num) j20, lead(jj, 20) OVER (ORDER BY num) j21,
            lead(jj, 21) OVER (ORDER BY num) j22, lead(jj, 22) OVER (ORDER BY num) j23, lead(jj, 23) OVER (ORDER BY num) j24, lead(jj, 24) OVER (ORDER BY num) j25, lead(jj, 25) OVER (ORDER BY num) j26, lead(jj, 26) OVER (ORDER BY num) j27, lead(jj, 27) OVER (ORDER BY num) j28,
            lead(jj, 28) OVER (ORDER BY num) j29, lead(jj, 29) OVER (ORDER BY num) j30, lead(jj, 30) OVER (ORDER BY num) j31, lead(jj, 31) OVER (ORDER BY num) j32, lead(jj, 32) OVER (ORDER BY num) j33, lead(jj, 33) OVER (ORDER BY num) j34, lead(jj, 34) OVER (ORDER BY num) j35, lead(jj, 35) OVER (ORDER BY num) j36,
            lead(jj, 36) OVER (ORDER BY num) j37
      FROM (
        SELECT LEVEL num,
            CASE WHEN TO_CHAR(TRUNC(TO_DATE('01.'|| :ENTETE.MOIS ||'.'|| :ENTETE.ANNEE, 'DD.MM.RRRR'), 'IW') + LEVEL - 1, 'MM.RRRR') = :ENTETE.MOIS ||'.'|| :ENTETE.ANNEE	
                  THEN EXTRACT( DAY FROM TRUNC(TO_DATE('01.'|| :ENTETE.MOIS ||'.'|| :ENTETE.ANNEE, 'DD.MM.RRRR'), 'IW') + LEVEL - 1) ELSE NULL END jj
        FROM dual
        CONNECT BY LEVEL <= 37
        ))
      WHERE num = 1;
     
    	COMMIT;
     
    EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Invité
    Invité(e)
    Bonjour,
    ça n'a pas marché, il ya toujours des erreurs qui ne finissent pas au niveau de l'utilisation de LEAD( ) et OVER.
    Au faite mon premier code marche bien, le calendrier s'affiche mais mon souci ce d'ajouter un code qui permet d'afficher les jours(lundi,mardi....dimanche) dynamiquement en fonction des dates du mois choisi (par exemple si le premier c'est un mardi il doit m'afficher :Mardi et le 1er..

    voila une capture de ce qui marche avec les jours en libellé fixe par semaine







    Merci!

###raw>template_hook.ano_emploi###