星期一, 11月 06, 2023

2004-03-01 如何取得某一 Data Queue 的定義(API QMHQRDQD)


如何取得某一 Data Queue 的定義(API QMHQRDQD)

有時候要利用 Data Queue 來完成程式間的資訊交換,但是又會忘記所產生的 Data Queue 定義,
如Data Queue 中每一筆 Entry 的長度,這個長度與程式將資料寫入Data Queue有關,若寫入長度
超過當初產生(CRTDTAQ) Data Queue 的定義長度時,程式會有警告訊息,但程式不會當掉,但是
資訊又寫不進 Data Queue,此時就比較難
Debug,所以需要取得 Data Queue 的定義來判斷。 OS/400 提供一個 API QMHQRDQD 即可以符
合此需求。

此範例會顯示所指定的 Data Queue 當初所產生 Data Queue 指令的定義於畫面第 24 行,
可以將游標移至 24 行,按 F1 顯示該 Data queue 當初所執行的指令詳細資訊。


File  : QCLSRC
Member: RTVDTAQDC
Type  : CLP
Usage : CRTCLPGM RTVDTAQDC
        CALL RTVDTAQDC ('dataqueue library   ')
        參數長度 20,前十位為 Data Queue 名稱,後十位為Data Queue 所在的 Library


PGM  (&DTAQ)

DCL &DTAQ *CHAR 20
DCL &MAXLEN *CHAR 5
DCL &MAXLENN *DEC (5 0)
DCL &FORCE *CHAR 4
DCL &SEQ *CHAR 6
DCL &KEYLEN *CHAR 4 VALUE('*N')
DCL &SENDRID *CHAR 4
DCL &TEXT *CHAR 50
DCL &RCVRLEN *CHAR 4
DCL &RCVR *CHAR 80
DCL &MSGTEXT *CHAR 250

CHGVAR %BIN(&RCVRLEN 1 4) 80
/* CHGVAR &DTAQ ('DATAQUEUE LIBRARY   ') */

/*****************************************************************/
/* RETREIVE DATA QUEUE ATTRIBUTES                                */
/*****************************************************************/
CALL QMHQRDQD (&RCVR &RCVRLEN RDQD0100 &DTAQ)
MONMSG CPF0000 EXEC(CALL QMHRSNEM ('    ' X'00000000'))

/*****************************************************************/
/* SET VARIABLES FOR CRTDTAQ PARAMETERS FROM THE DATA QUEUE      */
/* ATTRIBUTES FROM QMHQRDQD.                                     */
/*****************************************************************/
CHGVAR &MAXLEN %BIN(&RCVR 9 4)
CHGVAR &MAXLENN &MAXLEN

IF (%SST(&RCVR 17 1) *EQ 'K') +
  DO
    CHGVAR &KEYLEN %BIN(&RCVR 13 4)
    CHGVAR &SEQ *KEYED
   ENDDO
 ELSE IF (%SST(&RCVR 17 1) *EQ 'L') CHGVAR &SEQ *LIFO
 ELSE CHGVAR &SEQ *FIFO
 IF (%SST(&RCVR 18 1) *EQ 'N') CHGVAR &SENDRID *NO
 ELSE CHGVAR &SENDRID *YES

 IF (%SST(&RCVR 19 1) *EQ 'N') CHGVAR &FORCE *NO
 ELSE CHGVAR &FORCE *YES
 CHGVAR &TEXT %SST(&RCVR 20 50)

/*****************************************************************/
/* CREATE THE NEW DATA QUEUE                                     */
/*****************************************************************/
CHGVAR VAR(&MSGTEXT) VALUE( +
'DATA QUEUE CREATING COMMAND AS FOLLOWING:                  ' *CAT +
'CRTDTAQ DTAQ(' *CAT %SST(&DTAQ 11 10) *TCAT '/' *CAT +
                 %SST(&DTAQ 1 10)  *TCAT ')' *BCAT +
    'MAXLEN(' *CAT &MAXLEN *TCAT ')'       *BCAT +
    'FORCE(' *CAT &FORCE *TCAT ')'         *BCAT +
    'SEQ(' *CAT &SEQ *TCAT ')'             *BCAT +
    'KEYLEN(' *CAT &KEYLEN *TCAT ')'       *BCAT +
    'SENDERID(' *CAT &SENDRID *TCAT ')'    *BCAT +
    'TEXT(' *CAT &TEXT *TCAT ')')

SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) +
                          MSGDTA(&MSGTEXT) MSGTYPE(*COMP)

 /* ? CRTDTAQ (%SST(&DTAQ 11 10)/%SST(&DTAQ 1 10)) +
  MAXLEN(&MAXLEN) FORCE(&FORCE) SEQ(&SEQ) KEYLEN(&KEYLEN) +
  SENDERID(&SENDRID) TEXT(&TEXT)   */
MONMSG CPF0000 EXEC(CALL QMHRSNEM ('    ' X'00000000'))

ENDPGM

執行結果如下(將游標移至 24 行,按 F1 顯示):

                        Additional Message Information                         
                                                                               
Message ID . . . . . . :   CPF9897       Severity . . . . . . . :   40         
Message type . . . . . :   Information                                         
Date sent  . . . . . . :   03/01/04      Time sent  . . . . . . :   13:16:23   
                                                                               
Message . . . . :   DATA QUEUE CREATING COMMAND AS FOLLOWING:                  
  CRTDTAQ DTAQ(LIBRARY/DTAQ) MAXLEN(05400) FORCE(*NO) SEQ(*FIFO) KEYLEN(*N)    
  SENDERID(*NO) TEXT()                                                         
Cause . . . . . :   No additional online help information is available.        
            





沒有留言: