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 |