星期三, 11月 01, 2023

2002-03-07 如何利用 Message Queue Break Message handling program 將訊息顯示於畫面第 24 行?


如何利用 Message Queue Break Message handling program 將訊息顯示於畫面第 24 行?


系統常會送出某些訊息,會中斷使用者的訊息,可以利用Message Queue Break Message handling program 將訊息顯示於畫面第 24 行

            


File  : QCLSRC
Member: MSGH
Type  : CLP
Usage : CRTCLPGM MSGH

            

/* PROGRAM TO HANDLE BREAK MESSAGES */
             PGM        PARM(&MSGQ &MSGQLIB &MSGK)

             DCL        VAR(&MSGQ) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGQLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGK) TYPE(*CHAR) LEN(4)
             DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(200)
             DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
             DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGTXT) TYPE(*CHAR) LEN(200)

             DCL        VAR(&BLANK) TYPE(*CHAR) LEN(75)
             DCL        VAR(&I) TYPE(*DEC) LEN(2 0) VALUE(75)

             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))

 /* RECEIVE THE BREAK MESSAGE */
             RCVMSG     MSGQ(&MSGQLIB/&MSGQ) MSGKEY(&MSGK) RMV(*NO) +
                          MSG(&MSGTXT) MSGDTA(&MSGDTA) +
                          MSGID(&MSGID) MSGF(&MSGF) +
                          SNDMSGFLIB(&MSGFLIB)

 /* IF THERES NO MSGID, USE &MSGTXT AND CPF9897 */
 /* TO SATISFY STATUS MESSAGE REQUIREMENTS */
             IF         COND(&MSGID = ' ') THEN(DO)
             CHGVAR     VAR(&MSGID) VALUE('CPF9897')
             CHGVAR     VAR(&MSGFLIB) VALUE('QSYS')
             CHGVAR     VAR(&MSGF) VALUE('QCPFMSG')
             CHGVAR     VAR(&MSGDTA) VALUE(&MSGTXT)
             ENDDO

  /* RESEND IT AS A STATUS MESSAGE */
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                          MSGDTA(&MSGTXT) TOPGMQ(*EXT) MSGTYPE(*STATUS)
             MONMSG     MSGID(CPF0000)

 LOOP:       SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) +
                          MSGDTA(%SST(&BLANK 1 &I) || &MSGTXT) +
                          TOPGMQ(*EXT) MSGTYPE(*STATUS)

             CHGVAR     VAR(&I) VALUE(&I -5)
             IF         COND(&I *GT 1) THEN(DO)
          /*  DLYJOB     DLY(1)  */
             GOTO       CMDLBL(LOOP)
             ENDDO
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&MSGTXT) +
                          TOPGMQ(*EXT) MSGTYPE(*STATUS)
             RETURN
 ERROR:
 MSGD:       RCVMSG     MSGTYPE(*DIAG) MSG(&MSGTXT) MSGDTA(&MSGDTA) +
                          MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGFLIB)

             IF         COND(&MSGID *NE ' ') THEN(DO)
                  SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                          MSGDTA(&MSGDTA) MSGTYPE(*DIAG)
                  GOTO       CMDLBL(MSGD)
             ENDDO
 MSGE:       RCVMSG     MSGTYPE(*EXCP) MSG(&MSGTXT) MSGDTA(&MSGDTA) +
                          MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGFLIB)
             IF         COND(&MSGID *NE ' ') THEN(SNDPGMMSG +
                          MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                          MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE))

             ENDPGM

            


在每次 Sign On 進入系統後下命令
CHGMSGQ MSGQ(user or WRKSTN ID) DLVRY(*BREAK) PGM(library/MSGH),
你可將此命令加入使用者的 Initial Program 中自動執行,
再開第二台工作站測試,
SNDMSG MSG(TEST-USER-QUEUE) TOUSR(user)
or
SNDMSG MSG(TEST-WRKSTN-QUEUE) TOMSGQ(workstation id)

你可從第一個工作站看到從第二個工作站發送的訊息,顯示於第一台工作站的24行。

            

沒有留言: