One morning, you arrive at the office and realize that one of your printers is broken. You need a quick way to redirect spooled files from the output queue of the broken printer to the output queue of a working printer. Sound familiar? I've got an easy way to handle this situation.
I've written a command called Redirect Output Queue (RDTOUTQ) and an associated CL program called RDT001CL. You can see the command and the CL program in Figures 3 and 4, respectively. (Note that the CL program uses the CVTBIN4DEC command from QURSTOOL, so you'll need to create that also.) The command associates a data queue with an output queue and monitors the data queue for new entries.
When a spooled file is in the "from" output queue in a ready status, an entry is automatically placed in the data queue. The program receives the entry and extracts the information necessary to move the spooled file to the "to" output queue. (Spooled files in the output queue in a ready status when the program starts will not be moved. Those files need to be held and then released before they will be moved to the new output queue.) You can submit the command to a multithreaded batch subsystem; spooled files will be moved as long as you leave the job running. As you might imagine, this command could save you quite a bit of time.
- Jean-Jacques Risch
TechTalk: Automatically move spooled files from one output queue to another.
Figure 3: RDTOUTQ Command Source
/*===============================================================*/ /* To compile: */ /* */ /* CRTCMD CMD(XXX/RDTOUTQ) PGM(XXX/RDT001CL) + */ /* SRCFILE(XXX/QCMDSRC) */ /* */ /*===============================================================*/ CMD PROMPT('Redirect an Output Queue') PARM KWD(FRMOUTQ) TYPE(QUAL) MIN(1) PROMPT('From + Output Queue') PARM KWD(TOOUTQ) TYPE(QUAL) MIN(1) PROMPT('To + Output Queue') QUAL: QUAL TYPE(*NAME) LEN(10) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL)) PROMPT('Library')
TechTalk: Automatically move spooled files from one output queue to another.
Figure 4: RDT001CL Source
/*===============================================================*/ /* To compile: */ /* */ /* CRTCLPGM PGM(XXX/RDT001CL) SRCFILE(XXX/QCLSRC) */ /* */ /* (Requires the CVTBIN4DEC TAATOOL Command) */ /*===============================================================*/ PGM PARM(&FOUTQ_LIB &TOUTQ_LIB) DCL VAR(&FOUTQ_LIB) TYPE(*CHAR) LEN(20) DCL VAR(&FOUTQ) TYPE(*CHAR) LEN(10) DCL VAR(&FLIB) TYPE(*CHAR) LEN(10) DCL VAR(&TOUTQ_LIB) TYPE(*CHAR) LEN(20) DCL VAR(&TOUTQ) TYPE(*CHAR) LEN(10) DCL VAR(&TLIB) TYPE(*CHAR) LEN(10) DCL VAR(&DTAQ) TYPE(*CHAR) LEN(10) DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(10) + VALUE('QUSRSYS') DCL VAR(&WAIT) TYPE(*DEC) LEN(5 0) VALUE(-1) DCL VAR(&FLDLEN) TYPE(*DEC) LEN(5 0) DCL VAR(&FIELD) TYPE(*CHAR) LEN(256) DCL VAR(&SPOOL) TYPE(*CHAR) LEN(10) DCL VAR(&SPOOLNBR) TYPE(*DEC) LEN(5 0) DCL VAR(&SPOOLNBRB) TYPE(*CHAR) LEN(4) DCL VAR(&SPOOLNBRH) TYPE(*DEC) LEN(9 0) DCL VAR(&JOB) TYPE(*CHAR) LEN(10) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) CHGVAR VAR(&FOUTQ) VALUE(%SST(&FOUTQ_LIB 1 10)) CHGVAR VAR(&FLIB) VALUE(%SST(&FOUTQ_LIB 11 10)) CHGVAR VAR(&TOUTQ) VALUE(%SST(&TOUTQ_LIB 1 10)) CHGVAR VAR(&TLIB) VALUE(%SST(&TOUTQ_LIB 11 10)) CHKOBJ OBJ(&FLIB/&FOUTQ) OBJTYPE(*OUTQ) MONMSG MSGID(CPF9801 CPF9810) EXEC(DO) SNDPGMMSG MSGID(CPF3357) MSGF(QCPFMSG) MSGDTA(&FOUTQ + *CAT &FLIB) MSGTYPE(*ESCAPE) GOTO CMDLBL(ENDIT) ENDDO CHKOBJ OBJ(&TLIB/&TOUTQ) OBJTYPE(*OUTQ) MONMSG MSGID(CPF9801 CPF9810) EXEC(DO) SNDPGMMSG MSGID(CPF3357) MSGF(QCPFMSG) MSGDTA(&TOUTQ + *CAT &TLIB) MSGTYPE(*ESCAPE) GOTO CMDLBL(ENDIT) ENDDO CHGVAR VAR(&DTAQ) VALUE(&FOUTQ) DLTDTAQ DTAQ(&DTAQLIB/&DTAQ) MONMSG MSGID(CPF0000) CRTDTAQ DTAQ(&DTAQLIB/&DTAQ) MAXLEN(256) ALCOBJ OBJ((&DTAQLIB/&DTAQ *DTAQ *EXCL)) WAIT(0) CHGOUTQ OUTQ(&FLIB/&FOUTQ) DTAQ(&DTAQLIB/&DTAQ) GET_NEXT: CALL PGM(QRCVDTAQ) PARM(&DTAQ &DTAQLIB &FLDLEN + &FIELD &WAIT) CHGVAR VAR(&SPOOL) VALUE(%SST(&FIELD 39 10)) CHGVAR VAR(&SPOOLNBRB) VALUE(%SST(&FIELD 49 4)) CVTBIN4DEC FROMBIN(&SPOOLNBRB) TODEC(&SPOOLNBRH) + SETLR(*ON) CHGVAR VAR(&SPOOLNBR) VALUE(&SPOOLNBRH) CHGVAR VAR(&JOB) VALUE(%SST(&FIELD 13 10)) CHGVAR VAR(&USER) VALUE(%SST(&FIELD 23 10)) CHGVAR VAR(&JOBNBR) VALUE(%SST(&FIELD 33 6)) /* The next statement moves the spooled file to the "to" output */ /* queue, but you could also either copy the spooled file or use */ /* the SNDNETSPLF to send it to another system. */ CHGSPLFA FILE(&SPOOL) JOB(&JOBNBR/&USER/&JOB) + SPLNBR(&SPOOLNBR) DEV(*OUTQ) + OUTQ(&TLIB/&TOUTQ) MONMSG MSGID(CPF0000) GOTO CMDLBL(GET_NEXT) ENDIT: ENDPGM
LATEST COMMENTS
MC Press Online