Création de programmes de service
Lorsque l’on crée un programme de service il est intéressant de classer les procédures utilisées dans différents modules afin de faciliter une maintenance future. On peut regrouper par exemple les procédures par fonctionnalité métier (prise de commandes, rangement, calculs de taux,… ) ou par proximité technique (manipulation de chaines de caractères, calcul d’un modulo, manipulation de dates,… ). Dans l’article intitulé « CONTROLER IBAN & RIB » on regroupe les deux fonctions bancaires au sein d’une même procédure.
Lorsque l’on veut créer un programme de service il faut procéder en deux temps :
- Créer les modules contenant les procédures et fonctions
CRTSQLRPGI OBJ(MyLibrary/MyModuleXX) SRCFILE(MyLibrary/MySRCPF) SRCMBR(MyModuleXX) OBJTYPE(MODULE) REPLACE(YES) DBGVIEW(*SOURCE)
- Créer le programme de service qui intègrera les modules
CRTSRVPGM SRVPGM(MyLibrary/MyServicePGM) MODULE(MyLibrary/MyModule0 MyLibrary/MyModule1 MyLibrary/MyModule2 MyLibrary/MyModule3 MyLibrary/MyModule4) EXPORT(*SRCFILE) SRCFILE(MyLibrary/QSRVSRC) SRCMBR(MySrcMBR)
Nous vous proposons donc de créer une fonction qui permettra d’enchainer ces deux opérations (nous nous limiterons à la possibilité d’agréger 10 modules dans un programme de service)
Présentation de la commande
Cette commande permet de saisir plusieurs modules et de les intégrer directement dans un programme de service
On peut également ajouter un répertoire de liage, si besoin
Source de la commande
CMD PROMPT('Création Programme de Service') PARM KWD(SRVPGM) TYPE(Q0) MIN(1) PROMPT('Programme de service ') Q0: QUAL TYPE(*NAME) LEN(10) MIN(1) QUAL TYPE(*NAME) LEN(10) DFT(*CURLIB) SPCVAL((*CURLIB)) MIN(0) + PROMPT('Bibliothèque ') PARM KWD(SRVSRC) TYPE(Q1) PROMPT('Fichier source d''exportation') Q1: QUAL TYPE(*NAME) LEN(10) DFT(QSRVSRC) MIN(0) QUAL TYPE(*NAME) LEN(10) DFT(*CURLIB) SPCVAL((*CURLIB)) MIN(0) + PROMPT('Bibliothèque ') QUAL TYPE(*NAME) LEN(10) DFT(*SRVPGM) SPCVAL((*SRVPGM)) MIN(0) + PROMPT('Membre source d''exportation') PARM KWD(MODULE) TYPE(*NAME) LEN(10) MAX(10) PROMPT('Modules du Programme ') PARM KWD(SRCFIL) TYPE(*NAME) LEN(10) MIN(0) DFT(QRPGLESRC) PROMPT('Fichier + source Programme ') PARM KWD(ONBNDDIR) TYPE(*CHAR) LEN(1) MIN(0) PROMPT('Répertoire de Liage O/N ') PARM KWD(BNDDIR) TYPE(*NAME) LEN(10) MIN(0) PMTCTL(LIAGE) + PROMPT('Répertoire de Liage ') LIAGE: PMTCTL CTL(SRCFIL) COND((*NE '')) NBRTRUE(*ALL) PMTCTL CTL(SRVSRC) COND((*NE '')) NBRTRUE(*ALL) LGLREL(*AND) PMTCTL CTL(ONBNDDIR) COND((*EQ 'O')) NBRTRUE(*ALL) LGLREL(*AND) LIAG2: PMTCTL CTL(ONBNDDIR) COND((*EQ 'O') (*EQ 'N')) NBRTRUE(*EQ 1)
Programme de controle
PGM PARM(&SRVPGMLIB &SRVBIBMBR &MODULE &SRCFIL + &ONBNDDIR &BNDDIR) DCL VAR(&VAR1) TYPE(*INT) LEN(2) DCL VAR(&POS) TYPE(*INT) LEN(2) DCL VAR(&CPT) TYPE(*INT) LEN(2) DCL VAR(&SRVPGMLIB) TYPE(*CHAR) LEN(20) DCL VAR(&SRVPGM) TYPE(*CHAR) STG(*DEFINED) LEN(10) + DEFVAR(&SRVPGMLIB 1) DCL VAR(&SRVLIB) TYPE(*CHAR) STG(*DEFINED) LEN(10) + DEFVAR(&SRVPGMLIB 11) DCL VAR(&SRVBIBMBR) TYPE(*CHAR) LEN(30) DCL VAR(&SRVFIC) TYPE(*CHAR) STG(*DEFINED) LEN(10) + DEFVAR(&SRVBIBMBR 1) DCL VAR(&SRVBIB) TYPE(*CHAR) STG(*DEFINED) LEN(10) + DEFVAR(&SRVBIBMBR 11) DCL VAR(&SRVMBR) TYPE(*CHAR) STG(*DEFINED) LEN(10) + DEFVAR(&SRVBIBMBR 21) DCL VAR(&MODULE) TYPE(*CHAR) LEN(102) DCL VAR(&VALMOD) TYPE(*CHAR) LEN(10) DCL VAR(&SRCFIL) TYPE(*CHAR) LEN(10) DCL VAR(&ONBNDDIR) TYPE(*CHAR) LEN(1) DCL VAR(&BNDDIR) TYPE(*CHAR) LEN(10) DCL VAR(&LSTMOD) TYPE(*CHAR) LEN(250) DCL VAR(&COMMANDE) TYPE(*CHAR) LEN(500) /* Initialiser les variables */ CHGVAR VAR(&VAR1) VALUE(%BIN(&MODULE 1 2)) IF COND(&SRVLIB *EQ '*CURLIB') THEN(RTVJOBA + CURLIB(&SRVLIB)) /* Extraction de chaque poste */ DOFOR VAR(&CPT) FROM(1) TO(&VAR1) CHGVAR VAR(&POS) VALUE(3 + (&CPT - 1) * 10) CHGVAR VAR(&VALMOD) VALUE(%SST(&MODULE &POS 10)) CRTSQLRPGI OBJ(&SRVLIB/&VALMOD) SRCFILE(&SRVLIB/&SRCFIL) + SRCMBR(&VALMOD) OBJTYPE(*MODULE) + REPLACE(*YES) DBGVIEW(*SOURCE) CHGVAR VAR(&LSTMOD) VALUE(%TRIM(&LSTMOD) !! ' ' !! + %TRIM(&SRVLIB) !! '/' !! %TRIM(&VALMOD)) ENDDO CHGVAR VAR(&COMMANDE) VALUE('CRTSRVPGM SRVPGM(' !! + %TRIM(&SRVLIB) !! '/' !! %TRIM(&SRVPGM) !! ') + MODULE(' !! %TRIM(&LSTMOD) !! ') + EXPORT(*SRCFILE) SRCFILE(' !! %TRIM(&SRVBIB) !! + '/' !! %TRIM(&SRVFIC) !! ') SRCMBR(' !! + %TRIM(&SRVMBR) !! ')') CALL PGM(QCMDEXC) PARM(&COMMANDE %LEN(&COMMANDE)) IF COND(&ONBNDDIR = 'O') THEN(DO) CHKOBJ OBJ(&SRVLIB/&BNDDIR) OBJTYPE(*BNDDIR) MONMSG MSGID(CPF9801) EXEC(CRTBNDDIR + BNDDIR(&SRVLIB/&BNDDIR)) ADDBNDDIRE BNDDIR(&SRVLIB/&BNDDIR) OBJ((&SRVLIB/&SRVPGM)) ENDDO ENDPGM