4 RECEVOIR DES MESSAGES DANS UN PROGRAMME: ------------------------------------------ Pour recevoir des messages dans un programme, vous utiliserez la commande RCVMSG. Regardons le format de cette commande: RCVMSG PGMQ(file d'attente de msg pgm où les messages sont recherchés. 2 paramètres dans cette commande dont voici le détail: |
!-------------!-------------!-------------------! ! 1ère valeur ! 2ème valeur ! signification ! !-------------!-------------!-------------------! ! ! * ! MSG recherché dans! ! ! ! la pgmq du prog. ! ! ! ! appelant. ! ! *PRV !-------------!-------------------! ! ! nom d'1 !MSG recher. dans la! ! ! programme !pgmq du programme ! ! ! !appelant celui ! ! ! !indiqué dans la ! ! ! !2ème valeur ! !-------------!-------------!-------------------! ! ! * !MSG recher. dans la! ! ! ! pgmq du prog. ! ! ! ! passant la cde. ! ! *SAME !-------------!-------------------! ! ! nom d'1 !MSG recher. dans la! ! ! programme !pgmq du programme ! ! ! !indiqué dans la ! ! ! !2ème valeur ! !-------------!-------------!-------------------! |
! ! ! ! ! *EXT ! (sans objet)! MSG recher. dans ! ! ! ! la msgq externe ! !-------------!-------------!-------------------! MSGQ(file d'attente de message écran ou utilisateur où les messages sont recherchés) MSGTYPE(type du message *ANY [par défaut] *NEXT,*PRV [lecture séquentielle] *FIRST,*LAST [repositionnement] *INFO *INQ *RPY [réponse à un message *INQ] *COPY [copie d'un message *INQ] *COMP *DIAG *EXCP [message d'exception = *ESCAPE ou *NOTIFY] *RQS) |
MSGKEY(clé du message (renvoyée par SNDPGMMSG ou RCVMSG: *NONE *TOP nom d'une variable ) ce paramètre permet de lire en "accès direct" un message particulier. MSGTYPE(*ANY) MSGKEY(&KEY) ou de relire des messages déja lu MSGTYPE(*NEXT) MSGKEY(*TOP) -> début de pgmq MSGTYPE(*NEXT) MSGKEY(&KEY) -> message suivant WAIT( en secondes, le temps qu'attendra la commande pour recevoir le message) RMV(demande la suppression des messages reçus *NO, *YES(dft) ) |
Ces premiers paramètres permettent de faire une sélection pour recevoir un message, les paramètres que nous allons voir maintenant permettent de recevoir des informations sur le message par ex: le texte de 1er niveau, le texte de 2nd niveau le numéro d'identification du message pour les messages prédéfinis etc... . On placera les informations reçues dans des variables. KEYVAR(variable contenant la clé de référence du message reçu) MSG(variable contenant le texte de 1er niveau) MSGLEN(variable contenant la longueur du texte de 1er niveau) SECLVL(variable contenant le texte de 2nd niveau) SECLVLLEN(variable contenant la longueur du texte de 2nd niveau) MSGDTA(variable contenant la chaine de caratères des variables du message) |
MSGDTALEN(variable contenant la longueur de la chaîne de caractères) MSGID(variable contenant l'identification du message) SEV(variable contenant le code de gravité du message) SENDER(variable contenant l'identification de l'émetteur du message variable de 80 caractères au moins. les 26 premiers caractères contiendront - Nom du travail 10 caractères - profil utilisateur 10 caractères - numéro du travail 6 caractères les 16 suivants le programme émetteur - nom du programme 12 caractères - numéro d'instruction du programme 4 caractères les 13 suivants - date 7 caractères SAAMMJJ - heure 6 caractères hhmmss |
si le message a été envoyé à une msgq programme les 14 suivants indiquent le programme receveur - nom du programme 10 caractères - numéro d'instruction du programme 4 caractères pgm d'origine : '0' = OPM (non ILE) '1' = procédure ILE nom <= 256c. |
- Par le type du message. Vous pouvez spécifier n'importe quel type ou un type particulier de message. Seuls les nouveaux messages (non encore "lus") sont traités, dans l'ordre de réception : FIFO First-In, First-Out si le paramètre MSGKEY n'est pas renseigné. - Par la clé du message (clé donné par le système lors de l'envoi d'un message), plusieurs possibilités vous sont offertes: - Recevoir le message en indiquant sa clé. Lors de l'envoi du message vous avez récupéré la clé dans une variable (paramètre KEYVAR de la commande SNDPGMMSG), pour récupérer ce message vous spécifierez cette variable dans le paramètre MSGKEY de la commande RCVMSG. - Recevoir le message qui suit celui dont on a récupéré la clé, vous indiquerez dans le paramètre MSGKEY la variable qui contient la clé et dans le paramètre MSGTYPE *NEXT (lecture "avant") ou *PRV (lecture "arrière") |
- Recevoir le 1er message d'une msgq : vous indiquerez MSGTYPE(*NEXT) et MSGKEY(*TOP) Récapitulatif: - Si ni MSGTYPE, ni MSGKEY, n'est spécifié, MSGTYPE(*ANY) est pris par défaut => le premier message "non lu". - Si seulement MSGTYPE est spécifié, le nouveau message du type spécifié est reçu. Si le type est *COMP, *DIAG, *INFO, *INQ, *RPY, ou *RQS les nouveaux messages sont reçus dans l'ordre FIFO, les autres seront reçus dans l'ordre LIFO (Last-In, First- Out). - Si seulement MSGKEY est spécifié avec une variable, il recevra le message ayant la clé indiquée. Il faut savoir que la réponse à un message d'interrogation a la même clé que le message d'interrogation. |
- Si MSGTYPE est renseigné et que MSGKEY est renseigné avec une variable,le message du type indiqué avec la clé indiquée est reçu. Si la clé du message est trouvée et que le type n'est pas celui indiqué dans le paramètre MSGTYPE, un message d'erreur est envoyé au programme par le système. - Si MSGTYPE(*NEXT) est spécifié MSGKEY doit être renseigné. Si MSGKEY(*TOP), le premier message de la msgq est reçu. Si MSGKEY contient le nom d'une variable, le message suivant celui indiqué dans la variable est reçu. - Si MSGTYPE(*COPY) et MSGKEY contient le nom d'une variable la copie d'un message d'interrogation est reçue. - Si MSGTYPE(*RPY) et MSGKEY contient le nom d'une variable qui référence un message d'interrogation, la réponse à ce message sera reçue. S'il n'y a pas de réponse des blancs seront reçus. |
5 REPONDRE A UN MESSAGE D'INTERROGATION DANS UN PROGRAMME. ---------------------------------------------------------- Il est possible de répondre à 1 message d'interrogation par un programme si nous connaissons la clé du message (numéro donné par le système) par la commande SNDRPY. Ceci n'est possible que pour les messages qui sont dans une msgq écran ou utilisateur. Format de la commande: SNDRPY MSGKEY(clé de référence du message auquel il va être répondu. Cette clé est contenue dans une variable) MSGQ(nom de la msgq écran ou utilisateur) RPY( *DFT réponse par défaut ou texte de la réponse) RMV(suppression ou non du message et de sa réponse *NO *YES) |
6 SUPPRESSION DES MESSAGES PAR PROGRAMME. ----------------------------------------- Dans un programme vous pouvez supprimer un ou plusieurs messages, d'une msgq programme ou écran ou utilisateur grâce à la commande RMVMSG. Format de la commande RMVMSG. RMVMSG PGMQ(nom de la pgmq dans laquelle le ou les messages seront supprimés *PRV *SAME etc...) MSGQ(msgq écran ou utilisateur ) MSGKEY(clé du message à supprimer) CLEAR(quels messages doit-on supprimer valeurs possibles : |
*BYKEY suppression du message indiqué dans le paramètre MSGKEY (clé du message) *ALL tous les messages *OLD tous les messages anciens (ceux déjà lus) *NEW tous les nouveaux messages (ceux non encore lus) *KEEPUNANS tous, sauf les messages de type question n'ayant pas encore reçus de réponse. Exemples : /* SYNCHRONISATION DE 2 JOBS VIA UNE MSGQ */ 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) SNDRPY MSGKEY(&CLE) MSGQ(MQSYNCHRO) RPY(&REPONSE) |
/* 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') /* ENVOI DE MESSAGES *STATUS DANS L'EXTERNAL */ SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('traitement xxxxxxxx en cours') + TOPGMQ(*EXT) MSGTYPE(*STATUS) .... .... SNDPGMMSG MSGID(CPI9801) MSGF(QCPFMSG) TOPGMQ(*EXT) + MSGTYPE(*STATUS) /* EFFACE LIGNE 24 */ |
/* GESTION DE MESSAGES STANDARD (POUR une commande par exemple) */ PGM /* VARIABLES UTILISEES PAR LA GESTION DE MESSAGES */ 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 |