顯示具有 JOBD 標籤的文章。 顯示所有文章
顯示具有 JOBD 標籤的文章。 顯示所有文章

星期二, 11月 07, 2023

2007-04-17 如何動態使用 Library list ? (Command: USEJOBDILL API QWDRJOBD)


如何動態使用 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' )



                        



星期四, 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