星期二, 10月 31, 2023

2000-02-29 如何使用 CLP 樣本,簡化 CLP 程式錯誤的監控步驟


如何使用 CLP 樣本,簡化 CLP 程式錯誤的監控步驟


/*==================================================================*/
/*                                                                  */
/* Program name: CLTEMPLATE                                         */
/*                                                                  */
/* Purpose: To be used as a CL shell that provides generic          */
/* message handling. Moves all *DIAG and *ESCAPE                    */
/* messages to the previous program's message queue.                */
/*                                                                  */
/* Notes: Requires mainline code                                    */
/*                                                                  */
/*                                                                  */
/*==================================================================*/


PGM PARM()
/* Declare parameter variables */
/* Declare program variables */
/* Declare error processing variables */
   DCL VAR(&ERRBYTES)  TYPE(*CHAR) LEN( 4)  VALUE(X'00000000')
   DCL VAR(&ERROR)     TYPE(*LGL)           VALUE('0')
   DCL VAR(&MSGKEY)    TYPE(*CHAR) LEN( 4)
   DCL VAR(&MSGTYP)    TYPE(*CHAR) LEN(10)  VALUE('*DIAG')
   DCL VAR(&MSGTYPCTR) TYPE(*CHAR) LEN( 4)  VALUE(X'00000001')
   DCL VAR(&PGMMSGQ)   TYPE(*CHAR) LEN(10)  VALUE('*')
   DCL VAR(&STKCTR)    TYPE(*CHAR) LEN( 4)  VALUE(X'00000001')
/* Declare file */
/* Default monitoring */
   MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERRPROC))
/*==================================================================*/
/* Mainline                                                         */
/*==================================================================*/

/*==================================================================*/
/* Normal end of program                                            */

/*==================================================================*/
/* Send completion messages here                                    */
   RETURN

/*==================================================================*/
/* Error processing routine                                         */
/*==================================================================*/
ERRPROC: 
   IF COND(&ERROR) THEN(GOTO CMDLBL(ERRDONE))
   ELSE CMD(CHGVAR VAR(&ERROR) VALUE('1'))

/* Move all *DIAG messages to previous program queue */
   CALL PGM(QMHMOVPM) PARM(&MSGKEY &MSGTYP &MSGTYPCTR &PGMMSGQ +
                               &STKCTR &ERRBYTES)
/* Resend last *ESCAPE message */
ERRDONE: 
   CALL PGM(QMHRSNEM) PARM(&MSGKEY &ERRBYTES)
   MONMSG MSGID(CPF0000) EXEC(DO)
      SNDPGMMSG MSGID(CPF3CF2) MSGF(QCPFMSG) +
                   MSGDTA('QMHRSNEM') MSGTYPE(*ESCAPE)
      MONMSG MSGID(CPF0000)
   ENDDO
ENDPGM

沒有留言: