
|
Exemples d'utilisation de messages dans des pgm CL
/* ENVOI DE MESSAGE *INFO DANS L'EXTERNAL */
SNDPGMMSG MSG('file d''attente message associée à un +
autre travail') TOPGMQ(*EXT) MSGTYPE(*INFO)
/* ENVOI DE MESSAGE *COMP SUITE à UN TRAITEMENT */
SNDPGMMSG MSG('traitement effectué') TOPGMQ(*PRV *) +
MSGTYPE(*COMP)
/* ENVOI D'UN MESSAGE D'ERREUR */
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('texte +
de l''erreur') TOPGMQ(*PRV *) +
MSGTYPE(*ESCAPE)
|
/* ENVOI D'UNE QUESTION AVEC ATTENTE MAXI DE 2 MINUTES */
SNDPGMMSG MSG('texte de la question') TOMSGQ(QSYSOPR) +
MSGTYPE(*INQ) RPYMSGQ(*PGMQ) KEYVAR(&CLE)
RCVMSG PGMQ(*SAME *) MSGTYPE(*RPY) MSGKEY(&CLE) +
WAIT(120) MSG(&REPONSE)
/* PAS DE REPONSE AU BOUT DE 120 SECONDES */
IF (&REPONSE = ' ') THEN(CHGVAR &REPONSE 'DFT')
/* SYNCHRONISATION DE 2 JOBS VIA UNE MSGQ, lancez JOB2 en premier ! */
JOB1: SNDPGMMSG MSG('question') TOMSGQ(MQSYNCHRO) +
MSGTYPE(*INQ) RPYMSGQ(MQSYNCHRO) KEYVAR(&CLE)
RCVMSG MSGQ(MQSYNCHRO) MSGTYPE(*RPY) MSGKEY(&CLE) +
WAIT(*MAX) MSG(&REPONSE)
JOB2: RCVMSG MSGQ(MQSYNCHRO) MSGTYPE(*INQ) WAIT(*MAX) +
KEYVAR(&CLE) RMVMSG(*NO)
SNDRPY MSGKEY(&CLE) MSGQ(MQSYNCHRO) RPY(&REPONSE)
|
/* GESTION DE MESSAGES STANDARD (POUR UN CPP PAR EXEMPLE) */ PGM /* VARIABLES UTILISEES PAR LA GESTION DE MESSGAES */ DCL &ERRORSW *LGL /* SWITCH */ DCL &MSGID *CHAR LEN(7) /* ID MSG */ DCL &MSGDTA *CHAR LEN(100) /* DATA */ DCL &MSGF *CHAR LEN(10) /* FICHIER */ DCL &MSGFLIB *CHAR LEN(10) /* BIBLI */ MONMSG MSGID(CPF0000) EXEC(GOTO ERREUR) /* CORPS DU PROGRAMME */ /* RENVOI DES MESSAGES DE TYPE *COMP SI FIN NORMALE */ COMPMSG: RCVMSG MSGTYPE(*COMP) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB) IF (&MSGID *EQ ' ') RETURN /* FIN DU PGM */ SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) MSGTYPE(*COMP) GOTO COMPMSG /* BOUCLE SUR MESSAGES *COMP */ |
/*----------------------------------------*/ ERREUR: /* GESTION DES ERREURS */ /*----------------------------------------*/ IF &ERRORSW SNDPGMMSG MSGID(CPF9999) + MSGF(QCPFMSG) MSGTYPE(*ESCAPE) /* 2EME FOIS*/ /* ARRET PGM*/ CHGVAR &ERRORSW '1' /* MISE EN PLACE DU SWTICH */ /* RENVOI DES MESSAGES DE TYPE *DIAG SI FIN ANORMALE */ DIAGMSG: RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB) IF (&MSGID *EQ ' ') GOTO EXCPMSG SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) MSGTYPE(*DIAG) GOTO DIAGMSG /* BOUCLE SUR MESSAGES *DIAG */ /* RENVOI DU MESSAGE D'ERREUR */ EXCPMSG: RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE) ENDPGM |
/* ENVOI DE MESSAGES *STATUS DANS L'EXTERNAL */
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('traitement xxxxxxxx en cours') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
....
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('traitement yyyyyyyy en cours') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
....
....
SNDPGMMSG MSGID(CPI9801) MSGF(QCPFMSG) TOPGMQ(*EXT) +
MSGTYPE(*STATUS) /* EFFACE LIGNE 24 */
|
/* REQUEST-PROCESSOR */
PGM
SNDPGMMSG MSG('/* pgm xxx */') TOPGMQ(*EXT) MSGTYPE(*RQS)
RCVMSG PGMQ(*EXT) MSGTYPE(*RQS) RMV(*NO)
CALL PGMX
MONMSG CPF1907 EXEC(DO)
RCLRSC
....
ENDDO
RMVMSG PGMQ(*SAME *) CLEAR(*ALL)
CALL PGMY /* MONMSG CPF1907 INUTILE,LE PGM N'EST PLUS +
UN REQUEST-PROCESSOR */
ENDPGM
|
/* UN PSEUDO système-BATCH (LA MESSAGE QUEUE SERT DE "JOBQ") */
PGM
RCVMSG MSGQ(MQBATCH) WAIT(*MAX) RMV(*NO) MSG(&CDE)
IF (&CDE = '*FIN') RETURN /* ARRET LOGIQUE DU PGM */
SNDPGMMSG MSG(&CDE) TOPGMQ(*EXT) MSGTYPE(*RQS)
SNDPGMMSG MSG('call moi') TOPGMQ(*EXT) MSGTYPE(*RQS)
ENDPGM /* RETOUR à QCMD */
/* EXECUTION D'UN TRAITEMENT */
SNDMSG MSG('cde à exécuter') TOMSGQ(MQBATCH)
/* VISUALISATION DE LA FILE D'ATTENTE */
DSPMSG MSGQ(MQBATCH) OUTPUT(*)
|
/* UN PSEUDO ANALYSEUR DE COMMANDE */
PGM
MONMSG CPF1907 /* appel système 2 */
MONMSG MSGID(CPF6801) EXEC(GOTO ANNUL) /* annulation d'invite */
/* le pgm devient un request processor */
SNDPGMMSG MSG('/* pgm xxx */') TOPGMQ(*EXT) MSGTYPE(*RQS)
RCVMSG PGMQ(*EXT) MSGTYPE(*RQS) RMV(*NO)
DEBUT: /* ECRAN TYPE ENTREE DE COMMANDE */
CHGVAR VAR(&CMD) VALUE(' ')
RCVMSG PGMQ(*EXT) MSGTYPE(*RQS) WAIT(*MAX) RMV(*NO) KEYVAR(&KEY) +
MSG(&CMD) RTNTYPE(&RTN)
MONMSG MSGID(CPF2415) EXEC(RETURN) /* F3 OU F12 */
IF COND(&RTN *EQ '10') THEN(DO) /* F4 SUR L'ECRAN */
CHGVAR VAR(&CMD) VALUE('?' !! &CMD)
CALL PGM(QCMDCHK) PARM(&CMD 512)
MONMSG MSGID(CPF0006) EXEC(GOTO CMDLBL(DEBUT))
MONMSG MSGID(CPF0000)
|
/* LA COMMANDE (PARAMETREE PAR QCMDCHK) EST STOCKEE DANS LA LOG */ SNDPGMMSG MSG(&CMD) TOPGMQ(*EXT) MSGTYPE(*RQS) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(DEBUT)) /* ANNULATION DE LA COMMANDE SAISIE (REMPLACEE PAR AU DESSUS) */ RMVMSG PGMQ(*SAME) MSGKEY(&KEY) MONMSG MSGID(CPF0000) /* REPRISE DE CONTACT AVEC L'EXTERNAL */ RCVMSG PGMQ(*EXT) MSGTYPE(*RQS) WAIT(*MAX) RMV(*NO) MSG(&CMD) ENDDO /* Traitement de la commande reçue ou renvoyée par QCMDCHK */ CALL QCMDEXC / ou stockage pour traitement ulterieur */ GOTO DEBUT |
ANNUL: /* point d'arrivée si annulation d'une invite */ /* MESSAGE STOCKé DANS LA LOG */ SNDPGMMSG MSG(&CMD) TOPGMQ(*EXT) MSGTYPE(*RQS) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(DEBUT)) /* ANNULATION DU MESSAGE SAISI */ RMVMSG PGMQ(*SAME) MSGKEY(&KEY) MONMSG MSGID(CPF0000) /* REPRISE DE CONTACT AVEC L'EXTERNAL */ RCVMSG PGMQ(*EXT) MSGTYPE(*RQS) WAIT(0) RMV(*NO) MSG(&CMD) GOTO CMDLBL(DEBUT) ENDPGM |