PRCQBATCH: PGM /* Pick a name for our usrspc... */ DCL VAR(&USRSPC) TYPE(*CHAR) LEN(10) VALUE(QBATCH) DCL VAR(&USRSPCLIB) TYPE(*CHAR) LEN(10) + VALUE(QTEMP) /* Pick a name for the jobq to monitor... */ DCL VAR(&MONJOBQ) TYPE(*CHAR) LEN(10) + VALUE('QBATCH') DCL VAR(&MONJOBQLIB) TYPE(*CHAR) LEN(10) + VALUE('*LIBL') /* JobQ info... */ DCL VAR(&NBRJOBS) TYPE(*DEC) LEN(5) DCL VAR(&JOBQI) TYPE(*CHAR) LEN(122) /* Job info... */ DCL VAR(&INTJOBID) TYPE(*CHAR) LEN(16) DCL VAR(&JOBENT) TYPE(*CHAR) LEN(1000) DCL VAR(&JOBI) TYPE(*CHAR) LEN(1000) DCL VAR(&INTJOBID) TYPE(*CHAR) LEN(16) DCL VAR(&JOB) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSER) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) DCL VAR(&JOBSTS) TYPE(*CHAR) LEN(10) DCL VAR(&JOBQ) TYPE(*CHAR) LEN(10) DCL VAR(&JOBQLIB) TYPE(*CHAR) LEN(10) /* Usrspc elements from the header... */ DCL VAR(&OFFLSTDTA) TYPE(*DEC) LEN(9) DCL VAR(&NBRLSTE) TYPE(*DEC) LEN(7) DCL VAR(&SIZLSTE) TYPE(*DEC) LEN(5) DCL VAR(&JOBE) TYPE(*DEC) LEN(9) DCL VAR(&NBRJOBE) TYPE(*DEC) LEN(7) DCL VAR(&JOBELEN) TYPE(*DEC) LEN(5) /* See if any jobs are on our chosen jobq... */ RTVJOBQI JOBQ(&MONJOBQLIB/&MONJOBQ) JOBQI(&JOBQI) CHGVAR VAR(&NBRJOBS) VALUE(%BIN(&JOBQI 49 4)) IF COND(&NBRJOBS *EQ 0) THEN(RETURN) /* If the number of jobs on the monitored jobq is not *EQ zero, */ /* then there are jobs to check. So, continue on... */ /* Create a usrspc for our list of jobs... */ CRTUSRSPC USRSPC(&USRSPCLIB/&USRSPC) DELETE(*YES) /* List the jobs that are on a jobq... */ LUSJOB JOB(*ALL/*ALL/*ALL) + USRSPC(&USRSPCLIB/&USRSPC) STATUS(*JOBQ) + JOBTYP(B) /* Get the needed elements from the usrspc header... */ RUSGENHDR USRSPC(&USRSPCLIB/&USRSPC) + OFFSLSTDTA(&OFFLSTDTA) NBRLSTE(&NBRLSTE) + SIZLSTE(&SIZLSTE) CHGVAR VAR(&JOBE) VALUE(&OFFLSTDTA + 1) CHGVAR VAR(&NBRJOBE) VALUE(&NBRLSTE) CHGVAR VAR(&JOBELEN) VALUE(&SIZLSTE) /* */ /* Loop through the jobs list... */ /* */ NXT_JOB_R: RTVUSRSPC USRSPC(&USRSPCLIB/&USRSPC) STRPOS(&JOBE) + RTVLEN(&JOBELEN) RCVVAR(&JOBENT) /* Get a job identifier from the list... */ CHGVAR VAR(&INTJOBID) VALUE(%SST(&JOBENT 27 16)) /* Retrieve the info for that job... */ RTVJOBI JOB(*INT) JOBI(&JOBI) FORMAT(*JOBQ) + INTJOBID(&INTJOBID) /* Extract info from the job info structure... */ CHGVAR VAR(&JOBSTS) VALUE(%SST(&JOBI 51 10)) CHGVAR VAR(&JOBQ) VALUE(%SST(&JOBI 63 10)) CHGVAR VAR(&JOBQLIB) VALUE(%SST(&JOBI 73 10)) CHGVAR VAR(&JOB) VALUE(%SST(&JOBI 9 10)) CHGVAR VAR(&JOBUSER) VALUE(%SST(&JOBI 19 10)) CHGVAR VAR(&JOBNBR) VALUE(%SST(&JOBI 29 6)) /* CHGJOB goes here... */ IF COND(&JOBQ *EQ &MONJOBQ *AND &JOBQLIB *EQ + &MONJOBQLIB) THEN(DO) CHGJOB JOB(&JOBNBR/&JOBUSER/&JOB) ENDDO /* End CHGJOB... */ SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Job=<' + *CAT &JOBNBR *CAT '/' *CAT &JOBUSER *TCAT + '/' *CAT &JOB *TCAT '> Job status=<' *CAT + &JOBSTS *TCAT '> Jobq=<' *CAT &JOBQ *TCAT + '> Jobq lib=<' *CAT &JOBQLIB *TCAT '>') + TOPGMQ(*EXT) /* Decrement our loop counter... */ CHGVAR VAR(&NBRJOBE) VALUE(&NBRJOBE - 1) /* */ /* While the counter is *GT zero, position to the next job in the list */ /* and loop back to get it... */ /* */ IF COND(&NBRJOBE *GT 0) THEN(DO) CHGVAR VAR(&JOBE) VALUE(&JOBE + &JOBELEN) GOTO CMDLBL(NXT_JOB_R) ENDDO /* ...otherwise drop through and return... */ RETURN ENDPGM