Cours messages 3 (recevoir)

BoTTom |    Changer de couleur
 
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:
 
 
 
 
 
 
 


|    Changer de couleur
                          !-------------!-------------!-------------------!
                          ! 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        !
                          !-------------!-------------!-------------------!


|    Changer de couleur
                          !             !             !                   !
                          !  *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)
 


|    Changer de couleur
 
               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)

                   )
 


|    Changer de couleur
           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)


|    Changer de couleur
               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


|    Changer de couleur
 
                      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.
'2' = procédure ILE nom > 256c.
'3' = programme du microcode.

pgm de destination (même valeurs)

microsecondes d'émission (sur 6c.)

profil en cours (sur 10 c.)

SENDERFMT(*SHORT : variable de 80c. vue ci-dessus
*LONG : variable de 720 avec les noms sur 256)
                 RTNTYPE( variable contenant le code type du message                           01 *COMP                           02 *DIAG                           03 *INFO                           08 *RQS                           10 *RQS avec demande d'invite (F4)                           ....  etc ....      Complément d'information sur la sélection des messages à recevoir.    Les messages peuvent être reçus de différentes façons:  


|    Changer de couleur
 
    - 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")
 


|    Changer de couleur
 
     - 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.
 
 
 


|    Changer de couleur
 
 
           - 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.
 
 


|    Changer de couleur
 
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)
 


|    Changer de couleur
 
 
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 :
 


|    Changer de couleur
 
                  *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)
 
 


|    Changer de couleur
 
 /* 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 */
 


|    Changer de couleur
 
 /* 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      */
 


|    Changer de couleur
              /*----------------------------------------*/
 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





©AF400