如何動態使用 Library list ? (Command: USEJOBDILL API QWDRJOBD)
File : QCLSRC
Member: USEJOBDILL
Type : CLP
Usage : CRTCLPGM USEJOBDILL
/* =============================================================== */
/* = Command USEJOBDILL CPP = */
/* = USEJOBDILL = */
/* = Paramater notes: = */
/* = JOBDQUAL: JobD name = */
/* =============================================================== */
/* = Date : 2006/05/30 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
CHKJOBDINL: PGM PARM(&JOBDQUAL)
DCL VAR(&JOBDQUAL) TYPE(*CHAR) LEN(20) /* +
Qualified job description name */
DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBD) TYPE(*CHAR) LEN(10)
DCL VAR(&CMD) TYPE(*CHAR) LEN(3000)
DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) VALUE(3000)
DCL VAR(&INLLIBL) TYPE(*CHAR) LEN(2750)
DCL VAR(&STARTPOS) TYPE(*DEC) LEN(5 0) /* +
Substring start position */
DCL VAR(&LEN) TYPE(*DEC) LEN(5 0) /* Length of +
array with libraries */
DCL VAR(&RECEIVER) TYPE(*CHAR) LEN(7000)
DCL VAR(&RECLEN) TYPE(*CHAR) LEN(4) /* receiver +
length */
DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* Offset to +
initial library list in Binary */
DCL VAR(&ENTNBR) TYPE(*CHAR) LEN(4) /* Number of +
libraries in Binary */
DCL VAR(&I) TYPE(*DEC) LEN(5 0) VALUE(0)
DCL VAR(&J) TYPE(*DEC) LEN(5 0)
dcl &MsgId *CHAR 7
dcl &MsgDta *CHAR 256
dcl &MSGF *CHAR 10
dcl &MSGFLIB *CHAR 10
dcl &MSGTXT *CHAR 256
MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO error)
CHGVAR VAR(&JOBD) VALUE(%SST(&JOBDQUAL 1 10))
CHGVAR VAR(&LIB) VALUE(%SST(&JOBDQUAL 11 10))
CHKOBJ OBJ(&LIB/&JOBD) OBJTYPE(*JOBD)
CALL PGM(QWDRJOBD) PARM(&RECEIVER &RECLEN +
'JOBD0100' &JOBDQUAL X'00000000')
CHGVAR VAR(&OFFSET) VALUE(%SST(&RECEIVER 361 4))
CHGVAR VAR(&STARTPOS) VALUE(%BIN(&OFFSET) + 1)
CHGVAR VAR(&ENTNBR) VALUE(%SST(&RECEIVER 365 4))
CHGVAR VAR(&LEN) VALUE(%BIN(&ENTNBR) * 11)
CHGVAR VAR(&INLLIBL) VALUE(%SST(&RECEIVER &STARTPOS +
&LEN))
/* Check library exist or not */
CHGVAR VAR(&I) VALUE(0)
NEXT: CHGVAR VAR(&J) VALUE((&I * 11) + 1)
CHGVAR &LIB %SST(&INLLIBL &J 10)
IF (&LIB *NE ' ') DO
CHKOBJ OBJ(&LIB) OBJTYPE(*LIB)
ENDDO
CHGVAR VAR(&I) VALUE(&I + 1)
IF COND(&I *LT %BIN(&ENTNBR)) THEN(GOTO +
CMDLBL(NEXT))
CHGVAR VAR(&CMD) VALUE('CHGLIBL (' *BCAT &INLLIBL +
*TCAT ')')
CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN)
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: USEJOBDILL
Type : CMD
Usage : CRTCMD CMD(USEJOBDILL) PGM(USEJOBDILL)
Usage : Create two jobd with your own library list, one is for testing environment,
the other is for production environment.
USEJOBDILL JOBD(yourlib/testing_jobd)
or
USEJOBDILL JOBD(yourlib/production_jobd)
所以你不用總是使用 addlible 或 chglibl 修改或增加 library list, 也不用將
Library list 至於程式中. 將省去不少測試時間, 若要更改 library list, 只要更改
Jobd 的 INLLIBL 參數即可.
/* =============================================================== */
/* = Command....... USEJOBDILL = */
/* = CPP........... USEJOBDILL = */
/* = Description... Use Jobd initial library list as runtime = */
/* = library list = */
/* = = */
/* = CrtCmd Cmd( USEJOBDILL) = */
/* = Pgm( USEJOBDILL ) = */
/* = SrcFile( YourSourceFile ) = */
/* =============================================================== */
/* = Date : 2006/05/30 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
CMD PROMPT('Use JOBD Initial Library List')
Parm Kwd( JobD ) +
Type( QObj ) +
Min( 1 ) +
Prompt( 'Job Descriptoion' )
QObj: Qual Type( *Name ) +
Len( 10 ) +
Min( 1 ) +
Expr( *Yes )
Qual Type( *Name ) +
Len( 10 ) +
Min( 1 ) +
Expr( *Yes ) +
Prompt( 'Library' )
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期二, 11月 07, 2023
2007-04-17 如何動態使用 Library list ? (Command: USEJOBDILL API QWDRJOBD)
星期四, 11月 02, 2023
2002-11-25 如何取得 JOBD 中的 Library list ?(Command RTVJDLIBL -- API QWDRJOBD)
如何取得 JOBD 中的 Library list ?(Command RTVJDLIBL -- API QWDRJOBD)
於前期中有提及如何檢查某 Library 中的 JobD 的 INLLIBL 參數是否含有指定的 Library,
本期直接將擷取 JOBD 的 INLLIBL 部分直接寫成指令便於使用, 此 RTVJDLIBL 指令傳回
Library list 字串及 Library list 中含有 library 的個數便於擷取, Library list
字串中的每一 library 長度為 10, library 間有一個空白, 所以當擷取每一個 library 時, 需要以 11 為長度單位, 如
1 2 3 4
1234567890123456789012345678901234567890
Library1 Library2 Library3
第一個位置 1, 第二個位置 12, 第三個位置 23,...
File : QCLSRC
Member: RTVJDLIBLC
Type : CLP
Usage : CRTCLPGM RTVJDLIBLC
Version: ALL
/* After you executed RTVJDLIBL you can use QCMDEXC to adjust */
/* your library list. */
/* CHGVAR VAR(&CHGLIBL) VALUE('CHGLIBL LIBL(' *CAT +
&INLLIBB *CAT ')') */
/* CALL PGM(*LIBL/QCMDEXC) PARM(&CHGLIBL 500) */
PGM PARM(&JOBD &INLLIBL &INLLIBLCNT)
DCL VAR(&JOBD) TYPE(*CHAR) LEN(20) +
/* Qualified name of jobdescription */
DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(2750) +
/* Receiver Variable */
DCL VAR(&RCVLEN) TYPE(*DEC) LEN(9 0) VALUE(2750) +
/* Length of receiver variable */
DCL VAR(&RCVLBIN) TYPE(*CHAR) LEN(4) +
/* Receiver length in binary */
DCL VAR(&FORMAT) TYPE(*CHAR) LEN(8) +
VALUE(JOBD0100) /* Format name */
DCL VAR(&ERROR) TYPE(*CHAR) LEN(8)
DCL VAR(&ZERODEC) TYPE(*DEC) LEN(9 0)
DCL VAR(&ZEROBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4)
DCL VAR(&NBRLIB) TYPE(*CHAR) LEN(4)
DCL VAR(&OFFSETDEC) TYPE(*DEC) LEN(9 0)
DCL VAR(&NBRLIBDEC) TYPE(*DEC) LEN(9 0)
DCL VAR(&INLLIBL) TYPE(*CHAR) LEN(275)
DCL VAR(&INLLIBLCNT) TYPE(*CHAR) LEN(9)
CHGVAR VAR(%BIN(&RCVLBIN)) VALUE(&RCVLEN)
CHGVAR VAR(%BIN(&ZEROBIN)) VALUE(&ZERODEC)
CHGVAR VAR(&ERROR) VALUE(&ZEROBIN *CAT &ZEROBIN +
*CAT ' ')
CALL PGM(QWDRJOBD) PARM(&RCVVAR &RCVLBIN &FORMAT +
&JOBD &ERROR)
CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 361 4))
CHGVAR VAR(&NBRLIB) VALUE(%SST(&RCVVAR 365 4))
CHGVAR VAR(&OFFSETDEC) VALUE(%BIN(&OFFSET))
CHGVAR VAR(&NBRLIBDEC) VALUE(%BIN(&NBRLIB))
CHGVAR VAR(&INLLIBLCNT) VALUE(&NBRLIBDEC)
CHGVAR VAR(&OFFSETDEC) VALUE(&OFFSETDEC + 1)
CHGVAR VAR(&NBRLIBDEC) VALUE(&NBRLIBDEC * 11)
CHGVAR VAR(&INLLIBL) VALUE(%SST(&RCVVAR &OFFSETDEC +
&NBRLIBDEC))
ENDPGM
File : QCMDSRC
Member: RTVJDLIBL
Type : CMD
Usage : RTVCMD CMD(RTVJDLIBL) PGM(RTVJDLIBLC) ALLOW(*IPGM *BPGM)
Version: ALL
CMD PROMPT('Retrieve library-list of jobd')
/*********************************************************/
/* Compile met ALLOW(*IPGM *BPGM) !!!!! */
/* *******************************************************/
PARM KWD(JOBD) TYPE(Q1) PROMPT('Job description:')
PARM KWD(INLLIBL) TYPE(*CHAR) LEN(275) +
RTNVAL(*YES) PROMPT('Initial library list:')
PARM KWD(INLLIBLCNT) TYPE(*CHAR) LEN(9) +
RTNVAL(*YES) PROMPT('Initial library list count:')
Q1: QUAL TYPE(*NAME) LEN(10) MIN(1)
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL)) PROMPT('Library name:')
File : QCLSRC
Member: RTVJDLIBLT
Type : CLP
Usage : CRTCLPGM RTVJDLIBLT
CALL RTVJDLIBLT 'your jobd'
Version : ALL
PGM &JOBD
DCL &JOBD *CHAR 10
DCL &INLLIBL *CHAR 275
DCL &INLLIBLCNT *CHAR 9
DCL &MSG *CHAR 256
RTVJDLIBL JOBD(&JOBD) INLLIBL(&INLLIBL) +
INLLIBLCNT(&INLLIBLCNT)
CHGVAR &MSG (&INLLIBLCNT *BCAT &INLLIBL)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(&MSG) +
MSGTYPE(*COMP)
/* SNDPGMMSG MSG(&MSG) */
ENDPGM
2002-11-06 如何檢查 JobD 中的 Initial library list 是否含有某個 Library ?(使用 API QWDRJOBD)
如何檢查 JobD 中的 Initial library list 是否含有某個 Library ?(使用 API QWDRJOBD)
JobD 包含使用者的工作環境設定, 可以使用 API QWDRJOBD 取得相關 JobD 的資訊.
File : QCLSRC
Member: CHKJOBDINL
Type : CLP
OS Version: no limit
Usage : CRTCLPGM CHKJOBDINL
CALL CHKJOBDINL 'library'
CALL CHKJOBDINL 'QGPL'
/* Program : CHKJOBDINL */
/* */
/* Description : Check all job descriptions if a certain library */
/* exists in the initial library list. */
/* */
/* Input Parameters : */
/* ---------------- */
/* &LIB Library to check for in all jobd */
/* */
CHKJOBDINL: PGM PARM(&LIB)
DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBDQUAL) TYPE(*CHAR) LEN(20) /* +
Qualified job description name */
DCL VAR(&INLLIBL) TYPE(*CHAR) LEN(2750)
DCL VAR(&STARTPOS) TYPE(*DEC) LEN(5 0) /* +
Substring start position */
DCL VAR(&LEN) TYPE(*DEC) LEN(5 0) /* Length of +
array with libraries */
DCL VAR(&RECEIVER) TYPE(*CHAR) LEN(7000)
DCL VAR(&RECLEN) TYPE(*CHAR) LEN(4) /* receiver +
length */
DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* Offset to +
initial library list in Binary */
DCL VAR(&ENTNBR) TYPE(*CHAR) LEN(4) /* Number of +
libraries in Binary */
DCL VAR(&I) TYPE(*DEC) LEN(5 0) VALUE(0)
DCL VAR(&J) TYPE(*DEC) LEN(5 0)
DCL VAR(&NBR) TYPE(*DEC) LEN(7 0)
DCL VAR(&NBR_CHR) TYPE(*CHAR) LEN(7)
DCLF FILE(QSYS/QADSPOBJ)
CHGVAR VAR(%BIN(&RECLEN)) VALUE(7000)
DSPOBJD OBJ(*ALL/*ALL) OBJTYPE(*JOBD) +
OUTPUT(*OUTFILE) OUTFILE(QTEMP/ALLJOBD)
OVRDBF FILE(QADSPOBJ) TOFILE(QTEMP/ALLJOBD)
READ: RCVF
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(EOF))
CHGVAR VAR(&JOBDQUAL) VALUE(&ODOBNM *CAT &ODLBNM)
CALL PGM(QWDRJOBD) PARM(&RECEIVER &RECLEN +
'JOBD0100' &JOBDQUAL X'00000000')
CHGVAR VAR(&OFFSET) VALUE(%SST(&RECEIVER 361 4))
CHGVAR VAR(&STARTPOS) VALUE(%BIN(&OFFSET) + 1)
CHGVAR VAR(&ENTNBR) VALUE(%SST(&RECEIVER 365 4))
CHGVAR VAR(&LEN) VALUE(%BIN(&ENTNBR) * 11)
CHGVAR VAR(&INLLIBL) VALUE(%SST(&RECEIVER &STARTPOS +
&LEN))
CHGVAR VAR(&I) VALUE(0)
NEXT: CHGVAR VAR(&J) VALUE((&I * 11) + 1)
IF COND(%SST(&INLLIBL &J 10) *EQ &LIB) +
THEN(GOTO CMDLBL(FOUND))
CHGVAR VAR(&I) VALUE(&I + 1)
IF COND(&I *LT 250) THEN(GOTO CMDLBL(NEXT))
GOTO CMDLBL(READ)
FOUND: SNDPGMMSG MSG('Library ' *CAT &LIB *BCAT 'found in +
jobd' *BCAT &ODLBNM *TCAT '/' *CAT &ODOBNM)
CHGVAR VAR(&NBR) VALUE(&NBR + 1)
GOTO CMDLBL(READ)
EOF: DLTF FILE(QTEMP/ALLJOBD)
CHGVAR VAR(&NBR_CHR) VALUE(&NBR)
SNDPGMMSG MSG('Library ' *CAT &LIB *BCAT 'found' *BCAT +
&NBR_CHR *BCAT 'times in job descriptions.')
END: ENDPGM
訂閱:
文章 (Atom)