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') |