Accueil du site > Les articles > Générer un calendrier en RPG
Version à imprimer Enregistrer au format PDF

Générer un calendrier en RPG

jeudi 22 décembre 2005, par Serge Gomes Visites  20890

Exemple de programme RPG (GENCAL) permettant de générer un fichier calendrier (CALEND).

Description du fichier CALEND
— DAT_CAL date (ymd)
— NUM_JOUR N° du jour de la semaine (1=Lundi...7=Dimanche)
— JOU_OUV O=jour ouvré N=jour non-ouvré. Une chaine de 7 caractères correspondant chacun à un jour de la semaine est transmise au programme. Par ex « OOOOONN » pour tout les jours ouvrés sauf samedi et dimanche. JOU_FER O=Férié N=Normal. Cette zone est alimentée par défaut à « N ».
— QTIEME DEC Numéro de quantième de l’année.

Bien sur, suivant les besoins de chacun, on pourrait ajouter d’autres zones telles que N° de semaine, horaires d’ouverture ect...

- Script SQL de création du fichier CALEND

CREATE TABLE CALEND
(DAT_CAL DEC (8, 0) NOT NULL WITH DEFAULT,
 NUM_JOUR DEC (1, 0) NOT NULL WITH DEFAULT,
JOU_OUV CHAR (1) NOT NULL WITH DEFAULT,
JOU_FER CHAR (1) NOT NULL WITH DEFAULT,  
QTIEME DEC (3 , 0) NOT NULL WITH DEFAULT)                                                                      

Description du programme de génération

Le programme de génération GENCAL permet d’alimenter le fichier CALEND depuis une date de début jusqu’à une date de fin.

Il reçoit en paramètre une date de début, une date de fin ainsi qu’une chaine de 7 caractères permettant d’indiquer les jours ouvrés. Le programme, en l’état, ne fait aucune gestion d’erreur. Vous devrez donc vous assurer que les valeurs transmises correspondent à des dates valides et à une chaine de 7 caractères contenant que des « O » ou des « N ».

- Code source de GENCAL (SQLRPGLE)

      //  Serge GOMES  21/12/2006
      //-----------------------------------------------------------------------
      // Paramètres
      // Date début     8N YMD
      // Date fin        8N YMD
      // Jours Ouvrés  7A (du lundi au dimanche ex ’OOOOONN’)
      //-----------------------------------------------------------------------
YMD  Ddat1Iso          S               D   DATFMT(*ISO) INZ
YMD  Ddat2Iso          S               D   DATFMT(*ISO) INZ
     DCSTISO           S               D   DATFMT(*ISO) INZ(d’1899-12-31’)
     DW_X              S              5  0 INZ
     DW_N8             S              8  0 INZ
     DW_ouvre          S              1A   INZ
     DW_NUMJ           S              1  0 INZ
     DdatDeb           S              8  0
     DdatFin           S              8  0
     DJOUROU           S              7A
     C     *Entry        Plist
     C                   Parm                    datDeb
     C                   Parm                    datFin
     C                   Parm                    JOUROU
     C/exec sql
     C+     Set Option Commit    = *NONE,
     C+                DatFmt    = *ISO,
     C+                TimFmt    = *ISO,
     C+                DecMpt    = *COMMA
     C/end-exec
       **  Suppression préventive
     C/exec sql
     C+                DELETE FROM CALEND
     C+                 WHERE DAT_CAL >= :  datDeb AND
     C+                DAT_CAL <= :datFin
     C/end-exec
      /FREE
       dat1Iso = %date(datDeb :*iso) ;
       dat2Iso = %date(datFin :*ISO) ;
      //    N° jour => lundi=1, mardi = 2...
       W_X  = %diff(dat1Iso:CSTISO : *Days) ;
       W_NUMJ    = %rem(W_X:7) ;
       If W_NUMJ<=0 ;
         W_NUMJ=W_NUMJ+7 ;
       EndIf ;
       Dow   dat1Iso <= dat2Iso ;
         //    Jour ouvré ?
         W_ouvre = %subst(JOUROU:W_NUMJ:1) ;
         W_N8    = %dec(%char(dat1Iso :*iso0):8:0) ; 
         ExSr   MAJCAL ;
         //   Ajout 1 jour
         dat1Iso =   dat1Iso + %days(1) ;
         If W_NUMJ < 7 ;
           W_NUMJ = W_NUMJ + 1 ;
         Else ;
           W_NUMJ = 1 ;
         EndIf ;
       EndDo ;
       *INLR = *on ;
       return ;
       //-----------------------------------------------------------------------
      /END-FREE
     C     MAJCAL        BegSr
      //  Insertion Calendrier
     C/exec sql
     C+     INSERT INTO CALEND
     C+      (DAT_CAL, NUM_JOUR, JOU_OUV, QTIEME, JOU_FER)
     C+     VALUES( :W_N8 , :W_NUMJ , :W_ouvre , 
     C+                     DAYOFYEAR(:dat1Iso),  ’N’)
     C/end-exec
     C                   EndSr                                                   

- Commande d’appel de GENCAL

            CMD        PROMPT(’Génération Calendrier (CALEND)’)               
            PARM       KWD(DATDEB) TYPE(*DEC) LEN(8) MIN(1) +                 
                         PROMPT(’Date début (ymd)’)                                 
            PARM       KWD(DATFIN) TYPE(*DEC) LEN(8) MIN(1) +                 
                         PROMPT(’Date fin (ymd)’)                                  
            PARM       KWD(JOUR_O) TYPE(*CHAR) LEN(7) +                       
                         DFT(’OOOOONN’) PROMPT(’Jours ouvrés’)                

P.-S.

Pour récupérer le N° de semaine sur une date on utilisera une instruction du type :NumSem = WEEK_ISO(:DateIso) (la fonction WEEK étant adressé au date US)