PTF management has come a long way since the days of OS/400 V1R1M0, but it still has some distance to go before it becomes an intuitive process.
Of all the features of the Send PTF Order (SNDPTFORD) command, the one I like best is the PTFPART parameter, which can be given the value *CVRLTR if all you want to receive is the cover letter. Of course, you can also let it default to *ALL if you want to receive everything.
IBM didn't make it easy to get to the cover letter, however. The cover letter is received into a member (named after the PTF) in database file QGPL/QAPZCOVER, something entirely unintuitive. You must then use the DSPPFM command to read it, or figure out a way to print it.
That prompted me to create the Display Cover Letter (DSPCVRLTR) command, which is listed in detail in Figures 3a and 3b (page 64). The DSPCVRLTR command can display or print the cover letter, only asking for the PTF number. Optionally you can request that the member in QAPZCOVER be removed after displaying or printing the cover letter. If you request to print the cover letter, DSPCVRLTR prompts you for the name of the output queue where the spool file is to be placed.
TechTalk: Getting PTF Cover Lettes
Figure 3A Command DSPCVRLTR
DSPCVRLTR: CMD PROMPT('Display PTF Cover Letter') PARM KWD(PTF) TYPE(*NAME) LEN(7) SPCVAL((*CUM) + (*HIPER) (*SUMM)) MIN(1) PROMPT('PTF number') PARM KWD(SNDPTFORD) TYPE(*CHAR) LEN(4) RSTD(*YES) + DFT(*NO) VALUES(*YES *NO) PROMPT('Send + PTF order') PARM KWD(REMOVE) TYPE(*CHAR) LEN(4) RSTD(*YES) + DFT(*NO) VALUES(*YES *NO) PROMPT('Remove + after') PARM KWD(OUTPUT) TYPE(*CHAR) LEN(6) RSTD(*YES) + DFT(*) VALUES(* *PRINT) PROMPT('Output') PARM KWD(OUTQ) TYPE(Q1) PMTCTL(PC1) + PROMPT('Output queue') PARM KWD(VERSION) TYPE(*CHAR) LEN(1) DFT(2) + RANGE(1 9) PMTCTL(PC2) PROMPT('OS/400 + version') PARM KWD(RELEASE) TYPE(*CHAR) LEN(1) DFT(1) + RANGE(1 9) PMTCTL(PC2) PROMPT('OS/400 + release') PARM KWD(MODIF) TYPE(*CHAR) LEN(1) DFT(0) RANGE(0 + 9) PMTCTL(PC2) PROMPT('OS/400 modification') PC1: PMTCTL CTL(OUTPUT) COND((*EQ *PRINT)) PC2: PMTCTL CTL(PTF) COND((*EQ *CUM)) PMTCTL CTL(PTF) COND((*EQ *HIPER)) LGLREL(*OR) PMTCTL CTL(PTF) COND((*EQ *SUMM)) LGLREL(*OR) Q1: QUAL TYPE(*NAME) LEN(10) DFT(*JOB) SPCVAL((*JOB)) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL)) PROMPT('Library')
TechTalk: Getting PTF Cover Lettes
Figure 3B CL program CVR001CL
CVR001CL: + PGM PARM(&PTF &SNDPTFORD &REMOVE &OUTPUT &QUALOUTQ &VERSION + &RELEASE &MODIF) DCL VAR(&MODIF) TYPE(*CHAR) LEN(1) DCL VAR(&MSG) TYPE(*CHAR) LEN(80) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(80) DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(6) DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10) DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(10) DCL VAR(&PTF) TYPE(*CHAR) LEN(7) DCL VAR(&QUALOUTQ) TYPE(*CHAR) LEN(20) DCL VAR(&RELEASE) TYPE(*CHAR) LEN(1) DCL VAR(&REMOVE) TYPE(*CHAR) LEN(4) DCL VAR(&SNDPTFORD) TYPE(*CHAR) LEN(4) DCL VAR(&VERSION) TYPE(*CHAR) LEN(1) /* Translate PTF special values */ IF COND(&PTF *EQ '*CUM') THEN(CHGVAR VAR(&PTF) VALUE('SF99' *CAT + &VERSION *CAT &RELEASE *CAT &MODIF)) ELSE CMD(IF COND(&PTF *EQ '*HIPER') THEN(CHGVAR VAR(&PTF) + VALUE('SF98' *CAT &VERSION *CAT &RELEASE *CAT &MODIF))) ELSE CMD(IF COND(&PTF *EQ '*SUMM') THEN(CHGVAR VAR(&PTF) + VALUE('SF97' *CAT &VERSION *CAT &RELEASE *CAT &MODIF))) /* Break qualified name */ CHGVAR VAR(&OUTQ) VALUE(%SST(&QUALOUTQ 1 10)) CHGVAR VAR(&OUTQLIB) VALUE(%SST(&QUALOUTQ 11 10)) IF COND(&OUTQ *EQ '*JOB') THEN(DO) RTVJOBA OUTQ(&OUTQ) OUTQLIB(&OUTQLIB) ENDDO /* Validate input */ CHKOBJ OBJ(QGPL/QAPZCOVER) OBJTYPE(*FILE) MBR(&PTF) MONMSG MSGID(CPF9801) EXEC(DO) CHGVAR VAR(&MSG) VALUE('Terminal error: File QGPL/QAPZCOVER + not found.') GOTO CMDLBL(SNDERRMSG) ENDDO MONMSG MSGID(CPF9810) EXEC(DO) CHGVAR VAR(&MSG) VALUE('Terminal error: Library QGPL not + found.') GOTO CMDLBL(SNDERRMSG) ENDDO MONMSG MSGID(CPF9815) EXEC(DO) IF COND(&SNDPTFORD *EQ '*NO') THEN(DO) CHGVAR VAR(&MSG) VALUE('Cover letter not found for PTF' + *BCAT &PTF *TCAT '.') GOTO CMDLBL(SNDERRMSG) ENDDO ENDDO IF COND(&OUTPUT *EQ '*PRINT') THEN(DO) CHKOBJ OBJ(&OUTQLIB/&OUTQ) OBJTYPE(*OUTQ) MONMSG MSGID(CPF9801) EXEC(DO) CHGVAR VAR(&MSG) VALUE('Output queue' *BCAT &OUTQ *BCAT + 'not found in' *BCAT &OUTQLIB *TCAT '.') GOTO CMDLBL(SNDERRMSG) ENDDO MONMSG MSGID(CPF9810) EXEC(DO) CHGVAR VAR(&MSG) VALUE('Output queue library' *BCAT + &OUTQLIB *BCAT 'not found.') GOTO CMDLBL(SNDERRMSG) ENDDO ENDDO /* Send PTF order as requested */ CHKOBJ OBJ(QGPL/QAPZCOVER) OBJTYPE(*FILE) MBR(&PTF) MONMSG MSGID(CPF9815) EXEC(DO) IF COND(&SNDPTFORD *EQ '*YES') THEN(DO) DLTF FILE(QGPL/('P' *CAT &PTF)) MONMSG MSGID(CPF0000) SNDPTFORD PTFID(&PTF) PTFPART(*CVRLTR) RMTCPNAME(*IBMSRV) + RMTNETID(*NETATR) ORDER(*PTFID) REORDER(*YES) MONMSG MSGID(CPF0000) EXEC(DO) RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) + MSGF(&MSGF) MSGFLIB(&MSGFLIB) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE) GOTO CMDLBL(ENDPGM) ENDDO ENDDO ENDDO /* Display or print cover letter */ IF COND(&OUTPUT *EQ '*') THEN(DO) DSPPFM FILE(QGPL/QAPZCOVER) MBR(&PTF) MONMSG MSGID(CPF9845) EXEC(GOTO CMDLBL(ENDPGM)) ENDDO ELSE CMD(DO) OVRPRTF FILE(QSYSPRT) OUTQ(&OUTQLIB/&OUTQ) CPYF FROMFILE(QGPL/QAPZCOVER) TOFILE(QSYSPRT) FROMMBR(&PTF) MONMSG MSGID(CPF2817) EXEC(GOTO CMDLBL(ENDPGM)) DLTOVR FILE(QSYSPRT) ENDDO IF COND(&REMOVE *EQ '*YES') THEN(RMVM FILE(QGPL/QAPZCOVER) + MBR(&PTF)) GOTO CMDLBL(ENDPGM) /* Send error message */ SNDERRMSG: + SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) /* End program */ ENDPGM: + ENDPGM
LATEST COMMENTS
MC Press Online