API Messages (permettent de traiter les messages en pgm HLL). Déplacement de messages vers une autre PGMQ (dans la liste d'invocation) ATTENTION: Les messages *ESCAPE deviennent *DIAG + QMHMOVPM - BIN(4) clé du message (blanc = tous) - x fois CHAR(10) = type(s) de messages *COMP,*DIAG,*ESCAPE,*INFO 0 = par clé 1 à 4 si clé = blanc - BIN(4) nombre de types (0 à 4) - CHAR(10) PGMQ contenant les messages - un nom de pgm - '*' = le pgm en cours. - BIN(4) n° dans la pile 0 = le pgm en cours 1 = l'appelant x = x niveau au dessus - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). Réception de messages à partir d'une MSGQ (RCVMSG MSGQ(xxx).) + QMHRCVM - CHAR(?) variable en retour (voir les fmts API) - BIN(4) lg de la variable de retour. - CHAR(8) format pour la variable de retour. (RCVM0100 - RCVM0200) - CHAR(20) <-msgq--><--biblio--> un nom un nom *CURLIB,*LIBL (QHST non autorisé) - CHAR(10) - type de message (identique à RCVMSG) *ANY = pas de sélection sur le type *COMP,*INFO,*DIAG,*RPY,*INQ,... ces valeurs sont les seules qui > *FIRST,*LAST = positionnement permettent de relire un msg "OLD" > *NEXT,*PRV = lecture sequentielle |
- BIN(4) - clé du message blanc = pas de sélection sur la clé. *TOP = à utiliser avec type *NEXT (premier message) une clé= sélection d'un message. suivant le type indiqué au dessus blanc - clé = le message ayant cette clé *NEXT - clé = le message qui suit cette clé. *PRV - clé = le message qui precede *RPY - clé = la réponse au message ayant cette clé (voir cours messages). *type - clé = le message ayant cette clé s'il (*info,..) est du type indiqué. - BIN(4) - Temps d'attente 0 = pas d'attente -1 = attente illimité x = nombre de secondes. - CHAR(10)- action à effectuer sur le message lu *REMOVE = l'enlever *OLD = le laisser et marquer "OLD" *SAME = ne rien faire - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). Réception de messages à partir d'une PGMQ (RCVMSG PGMQ(xxx).) + QMHRCVPM - CHAR(?) variable en retour (voir les fmts API) - BIN(4) lg de la variable de retour. - CHAR(8) format pour la variable de retour. (RCVM0100 - RCVM0200) - CHAR(10) un nom de pgm servant de référence. * le pgm en cours *EXT l'external (JOBMSGQ) - BIN(4) n° dans la pile 0 = le pgm indiqué en nom-pgm. 1 = l'appelant du pgm indiqué. x = x niveau au dessus du pgm indiqué |
- CHAR(10) - type de message (identique à RCVMSG) *ANY = pas de sélection sur le type *COMP,*INFO,*DIAG,*NOTIFY,*ESCAPE,... *EXCP = *ESCAPE + *NOTIFY ces valeurs sont les seules qui < *FIRST,*LAST = positionnement permettent de relire un msg "OLD" < *NEXT,*PRV = lecture sequentielle - BIN(4) - clé du message blanc = pas de sélection sur la clé. *TOP = à utiliser avec type *NEXT (premier message) une clé= sélection d'un message. suivant le type indiqué au dessus blanc - clé = le message ayant cette clé *NEXT - clé = le message qui suit cette clé. *PRV - clé = le message qui precede *RPY - clé = la réponse au message ayant cette clé (voir cours messages). *type - clé = le message ayant cette clé s'il (*info,..) est du type indiqué. |
- BIN(4) - Temps d'attente 0 = pas d'attente -1 = attente illimité x = nombre de secondes. - CHAR(10)- action à effectuer sur le message lu *REMOVE = l'enlever *OLD = le laisser et marquer "OLD" *SAME = ne rien faire - CHAR(?) Zone de retour d'erreur Comme sur la commande CL RCVMSG: les message *EXCP sont reçus LIFO les autres types sont reçus FIFO. |
API Messages (permettent de traiter les messages en pgm HLL). suppression de message(s) d'une MSGQ (RMVMSG) + QMHRMVM - CHAR(20) <-msgq--><--biblio--> un nom un nom *CURLIB,*LIBL - BIN(4) clé du message obligatoire si *BYKEY sinon à blanc. - CHAR(10) messages à enlever *BYKEY celui ayant la clé indiquée *ALL tous les messages *KEEPUNANS tous sauf les question restées sans réponse. *NEW tous les messages non reçus *OLD tous les messages déja reçus. - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). suppression de message(s) d'une PGMQ (RMVMSG) + QMHRMVPM - CHAR(10) un nom de pgm servant de référence. * le pgm en cours *ALLINACT pgmq des pgms inactifs. *EXT l'external (JOBMSGQ) - BIN(4) n° dans la pile 0 = le pgm indiqué en nom-pgm 1 = l'appelant du pgm indiqué. x = x niveau au dessus du pgm indiqué. Ce paramètre est ignoré si *BYKEY,*ALLINACT,*EXT - BIN(4) clé du message obligatoire si *BYKEY sinon à blanc. |
- CHAR(10) messages à enlever *BYKEY celui ayant la clé indiquée *ALL tous les messages *KEEPRQS tous sauf les messages *RQS *NEW tous les messages non reçus *OLD tous les messages déja reçus. - CHAR(?) Zone de retour d'erreur Renvoi le dernier message *ESCAPE reçu par un pgm vers l'appelant, toujours de type *ESCAPE. + QMHRSNEM - BIN(4) clé du message à blanc = le dernier message de type *ESCAPE reçu. - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). Retrouve la définition d'un message. (RTVMSG) + QMHRTVM - CHAR(?) variable en retour (voir les fmts API) - BIN(4) lg de la variable de retour. - CHAR(8) format pour la variable de retour. (RTVM0100 à RTVM0400) - CHAR(7) ID message (ignoré si option=*FIRST) - CHAR(20) <-msgf--><--biblio--> un nom un nom *CURLIB,*LIBL - CHAR(?) - données pour remplacer les variables de substitution. (MSGDTA) - BIN(4) - longueur des données. (0 à 32767) |
- CHAR(10) - remplacer les variables de substitution (&1,&2,..) par les données du message ? *YES / *NO - CHAR(10) - renvoyer les caractères de mise en forme (&N,..) du message ? *YES / *NO - CHAR(?) Zone de retour d'erreur groupe optionnel - CHAR(10) option d'extraction *MSGID = message extrait selon la clé *NEXT = message extrait est celui qui suit la clé. *FIRST = on extrait la première clé. |
...................................................................... : Pour lire séquentiellement un fichier message : : : : : - il faut la première fois mettre *FIRST dans ce paramètre : : (MSGID est ignoré) : : : : - puis mettre la clé du message que l'on vient de lire dans MSGID : : et utiliser l'option *NEXT, et ainsi de suite ... : :....................................................................: - BIN(4) CCSID du texte à retourner 0 = CCSID du job, sinon indiquez un n°. - BIN(4) CCSID des données fournies (idem) |
API Messages (permettent de traiter les messages en pgm HLL). Réception de messages *RQS PRATIQUE POUR (RCVMSG PGMQ(*EXT).) GERER F9 sur une ligne de cde. + QMHRTVRQ - CHAR(?) variable en retour (voir les fmts API) - BIN(4) lg de la variable de retour. - CHAR(10) format pour la variable de retour. (RTVQ0100 - RTVQ0200) - CHAR(10) quel message ? *FIRST le premier de type *RQS *LAST le dernier *NEXT celui qui suit le message indentifié par la clé. *PRV celui qui précéde la clé - BIN(4) clé du message, à blanc p *FIRST,*LAST - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). envoi un message en BREAK (SNDBRKMSG) + QMHSNDBM - CHAR(?) texte du message - BIN(4) lg du texte - CHAR(10) type de message *INFO *INQ (nécessite une réponse). - x fois CHAR(20) <--msgq--><--biblio--> un nom un nom ou *CURLIB,*LIBL ou *ALLWS - BIN(4) nbr de message queue. - CHAR(20) MSGQ recevant la réponse (si *INQ) <--msgq--><--biblio--> ou *LIBL ou *PGMQ (= PGMQ de ce pgm) - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). envoi un message à une MSGQ (SNDPGMMSG TOMSGQ(xxx).) + QMHSNDM - CHAR(7) ID message - CHAR(20) <-msgf--><--biblio--> un nom un nom *CURLIB,*LIBL - CHAR(?) - données pour les variables de substi- tution. (MSGDTA) ou texte (MSG) - BIN(4) - longueur des données. MSGDTA = 0 à 32767,MSG = 0 à 512. - CHAR(10) - type de message *COMP,*DIAG,*INFO *INQ |
- x fois CHAR(20) <--msgq--><--biblio--> un nom un nom ou *CURLIB,*LIBL ou *ALLACT *REQUESTER (inter=user,batch=qsysopr) *SYSOPR - BIN(4) nbr de message queue. - CHAR(20) MSGQ recevant la réponse (si *INQ) <--msgq--><--biblio--> ou *LIBL ou *PGMQ (= PGMQ de ce pgm) - BIN(4) clé du message EN RETOUR. la réponse ayant même clé que la question à laquelle elle repond,il faudra utiliser cette variable pour la recevoir. - CHAR(?) Zone de retour d'erreur |
API Messages (permettent de traiter les messages en pgm HLL). envoi un message à une PGMQ (SNDPGMMSG TOPGMQ(xxx).) + QMHSNDPM - CHAR(7) ID message - CHAR(20) <-msgf--><--biblio--> un nom un nom *CURLIB,*LIBL - CHAR(?) - données pour les variables de substi- tution. (MSGDTA) ou texte (MSG) - BIN(4) - longueur des données. MSGDTA = 0 à 32767,MSG = 0 à 512. - CHAR(10) - type de message *COMP *DIAG *INFO |
*INQ (seulement à l'external) *NOTIFY (question à un pgm) *STATUS (dans *EXT le message apparait en bas d'écran) *ESCAPE ATTENTION ==> FIN du PGM *RQS (voir cours messages) - CHAR(10) un nom de pgm servant de référence. * le pgm en cours *EXT l'external - BIN(4) n° dans la pile 0 = le pgm indiqué en nom-pgm 1 = l'appelant du pgm indiqué. x = x niveau au dessus du pgm indiqué. - BIN(4) clé du message EN RETOUR. - idem QMHSNDM - CHAR(?) Zone de retour d'erreur |
Quelques exemples d'utilisation en RPG: * déclarations communes E MTYP 2 10 IMSGTB DS I 1 20 MTYP IMSGDS DS I 1 10 MSGF I 11 20 MSGL I 1 20 MSGFL I B 21 240LENTXT I B 25 280STACK I B 29 320KEY I B 33 360NBTYP ICODERR DS I I 16 B 1 40LGCOD I B 5 80LGUTIL I 9 15 MSGID I 16 16 RESERV |
* gestion des erreurs en cas de probleme ............... * * EN CAS D'ERREUR ==> RENVOI DES MESSAGES ET CANCEL DU PGM * C *PSSR BEGSR C MOVEL'*DIAG' MTYP,1 C MOVEL'*ESCAPE' MTYP,2 C CALL 'QMHMOVPM' C PARM MSGCLE 4 C PARM MSGTB C PARM 2 NBTYP C PARM '*' PGMQ 10 C PARM 1 STACK C PARM CODERR C ENDSR'*CANCL' |
* envoi de message *STATUS dans l'external I 'Liste en cours..' C MTX I 'Liste terminée ' C MTX2 C MOVEL'QCPFMSG' MSGF C MOVEL'*LIBL' MSGL C MOVELMTX MSGTXT C CALL 'QMHSNDPM' C PARM 'CPF9898' ID 7 C PARM MSGFL C PARM MSGTXT 50 C PARM 50 LENTXT C PARM '*STATUS' MSGTYP 10 C PARM '*EXT' PGMQ 10 C PARM 0 STACK C PARM KEY C PARM CODERR * sous programme de chargement C EXSR ---- * |
C MOVELMTX2 MSGTXT C CALL 'QMHSNDPM' C PARM 'CPF9898' ID 7 C PARM MSGFL C PARM MSGTXT 50 C PARM 50 LENTXT C PARM '*STATUS' MSGTYP 10 C PARM '*EXT' PGMQ 10 C PARM 0 STACK C PARM KEY C PARM CODERR * supprime tous les messages reçus entre deux affichages * (DSPF avec sous-fichier message) C CALL 'QMHRMVPM' C PARM '*' PGMQ 10 C PARM 0 STACK C PARM KEY C PARM '*ALL' RMVOPT 10 C PARM CODERR |
* * exemple en RPG-IV, retrouve le nom du pgm appellant * Dbinaire S 10I 0 DLENTXT S like(binaire) DSTACK S like(binaire) DKEY S like(binaire) DATTENTE S like(binaire) DCODERR DS D LGCOD like(binaire) INZ(16) D LGUTIL like(binaire) D MSGID 7 D RESERV 1 * * on envoi un message au programme au-dessus (stack = 1) * et on le relit (dans les infos retournées il y a le nom du pgm) * |
C CALL 'QMHSNDPM' C PARM ID 7 C PARM MSGFL 20 C PARM 'peu importe' MSGTXT 10 C PARM 10 LENTXT C PARM '*INFO ' MSGTYP 10 C PARM '*' PGMQ 10 C PARM 1 STACK C PARM KEY C PARM CODERR C CALL 'QMHRCVPM' C PARM retour 120 C PARM 120 lentxt C PARM 'RCVM0200' format 8 C PARM '*' PGMQ 10 C PARM 1 STACK C PARM '*ANY' MSGTYP C PARM KEY C PARM 0 ATTENTE C PARM '*REMOVE' ACTION 10 C PARM CODERR c eval pgm = %subst(retour:111:10) |
* * le même exemple en RPG-IV, sous forme d'une fonction * H nomain * prototype de la fonction * * (tout programme utilisant la fonction doit lui-même * contenir les deux lignes qui suivent) Dquiappel PR 10 D 10I 0 * corps de la fonction Pquiappel B export D PI 10 D niveau 10I 0 * variables locales Dbinaire S 10I 0 |
DLENTXT S like(binaire) DSTACK S like(binaire) DKEY S like(binaire) DATTENTE S like(binaire) DCODERR DS D LGCOD like(binaire) INZ(16) D LGUTIL like(binaire) D MSGID 7 D RESERV 1 * * on envoi un message au programme au-dessus (stack = 1) * et on le relit (dans les infos retournées il y a le nom du pgm) * * on rajoute UN pour tenir compte de la place occupée par le pgm * utilisant lui même la fonction. c eval stack = niveau + 1 C CALL 'QMHSNDPM' |
C PARM ID 7 C PARM MSGFL C PARM 'peu importe' MSGTXT 10 C PARM 10 LENTXT C PARM '*INFO ' MSGTYP 10 C PARM '*' PGMQ 10 C PARM STACK C PARM KEY C PARM CODERR C CALL 'QMHRCVPM' C PARM retour 120 C PARM 120 lentxt C PARM 'RCVM0200' format 8 C PARM '*' PGMQ 10 C PARM 1 STACK C PARM '*ANY' MSGTYP C PARM KEY C PARM 0 ATTENTE C PARM '*REMOVE' ACTION 10 C PARM CODERR c return %subst(retour:111:10) Pquiappel E |