//BCHJOB JOB(JAC1) JOBD(QBATCH) OUTQ(QPRINT) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da www.neroni.it di Claudio Neroni */ /* SE L'USO DELLA JOB DESCRIPTION "QBATCH" TI E' IMPEDITO, */ /* UTILIZZANE UNA DIVERSA. */ /* From System: "IUBICSVI" */ /* From Library: "UTI" */ /* Unload Time: 2009-02-17 16:20 */ /* To File : "JAC1" */ /* To Library : "NERONI2" */ /* To Text : "Check Active Job 1. Src" */ /********* INIZIO ISTRUZIONI *******************************************/ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI RICARICARE I SORGENTI. */ /* 1) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* CREARE UN FILE SORGENTE DI LUNGHEZZA RECORD 112: */ /* CRTSRCPF FILE(NERONI2/STRINGHE) RCDLEN(112) */ /* 2) SPOSTARE IL FILE "JAC1.txt" NELL'INDIRIZZARIO */ /* DI UN PC CONNESSO IN RETE CON L'AS400 RICEVENTE */ /* (AD ES.: "c:\"). */ /* 3) DAL VIDEO COMANDI DEL PC CHIAMARE FTP: */ /* ftp nomeas400 */ /* 4) DIGITARE UTENTE E PASSWORD. */ /* 5) ESEGUIRE IL COMANDO DI COPIA DA FILE PC A MEMBRO AS400: */ /* put "c:\JAC1.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JAC1.mbr" */ /* 6) ABBANDONARE FTP: */ /* quit */ /* 7) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA COPIATA NEL MEMBRO SORGENTE: */ /* SBMDBJOB FILE(NERONI2/STRINGHE) MBR(JAC1) JOBQ(QBATCH) */ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI CREARE L'UTILITY. */ /* 8) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA O LE STRINGHE SORGENTE DI TIPO SEU "CL" */ /* (IL CUI NOME TERMINA SEMPRE CON ".") */ /* PRESENTI NEL FILE RICARICATO "NERONI2/JAC1" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JAC1) MBR(JAC1.) JOBQ(QBATCH) */ /********* FINE ISTRUZIONI *********************************************/ /* Crea la libreria. */ MKDIR DIR('/qsys.lib/NERONI2.lib') CHGLIB LIB(NERONI2) TEXT('Utility di Claudio Neroni') /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP NERONI2 QGPL) /* Crea il file sorgente. */ DLTF FILE(NERONI2/JAC1) CRTSRCPF FILE(NERONI2/JAC1) RCDLEN(112) + TEXT('Check Active Job 1. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(CHKACTJOB1) TOFILE(NERONI2/JAC1) + TOMBR(CHKACTJOB1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JAC1) MBR(CHKACTJOB1) + SRCTYPE(TXT) + TEXT('Check Active Job 1. Vengoal Chang (original)') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JAC1) TOFILE(NERONI2/JAC1) + TOMBR(JAC1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JAC1) MBR(JAC1) + SRCTYPE(CMD) + TEXT('Check Active Job 1. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JAC1.) TOFILE(NERONI2/JAC1) + TOMBR(JAC1.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JAC1) MBR(JAC1.) + SRCTYPE(CL) + TEXT('Check Active Job 1. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JAC1C) TOFILE(NERONI2/JAC1) + TOMBR(JAC1C) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JAC1) MBR(JAC1C) + SRCTYPE(CLLE) + TEXT('Check Active Job 1. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JAC1T) TOFILE(NERONI2/JAC1) + TOMBR(JAC1T) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JAC1) MBR(JAC1T) + SRCTYPE(CLLE) + TEXT('Check Active Job 1. Test') /*---------------------------------------------------------------------*/ //DATA FILE(CHKACTJOB1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') www.think400.dk/adhoc_5.htm#eks0009 Check Active Job Sometime I need do some action to specified job , so I wrote a CHKACTJOB. Source as following: File : QCLSRC Member: CHKACTJOB Type : CLP Usage : CRTCLPGM CHKACTJOB /* =============================================================== */ /* = Command ChkJob CPP = */ /* = ChkJob CLP = */ /* = Paramater notes: = */ /* = Jobname : Jobname to check = */ /* = Jobuser : Jobuser to check = */ /* = SBS : Specified jobname running under which sbs = */ /* = Action : Change, End, Hold or Release job = */ /* = Job command option: only for Change or End job = */ /* = Other command : Other command for job = */ /* =============================================================== */ /* = Date : 2007/06/04 = */ /* = Author: Vengoal Chang = */ /* =============================================================== */ /* = Date : 2007/06/21 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *MSG to send status message to user = */ /* =============================================================== */ /* = Date : 2007/08/08 = */ /* = Author: Vengoal Chang = */ /* = Added on JOBSTS keyword to limit job processing = */ /* =============================================================== */ /* = Date : 2007/08/14 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *DSP to display job information = */ /* = DSPJOB OPTION(*ALL) OUTPUT(*PRINT) = */ /* = DSPJOB OPTION(*JOBLOG) OUTPUT(*PTINT) = */ /* =============================================================== */ CHKJOB: PGM PARM(&MYJOBNAME &JOBUSER &SBSDANDLIB &JOBSTS + &ACTION &JOBOPT &TOUSR &CMD) DCL VAR(&MYJOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSER ) TYPE(*CHAR) LEN(10) DCL VAR(&SBSDANDLIB) TYPE(*CHAR) LEN(20) /* SBSD + AND LIBRARY */ DCL VAR(&SBSD) TYPE(*CHAR) LEN(10) /* SBS */ DCL VAR(&SBSDLIB) TYPE(*CHAR) LEN(10) DCL VAR(&RTNSBSDLIB) TYPE(*CHAR) LEN(10) DCL VAR(&JOBSTS) TYPE(*CHAR) LEN(5) DCL VAR(&ACTION) TYPE(*CHAR) LEN(5) DCL VAR(&JOBOPT) TYPE(*CHAR) LEN(3000) DCL VAR(&TOUSR ) TYPE(*CHAR) LEN(10) DCL VAR(&CMD ) TYPE(*CHAR) LEN(3000) DCL VAR(&CMDSTR) TYPE(*CHAR) LEN(3000) DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) DCL VAR(&STATUS) TYPE(*CHAR) LEN(10) DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) DCL VAR(&SUBTYPE) TYPE(*CHAR) LEN(1) DCL VAR(&USP_NAME) TYPE(*CHAR) LEN(10) DCL VAR(&USP_LIB) TYPE(*CHAR) LEN(10) DCL VAR(&USP_QUAL) TYPE(*CHAR) LEN(20) DCL VAR(&USP_TYPE) TYPE(*CHAR) LEN(10) DCL VAR(&USP_SIZE) TYPE(*CHAR) LEN(4) DCL VAR(&USP_FILL) TYPE(*CHAR) LEN(1) DCL VAR(&USP_AUT) TYPE(*CHAR) LEN(10) DCL VAR(&USP_TEXT) TYPE(*CHAR) LEN(50) DCL VAR(&API_USQUAL) TYPE(*CHAR) LEN(20) DCL VAR(&API_JBQUAL) TYPE(*CHAR) LEN(26) DCL VAR(&API_JBNAM) TYPE(*CHAR) LEN(10) DCL VAR(&API_USER) TYPE(*CHAR) LEN(10) DCL VAR(&API_JOBNR) TYPE(*CHAR) LEN(6) DCL VAR(&API_STATUS) TYPE(*CHAR) LEN(10) DCL VAR(&STARTPOS) TYPE(*CHAR) LEN(4) DCL VAR(&DATALEN) TYPE(*CHAR) LEN(4) DCL VAR(&HEADER) TYPE(*CHAR) LEN(150) DCL VAR(&LST_OFFSET) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_SIZE) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_DATA) TYPE(*CHAR) LEN(4096) DCL VAR(&LST_NBR) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_LEN) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_LENBIN) TYPE(*CHAR) LEN(4) DCL VAR(&LST_POSBIN) TYPE(*CHAR) LEN(4) DCL VAR(&LST_COUNT) TYPE(*DEC) LEN(5) VALUE(0) DCL VAR(&EXC_COUNT) TYPE(*DEC) LEN(5) VALUE(0) DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) VALUE('*') DCL VAR(&NBRTORTN) TYPE(*CHAR) LEN(4) DCL VAR(&KEYSTORTN) TYPE(*CHAR) LEN(8) DCL VAR(&KEY1 ) TYPE(*CHAR) LEN(4) DCL VAR(&KEY2 ) TYPE(*CHAR) LEN(4) DCL VAR(&SBSSYS ) TYPE(*CHAR) LEN(20) DCL VAR(&WRKSTS ) TYPE(*CHAR) LEN(4) DCL VAR(&JOBWRKSTS) TYPE(*CHAR) LEN(4) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(256) DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) DCL VAR(&MSGTXT) TYPE(*CHAR) LEN(256) MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR)) /*- DIVISION OF COMMAND PARAMETER ----------------------------------*/ CHGVAR VAR(&SBSD) VALUE(%SST(&SBSDANDLIB 1 10)) CHGVAR VAR(&SBSDLIB) VALUE(%SST(&SBSDANDLIB 11 10)) IF (&SBSD *NE '*ALL') DO CHKOBJ OBJ(&SBSDLIB/&SBSD) OBJTYPE(*SBSD) MONMSG MSGID(CPF9801) EXEC(DO) RCVMSG MSGQ(*PGMQ) RMV(*NO) /* MSG: SBSD IN LIBRARY NOT FOUND */ SNDPGMMSG MSGID(CPF9801) MSGF(QCPFMSG) + MSGDTA(&SBSDANDLIB) MSGTYPE(*ESCAPE) ENDDO RTVOBJD OBJ(&SBSDLIB/&SBSD) OBJTYPE(*SBSD) + RTNLIB(&RTNSBSDLIB) CHGVAR VAR(%SST(&SBSDANDLIB 11 10)) VALUE(&RTNSBSDLIB) ENDDO CHGVAR VAR(%BIN(&NBRTORTN)) VALUE(2) /* 0101 -- Ststus as WRKACTJOB */ CHGVAR VAR(%BIN(&KEY1 )) VALUE(0101) /* 1906 -- Subsystem */ CHGVAR VAR(%BIN(&KEY2 )) VALUE(1906) CHGVAR VAR(&KEYSTORTN) VALUE(&KEY1 *CAT &KEY2) CHGVAR VAR(&USP_NAME) VALUE('CHKJOBNAME') CHGVAR VAR(&USP_LIB) VALUE('QTEMP') CHGVAR VAR(&USP_QUAL) VALUE(&USP_NAME *CAT + &USP_LIB) CHGVAR VAR(&USP_TYPE) VALUE('MYTYPE') CHGVAR VAR(%BIN(&USP_SIZE)) VALUE(128000) CHGVAR VAR(&USP_FILL) VALUE(' ') CHGVAR VAR(&USP_AUT) VALUE('*USE') CHGVAR VAR(&USP_TEXT) VALUE('my user space') DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME) MONMSG CPF0000 CALL PGM(QUSCRTUS) PARM(&USP_QUAL &USP_TYPE + &USP_SIZE &USP_FILL &USP_AUT &USP_TEXT) CHGVAR VAR(&API_USQUAL) VALUE(&USP_QUAL) CHGVAR VAR(&API_JBNAM) VALUE(&MYJOBNAME) /* CHGVAR VAR(&API_USER) VALUE('*ALL') */ CHGVAR VAR(&API_USER) VALUE(&JOBUSER) CHGVAR VAR(&API_JOBNR) VALUE('*ALL') CHGVAR VAR(&API_STATUS) VALUE('*ACTIVE') CHGVAR VAR(&API_JBQUAL) VALUE(&API_JBNAM *CAT + &API_USER *CAT &API_JOBNR) CALL PGM(QUSLJOB) PARM(&API_USQUAL 'JOBL0200' + &API_JBQUAL &API_STATUS X'00000000' + &TYPE &NBRTORTN &KEYSTORTN) CHGVAR VAR(%BIN(&STARTPOS)) VALUE(1) CHGVAR VAR(%BIN(&DATALEN)) VALUE(140) CALL PGM(QUSRTVUS) PARM(&API_USQUAL &STARTPOS + &DATALEN &HEADER) CHGVAR VAR(&LST_OFFSET) VALUE(%BIN(&HEADER 125 4)) CHGVAR VAR(&LST_SIZE) VALUE(%BIN(&HEADER 129 4)) CHGVAR VAR(&LST_NBR) VALUE(%BIN(&HEADER 133 4)) CHGVAR VAR(&LST_LEN) VALUE(%BIN(&HEADER 137 4)) CHGVAR VAR(%BIN(&LST_POSBIN)) VALUE(&LST_OFFSET + 1) CHGVAR VAR(&LST_LENBIN) VALUE(%SST(&HEADER 137 4)) CHGVAR VAR(&LST_COUNT) VALUE(0) CHGVAR VAR(&EXC_COUNT) VALUE(0) IF (&LST_NBR *EQ 0) DO IF (&JOBUSER *EQ '*ALL') DO SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Job' + *BCAT &MYJOBNAME *BCAT 'was not found!') + MSGTYPE(*ESCAPE) ENDDO ELSE DO ENDDO SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('User' *BCAT &JOBUSER *BCAT + 'run job' *BCAT &MYJOBNAME *BCAT + 'was not found!') + MSGTYPE(*ESCAPE) ENDDO LST_LOOP: IF COND(&LST_COUNT *EQ &LST_NBR) THEN(GOTO + CMDLBL(LST_END)) CALL PGM(QUSRTVUS) PARM(&API_USQUAL &LST_POSBIN + &LST_LENBIN &LST_DATA) CHGVAR VAR(&JOBNAME) VALUE(%SST(&LST_DATA 1 10)) CHGVAR VAR(&USER) VALUE(%SST(&LST_DATA 11 10)) CHGVAR VAR(&JOBNBR) VALUE(%SST(&LST_DATA 21 6)) CHGVAR VAR(&STATUS) VALUE(%SST(&LST_DATA 43 10)) CHGVAR VAR(&JOBTYPE) VALUE(%SST(&LST_DATA 53 1)) CHGVAR VAR(&SUBTYPE) VALUE(%SST(&LST_DATA 54 1)) /* for status */ CHGVAR VAR(&WRKSTS ) VALUE(%SST(&LST_DATA 81 4)) /* for subsystem */ CHGVAR VAR(&SBSSYS ) VALUE(%SST(&LST_DATA 101 20)) IF COND(&MYJOBNAME *EQ '*ALL' *OR + &JOBNAME *EQ &MYJOBNAME) THEN(DO) IF ((&SBSD *EQ '*ALL') *OR + (&SBSDANDLIB *EQ &SBSSYS)) DO CHGVAR &JOBWRKSTS %SST(&JOBSTS 2 4) IF ((&JOBSTS *EQ '*ALL') *OR + (&JOBWRKSTS *EQ &WRKSTS)) DO IF (&ACTION *NE '*CMD') DO IF (&ACTION *EQ '*CHG') + CHGVAR &CMDSTR 'CHGJOB' IF (&ACTION *EQ '*END') + CHGVAR &CMDSTR 'ENDJOB' IF (&ACTION *EQ '*HLD') + CHGVAR &CMDSTR 'HLDJOB' IF (&ACTION *EQ '*RLS') + CHGVAR &CMDSTR 'RLSJOB' IF (&ACTION *EQ '*DSP') DO CHGVAR &CMDSTR 'DSPJOB' CHGVAR &JOBOPT 'OPTION(*ALL) OUTPUT(*PRINT)' ENDDO CHGVAR &CMDSTR (&CMDSTR *BCAT 'JOB(' *TCAT + &JOBNBR *TCAT '/' *CAT + &USER *TCAT '/' *CAT + &JOBNAME *TCAT ')' *BCAT &JOBOPT) ENDDO ELSE DO CHGVAR &CMDSTR &CMD ENDDO CHGVAR VAR(&EXC_COUNT) VALUE(&EXC_COUNT + 1) IF (&ACTION *EQ '*MSG') DO SNDPGMMSG MSG('Job' *BCAT + &JOBNBR *TCAT '/' *CAT + &USER *TCAT '/' *CAT + &JOBNAME *BCAT 'status is' *BCAT + &WRKSTS *TCAT '.') + TOUSR(&TOUSR) ENDDO ELSE DO CHGVAR VAR(&CMDLEN) VALUE(3000) CALL PGM(QCMDEXC) PARM(&CMDSTR &CMDLEN) MONMSG MSGID(CPF1346 CPF1349) IF (&ACTION *EQ '*DSP') DO CHGVAR &CMDSTR ('DSPJOB' *BCAT 'JOB(' *TCAT + &JOBNBR *TCAT '/' *CAT + &USER *TCAT '/' *CAT + &JOBNAME *TCAT ')' *BCAT + 'OPTION(*JOBLOG) OUTPUT(*PRINT)') CHGVAR VAR(&CMDLEN) VALUE(3000) CALL PGM(QCMDEXC) PARM(&CMDSTR &CMDLEN) MONMSG MSGID(CPF1346 CPF1349) ENDDO ENDDO ENDDO /* ENDDO JOBSTS */ ENDDO /* ENDDO SBSD */ ENDDO /* ENDDO JOBNAME */ CHGVAR VAR(&LST_COUNT) VALUE(&LST_COUNT + 1) CHGVAR VAR(%BIN(&LST_POSBIN)) + VALUE(%BIN(&LST_POSBIN) + &LST_LEN) GOTO CMDLBL(LST_LOOP) LST_END: IF (&EXC_COUNT *EQ 0) DO SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('User' *BCAT &JOBUSER *BCAT + 'run job' *BCAT &MYJOBNAME *BCAT + 'under subsystem' *BCAT + &RTNSBSDLIB *TCAT '/' *CAT &SBSD *BCAT + 'was not found!') + MSGTYPE(*ESCAPE) ENDDO DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME) Return /* =============================================================== */ /* = Error routine = */ /* =============================================================== */ Error: RcvMsg MsgType( *Excp ) + MsgDta( &MsgDta ) + MsgID( &MsgID ) + MsgF( &MsgF ) + MsgFLib( &MsgFLib ) MonMsg ( CPF0000 MCH0000 ) SndMsg: SndPgmMsg MsgID( &MsgID ) + MsgF( &MsgFLib/&MsgF ) + MsgDta( &MsgDta ) + MsgType( *Escape ) MonMsg ( CPF0000 MCH0000 ) /* =============================================================== */ /* = End of program = */ /* =============================================================== */ ENDPGM File : QCMDSRC Member: CHKACTJOB Type : CMD Usage : CRTCMD CMD(lib/CHKACTJOB) PGM(lib/CHKACTJOB) /* =============================================================== */ /* = Command....... ChkJob = */ /* = CPP........... ChkJob = */ /* = Description... Check Job by job name and subsystem = */ /* = = */ /* = CrtCmd Cmd( ChkJob ) = */ /* = Pgm( ChkJob ) = */ /* = SrcFile( YourSourceFile ) = */ /* =============================================================== */ /* = Date : 2007/06/04 = */ /* = Author: Vengoal Chang = */ /* =============================================================== */ /* = Date : 2007/06/21 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *MSG to send status message to user= */ /* =============================================================== */ /* = Date : 2007/08/08 = */ /* = Author: Vengoal Chang = */ /* = Added on JOBSTS keyword to limit job processing = */ /* =============================================================== */ /* = Date : 2007/08/14 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *DSP to display job information = */ /* = DSPJOB OPTION(*ALL) OUTPUT(*PRINT) = */ /* = DSPJOB OPTION(*JOBLOG) OUTPUT(*PTINT) = */ /* =============================================================== */ CMD PROMPT('Check Job') PARM KWD(JOBNAME) TYPE(*NAME) SPCVAL((*ALL)) + MIN(1) PROMPT('Job name') PARM KWD(JOBUSER) TYPE(*NAME) SPCVAL((*ALL)) + MIN(1) PROMPT('Job user') PARM KWD(SBS) TYPE(SBSD) MIN(1) PROMPT('Job + running under subsystem') PARM KWD(JOBSTS) TYPE(*CHAR) LEN(5) RSTD(*YES) + DFT(*ALL) VALUES(*ALL *MSGW) PROMPT('Job + selection by ACTJOB status') PARM KWD(ACTION) TYPE(*CHAR) LEN(5) RSTD(*YES) + DFT(*MSG) VALUES(*DSP *CHG *END *HLD *RLS + *MSG *CMD) EXPR(*YES) PROMPT('Action') PARM KWD(JOBOPT) TYPE(*CHAR) LEN(3000) + PMTCTL(IFPGM) PROMPT('Job command option + DSP,CHG,END') PARM KWD(TOUSR) TYPE(*NAME) LEN(10) + SPCVAL((*SYSOPR)) PMTCTL(IFTOUSR) + PROMPT('Send status message to user') PARM KWD(CMD) TYPE(*CMDSTR) LEN(3000) + PMTCTL(IFCMD) PROMPT('Command to run') SBSD: QUAL TYPE(*NAME) LEN(10) SPCVAL((*ALL)) EXPR(*YES) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) + PROMPT('Library') IFPGM: PMTCTL CTL(ACTION) COND((*EQ *CHG)) PMTCTL CTL(ACTION) COND((*EQ *END)) LGLREL(*OR) IFTOUSR: PMTCTL CTL(ACTION) COND((*EQ *MSG)) IFCMD: PMTCTL CTL(ACTION) COND((*EQ *CMD)) DEP CTL(&ACTION *EQ *CHG) PARM((JOBOPT)) DEP CTL(&ACTION *EQ *END) PARM((JOBOPT)) DEP CTL(&ACTION *EQ *MSG) PARM((TOUSR)) DEP CTL(&ACTION *EQ *CMD) PARM((CMD)) File : QCLSRC Member: CHKACTJOBT Type : CLP Usage : CRTCLPGM PGM(lib/CHKACTJOBT) CALL CHKACTJOBT PGM DCL &MSGTXT *CHAR 256 CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QINTER) + ACTION(*CHG) JOBOPT('RUNPTY(10)') MONMSG CPF9898 EXEC(DO) RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT) DMPCLPGM ENDDO CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) + ACTION(*MSG) TOUSR(*SYSOPR) MONMSG CPF9898 EXEC(DO) RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT) DMPCLPGM ENDDO CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) + JOBSTS(*MSGW) ACTION(*MSG) TOUSR(*SYSOPR) MONMSG CPF9898 EXEC(DO) RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT) DMPCLPGM ENDDO CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) + JOBSTS(*MSGW) ACTION(*MSG) TOUSR(*SYSOPR) MONMSG CPF9898 ENDPGM Thanks to Vengoal Chang //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JAC1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* www.think400.dk/adhoc_5.htm#eks0009 */ /* =============================================================== */ /* = Command....... ChkJob = */ /* = CPP........... ChkJob = */ /* = Description... Check Job by job name and subsystem = */ /* = = */ /* = CrtCmd Cmd( ChkJob ) = */ /* = Pgm( ChkJob ) = */ /* = SrcFile( YourSourceFile ) = */ /* =============================================================== */ /* = Date : 2007/06/04 = */ /* = Author: Vengoal Chang = */ /* =============================================================== */ /* = Date : 2007/06/21 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *MSG to send status message to user= */ /* =============================================================== */ /* = Date : 2007/08/08 = */ /* = Author: Vengoal Chang = */ /* = Added on JOBSTS keyword to limit job processing = */ /* =============================================================== */ /* = Date : 2007/08/14 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *DSP to display job information = */ /* = DSPJOB OPTION(*ALL) OUTPUT(*PRINT) = */ /* = DSPJOB OPTION(*JOBLOG) OUTPUT(*PTINT) = */ /* =============================================================== */ CMD PROMPT('Check Job') PARM KWD(JOBNAME) TYPE(*NAME) SPCVAL((*ALL)) + MIN(1) PROMPT('Job name') PARM KWD(JOBUSER) TYPE(*NAME) SPCVAL((*ALL)) + MIN(1) PROMPT('Job user') PARM KWD(SBS) TYPE(SBSD) MIN(1) PROMPT('Job + running under subsystem') PARM KWD(JOBSTS) TYPE(*CHAR) LEN(5) RSTD(*YES) + DFT(*ALL) VALUES(*ALL *MSGW) PROMPT('Job + selection by ACTJOB status') PARM KWD(ACTION) TYPE(*CHAR) LEN(5) RSTD(*YES) + DFT(*MSG) VALUES(*DSP *CHG *END *HLD *RLS + *MSG *CMD) EXPR(*YES) PROMPT('Action') PARM KWD(JOBOPT) TYPE(*CHAR) LEN(3000) + PMTCTL(IFPGM) PROMPT('Job command option + DSP,CHG,END') PARM KWD(TOUSR) TYPE(*NAME) LEN(10) + SPCVAL((*SYSOPR)) PMTCTL(IFTOUSR) + PROMPT('Send status message to user') PARM KWD(CMD) TYPE(*CMDSTR) LEN(3000) + PMTCTL(IFCMD) PROMPT('Command to run') SBSD: QUAL TYPE(*NAME) LEN(10) SPCVAL((*ALL)) EXPR(*YES) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) + PROMPT('Library') IFPGM: PMTCTL CTL(ACTION) COND((*EQ *CHG)) PMTCTL CTL(ACTION) COND((*EQ *END)) LGLREL(*OR) IFTOUSR: PMTCTL CTL(ACTION) COND((*EQ *MSG)) IFCMD: PMTCTL CTL(ACTION) COND((*EQ *CMD)) DEP CTL(&ACTION *EQ *CHG) PARM((JOBOPT)) DEP CTL(&ACTION *EQ *END) PARM((JOBOPT)) DEP CTL(&ACTION *EQ *MSG) PARM((TOUSR)) DEP CTL(&ACTION *EQ *CMD) PARM((CMD)) //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JAC1.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JAC1.) JOBD(QBATCH) OUTQ(QPRINTS) ENDSEV(60) LOG(4 00 + *SECLVL) MSGQ(*USRPRF) /* Vengoal Chang 04-06-2007 Creato. */ /* www.think400.dk/adhoc_5.htm#eks0009 */ /* JAC1 */ /* Check Active Job 1. */ /* Prerequisiti: nessuno */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JAC1) DLTPGM PGM(NERONI2/JAC1C) DLTPGM PGM(NERONI2/JAC1T) /* Crea il comando. */ CRTCMD CMD(NERONI2/JAC1) PGM(NERONI2/JAC1C) SRCFILE(JAC1) + PRDLIB(NERONI2) /* Crea il command processing program. */ CRTBNDCL PGM(NERONI2/JAC1C) SRCFILE(JAC1) DBGVIEW(*ALL) /* Crea il test program. */ CRTBNDCL PGM(NERONI2/JAC1T) SRCFILE(JAC1) DBGVIEW(*ALL) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JAC1C) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* www.think400.dk/adhoc_5.htm#eks0009 */ /* =============================================================== */ /* = Command ChkJob CPP = */ /* = ChkJob CLP = */ /* = Paramater notes: = */ /* = Jobname : Jobname to check = */ /* = Jobuser : Jobuser to check = */ /* = SBS : Specified jobname running under which sbs = */ /* = Action : Change, End, Hold or Release job = */ /* = Job command option: only for Change or End job = */ /* = Other command : Other command for job = */ /* =============================================================== */ /* = Date : 2007/06/04 = */ /* = Author: Vengoal Chang = */ /* =============================================================== */ /* = Date : 2007/06/21 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *MSG to send status message to user = */ /* =============================================================== */ /* = Date : 2007/08/08 = */ /* = Author: Vengoal Chang = */ /* = Added on JOBSTS keyword to limit job processing = */ /* =============================================================== */ /* = Date : 2007/08/14 = */ /* = Author: Vengoal Chang = */ /* = Added on ACTION *DSP to display job information = */ /* = DSPJOB OPTION(*ALL) OUTPUT(*PRINT) = */ /* = DSPJOB OPTION(*JOBLOG) OUTPUT(*PTINT) = */ /* =============================================================== */ CHKJOB: PGM PARM(&MYJOBNAME &JOBUSER &SBSDANDLIB &JOBSTS + &ACTION &JOBOPT &TOUSR &CMD) DCL VAR(&MYJOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSER ) TYPE(*CHAR) LEN(10) DCL VAR(&SBSDANDLIB) TYPE(*CHAR) LEN(20) /* SBSD + AND LIBRARY */ DCL VAR(&SBSD) TYPE(*CHAR) LEN(10) /* SBS */ DCL VAR(&SBSDLIB) TYPE(*CHAR) LEN(10) DCL VAR(&RTNSBSDLIB) TYPE(*CHAR) LEN(10) DCL VAR(&JOBSTS) TYPE(*CHAR) LEN(5) DCL VAR(&ACTION) TYPE(*CHAR) LEN(5) DCL VAR(&JOBOPT) TYPE(*CHAR) LEN(3000) DCL VAR(&TOUSR ) TYPE(*CHAR) LEN(10) DCL VAR(&CMD ) TYPE(*CHAR) LEN(3000) DCL VAR(&CMDSTR) TYPE(*CHAR) LEN(3000) DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) DCL VAR(&STATUS) TYPE(*CHAR) LEN(10) DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) DCL VAR(&SUBTYPE) TYPE(*CHAR) LEN(1) DCL VAR(&USP_NAME) TYPE(*CHAR) LEN(10) DCL VAR(&USP_LIB) TYPE(*CHAR) LEN(10) DCL VAR(&USP_QUAL) TYPE(*CHAR) LEN(20) DCL VAR(&USP_TYPE) TYPE(*CHAR) LEN(10) DCL VAR(&USP_SIZE) TYPE(*CHAR) LEN(4) DCL VAR(&USP_FILL) TYPE(*CHAR) LEN(1) DCL VAR(&USP_AUT) TYPE(*CHAR) LEN(10) DCL VAR(&USP_TEXT) TYPE(*CHAR) LEN(50) DCL VAR(&API_USQUAL) TYPE(*CHAR) LEN(20) DCL VAR(&API_JBQUAL) TYPE(*CHAR) LEN(26) DCL VAR(&API_JBNAM) TYPE(*CHAR) LEN(10) DCL VAR(&API_USER) TYPE(*CHAR) LEN(10) DCL VAR(&API_JOBNR) TYPE(*CHAR) LEN(6) DCL VAR(&API_STATUS) TYPE(*CHAR) LEN(10) DCL VAR(&STARTPOS) TYPE(*CHAR) LEN(4) DCL VAR(&DATALEN) TYPE(*CHAR) LEN(4) DCL VAR(&HEADER) TYPE(*CHAR) LEN(150) DCL VAR(&LST_OFFSET) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_SIZE) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_DATA) TYPE(*CHAR) LEN(4096) DCL VAR(&LST_NBR) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_LEN) TYPE(*DEC) LEN(5 0) DCL VAR(&LST_LENBIN) TYPE(*CHAR) LEN(4) DCL VAR(&LST_POSBIN) TYPE(*CHAR) LEN(4) DCL VAR(&LST_COUNT) TYPE(*DEC) LEN(5) VALUE(0) DCL VAR(&EXC_COUNT) TYPE(*DEC) LEN(5) VALUE(0) DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) VALUE('*') DCL VAR(&NBRTORTN) TYPE(*CHAR) LEN(4) DCL VAR(&KEYSTORTN) TYPE(*CHAR) LEN(8) DCL VAR(&KEY1 ) TYPE(*CHAR) LEN(4) DCL VAR(&KEY2 ) TYPE(*CHAR) LEN(4) DCL VAR(&SBSSYS ) TYPE(*CHAR) LEN(20) DCL VAR(&WRKSTS ) TYPE(*CHAR) LEN(4) DCL VAR(&JOBWRKSTS) TYPE(*CHAR) LEN(4) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(256) DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) DCL VAR(&MSGTXT) TYPE(*CHAR) LEN(256) MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR)) /*- DIVISION OF COMMAND PARAMETER ----------------------------------*/ CHGVAR VAR(&SBSD) VALUE(%SST(&SBSDANDLIB 1 10)) CHGVAR VAR(&SBSDLIB) VALUE(%SST(&SBSDANDLIB 11 10)) IF (&SBSD *NE '*ALL') DO CHKOBJ OBJ(&SBSDLIB/&SBSD) OBJTYPE(*SBSD) MONMSG MSGID(CPF9801) EXEC(DO) RCVMSG MSGQ(*PGMQ) RMV(*NO) /* MSG: SBSD IN LIBRARY NOT FOUND */ SNDPGMMSG MSGID(CPF9801) MSGF(QCPFMSG) + MSGDTA(&SBSDANDLIB) MSGTYPE(*ESCAPE) ENDDO RTVOBJD OBJ(&SBSDLIB/&SBSD) OBJTYPE(*SBSD) + RTNLIB(&RTNSBSDLIB) CHGVAR VAR(%SST(&SBSDANDLIB 11 10)) VALUE(&RTNSBSDLIB) ENDDO CHGVAR VAR(%BIN(&NBRTORTN)) VALUE(2) /* 0101 -- Ststus as WRKACTJOB */ CHGVAR VAR(%BIN(&KEY1 )) VALUE(0101) /* 1906 -- Subsystem */ CHGVAR VAR(%BIN(&KEY2 )) VALUE(1906) CHGVAR VAR(&KEYSTORTN) VALUE(&KEY1 *CAT &KEY2) CHGVAR VAR(&USP_NAME) VALUE('CHKJOBNAME') CHGVAR VAR(&USP_LIB) VALUE('QTEMP') CHGVAR VAR(&USP_QUAL) VALUE(&USP_NAME *CAT + &USP_LIB) CHGVAR VAR(&USP_TYPE) VALUE('MYTYPE') CHGVAR VAR(%BIN(&USP_SIZE)) VALUE(128000) CHGVAR VAR(&USP_FILL) VALUE(' ') CHGVAR VAR(&USP_AUT) VALUE('*USE') CHGVAR VAR(&USP_TEXT) VALUE('my user space') DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME) MONMSG CPF0000 CALL PGM(QUSCRTUS) PARM(&USP_QUAL &USP_TYPE + &USP_SIZE &USP_FILL &USP_AUT &USP_TEXT) CHGVAR VAR(&API_USQUAL) VALUE(&USP_QUAL) CHGVAR VAR(&API_JBNAM) VALUE(&MYJOBNAME) /* CHGVAR VAR(&API_USER) VALUE('*ALL') */ CHGVAR VAR(&API_USER) VALUE(&JOBUSER) CHGVAR VAR(&API_JOBNR) VALUE('*ALL') CHGVAR VAR(&API_STATUS) VALUE('*ACTIVE') CHGVAR VAR(&API_JBQUAL) VALUE(&API_JBNAM *CAT + &API_USER *CAT &API_JOBNR) CALL PGM(QUSLJOB) PARM(&API_USQUAL 'JOBL0200' + &API_JBQUAL &API_STATUS X'00000000' + &TYPE &NBRTORTN &KEYSTORTN) CHGVAR VAR(%BIN(&STARTPOS)) VALUE(1) CHGVAR VAR(%BIN(&DATALEN)) VALUE(140) CALL PGM(QUSRTVUS) PARM(&API_USQUAL &STARTPOS + &DATALEN &HEADER) CHGVAR VAR(&LST_OFFSET) VALUE(%BIN(&HEADER 125 4)) CHGVAR VAR(&LST_SIZE) VALUE(%BIN(&HEADER 129 4)) CHGVAR VAR(&LST_NBR) VALUE(%BIN(&HEADER 133 4)) CHGVAR VAR(&LST_LEN) VALUE(%BIN(&HEADER 137 4)) CHGVAR VAR(%BIN(&LST_POSBIN)) VALUE(&LST_OFFSET + 1) CHGVAR VAR(&LST_LENBIN) VALUE(%SST(&HEADER 137 4)) CHGVAR VAR(&LST_COUNT) VALUE(0) CHGVAR VAR(&EXC_COUNT) VALUE(0) IF (&LST_NBR *EQ 0) DO IF (&JOBUSER *EQ '*ALL') DO SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Job' + *BCAT &MYJOBNAME *BCAT 'was not found!') + MSGTYPE(*ESCAPE) ENDDO ELSE DO ENDDO SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('User' *BCAT &JOBUSER *BCAT + 'run job' *BCAT &MYJOBNAME *BCAT + 'was not found!') + MSGTYPE(*ESCAPE) ENDDO LST_LOOP: IF COND(&LST_COUNT *EQ &LST_NBR) THEN(GOTO + CMDLBL(LST_END)) CALL PGM(QUSRTVUS) PARM(&API_USQUAL &LST_POSBIN + &LST_LENBIN &LST_DATA) CHGVAR VAR(&JOBNAME) VALUE(%SST(&LST_DATA 1 10)) CHGVAR VAR(&USER) VALUE(%SST(&LST_DATA 11 10)) CHGVAR VAR(&JOBNBR) VALUE(%SST(&LST_DATA 21 6)) CHGVAR VAR(&STATUS) VALUE(%SST(&LST_DATA 43 10)) CHGVAR VAR(&JOBTYPE) VALUE(%SST(&LST_DATA 53 1)) CHGVAR VAR(&SUBTYPE) VALUE(%SST(&LST_DATA 54 1)) /* for status */ CHGVAR VAR(&WRKSTS ) VALUE(%SST(&LST_DATA 81 4)) /* for subsystem */ CHGVAR VAR(&SBSSYS ) VALUE(%SST(&LST_DATA 101 20)) IF COND(&MYJOBNAME *EQ '*ALL' *OR + &JOBNAME *EQ &MYJOBNAME) THEN(DO) IF ((&SBSD *EQ '*ALL') *OR + (&SBSDANDLIB *EQ &SBSSYS)) DO CHGVAR &JOBWRKSTS %SST(&JOBSTS 2 4) IF ((&JOBSTS *EQ '*ALL') *OR + (&JOBWRKSTS *EQ &WRKSTS)) DO IF (&ACTION *NE '*CMD') DO IF (&ACTION *EQ '*CHG') + CHGVAR &CMDSTR 'CHGJOB' IF (&ACTION *EQ '*END') + CHGVAR &CMDSTR 'ENDJOB' IF (&ACTION *EQ '*HLD') + CHGVAR &CMDSTR 'HLDJOB' IF (&ACTION *EQ '*RLS') + CHGVAR &CMDSTR 'RLSJOB' IF (&ACTION *EQ '*DSP') DO CHGVAR &CMDSTR 'DSPJOB' CHGVAR &JOBOPT 'OPTION(*ALL) OUTPUT(*PRINT)' ENDDO CHGVAR &CMDSTR (&CMDSTR *BCAT 'JOB(' *TCAT + &JOBNBR *TCAT '/' *CAT + &USER *TCAT '/' *CAT + &JOBNAME *TCAT ')' *BCAT &JOBOPT) ENDDO ELSE DO CHGVAR &CMDSTR &CMD ENDDO CHGVAR VAR(&EXC_COUNT) VALUE(&EXC_COUNT + 1) IF (&ACTION *EQ '*MSG') DO SNDPGMMSG MSG('Job' *BCAT + &JOBNBR *TCAT '/' *CAT + &USER *TCAT '/' *CAT + &JOBNAME *BCAT 'status is' *BCAT + &WRKSTS *TCAT '.') + TOUSR(&TOUSR) ENDDO ELSE DO CHGVAR VAR(&CMDLEN) VALUE(3000) CALL PGM(QCMDEXC) PARM(&CMDSTR &CMDLEN) MONMSG MSGID(CPF1346 CPF1349) IF (&ACTION *EQ '*DSP') DO CHGVAR &CMDSTR ('DSPJOB' *BCAT 'JOB(' *TCAT + &JOBNBR *TCAT '/' *CAT + &USER *TCAT '/' *CAT + &JOBNAME *TCAT ')' *BCAT + 'OPTION(*JOBLOG) OUTPUT(*PRINT)') CHGVAR VAR(&CMDLEN) VALUE(3000) CALL PGM(QCMDEXC) PARM(&CMDSTR &CMDLEN) MONMSG MSGID(CPF1346 CPF1349) ENDDO ENDDO ENDDO /* ENDDO JOBSTS */ ENDDO /* ENDDO SBSD */ ENDDO /* ENDDO JOBNAME */ CHGVAR VAR(&LST_COUNT) VALUE(&LST_COUNT + 1) CHGVAR VAR(%BIN(&LST_POSBIN)) + VALUE(%BIN(&LST_POSBIN) + &LST_LEN) GOTO CMDLBL(LST_LOOP) LST_END: IF (&EXC_COUNT *EQ 0) DO SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) + MSGDTA('User' *BCAT &JOBUSER *BCAT + 'run job' *BCAT &MYJOBNAME *BCAT + 'under subsystem' *BCAT + &RTNSBSDLIB *TCAT '/' *CAT &SBSD *BCAT + 'was not found!') + MSGTYPE(*ESCAPE) ENDDO DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME) Return /* =============================================================== */ /* = Error routine = */ /* =============================================================== */ Error: RcvMsg MsgType( *Excp ) + MsgDta( &MsgDta ) + MsgID( &MsgID ) + MsgF( &MsgF ) + MsgFLib( &MsgFLib ) MonMsg ( CPF0000 MCH0000 ) SndMsg: SndPgmMsg MsgID( &MsgID ) + MsgF( &MsgFLib/&MsgF ) + MsgDta( &MsgDta ) + MsgType( *Escape ) MonMsg ( CPF0000 MCH0000 ) /* =============================================================== */ /* = End of program = */ /* =============================================================== */ ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JAC1T) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* www.think400.dk/adhoc_5.htm#eks0009 */ PGM DCL &MSGTXT *CHAR 256 JAC1 JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QINTER) + ACTION(*CHG) JOBOPT('RUNPTY(10)') MONMSG CPF9898 EXEC(DO) RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT) DMPCLPGM ENDDO JAC1 JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) + ACTION(*MSG) TOUSR(*SYSOPR) MONMSG CPF9898 EXEC(DO) RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT) DMPCLPGM ENDDO JAC1 JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) + JOBSTS(*MSGW) ACTION(*MSG) TOUSR(*SYSOPR) MONMSG CPF9898 EXEC(DO) RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT) DMPCLPGM ENDDO JAC1 JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) + JOBSTS(*MSGW) ACTION(*MSG) TOUSR(*SYSOPR) MONMSG CPF9898 ENDPGM //ENDSRC //ENDBCHJOB