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

星期四, 11月 09, 2023

2014-12-23 如何以 java 取得 data queue 的所有屬性?(Retreive data queue description with API QMHQRDQD)


如何以 java 取得 data queue 的所有屬性?(Retreive data queue description with API QMHQRDQD)

RtvDtaqD.java
     



/* ==================================================================*/
/*                                                                   */
/*  Program . . : RtvDtaqD.java                                      */
/*  Description : Retrieve data queue description                    */
/*  Author  . . : Vengoal Chang                                      */
/*  Published . : AS400ePaper                                        */
/*  Date  . . . : December 23, 2014                                  */
/*                                                                   */
/* ==================================================================*/

package com.free400.vengoal.as400api;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Bin4;
import com.ibm.as400.access.AS400Exception;
import com.ibm.as400.access.AS400Text;
import com.ibm.as400.access.CharConverter;
import com.ibm.as400.access.DateTimeConverter;
import com.ibm.as400.access.ProgramCall;
import com.ibm.as400.access.ProgramParameter;
import com.ibm.as400.access.ServiceProgramCall;
import com.ibm.as400.access.Trace;

public class RtvDtaqD {
	private static final int PAD_LIMIT = 8192;
	private static final AS400Bin4 intConverter_ = new AS400Bin4();
	public static Calendar cal = Calendar.getInstance();
	public static DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

private static ProgramParameter[] buildProgramParameters(AS400 as400, String dtaqname, String dtaqlib) throws Exception {
		
		ProgramParameter[] parameterList = new ProgramParameter[4];
		parameterList[0] = new ProgramParameter(120);
		
		parameterList[1] = new ProgramParameter(intConverter_.toBytes(120));		
			
		AS400Text text8 = new AS400Text(8, as400);
		parameterList[2] = new ProgramParameter(text8.toBytes("RDQD0100"));	
		
		AS400Text text20 = new AS400Text(20, as400);
		byte[] dtaqNameLibBytes = text20.toBytes(padRight(dtaqname, 10) + padRight(dtaqlib, 10));
		parameterList[3] = new ProgramParameter(dtaqNameLibBytes);
				
		return parameterList;			
	}

	private static void rtvDtaqDesc(AS400 as400, String dtaqname, String dtaqlib){
		try{
			CharConverter charConverter = new CharConverter(as400.getCcsid(), as400);
			ProgramParameter[] parameters = buildProgramParameters(as400, dtaqname, dtaqlib);
			ProgramCall  rtvDtaqPgmDCall = new ProgramCall(as400, "/QSYS.LIB/QMHQRDQD.PGM", parameters);
			//Trace.setTraceAllOn(true);
			//Trace.setTraceOn(true);
			if (rtvDtaqPgmDCall.run() != true) {
				throw new AS400Exception(rtvDtaqPgmDCall.getMessageList());
			} else {
				byte[] rcvVar = parameters[0].getOutputData();
				int maxentlen = intConverter_.toInt(rcvVar, 8);
				System.out.println("Maximum entry length: " + maxentlen );
				
				int keylen = intConverter_.toInt(rcvVar, 12);
				System.out.println("Key length: " + keylen );
				
				String sequence = charConverter.byteArrayToString(rcvVar, 16, 1);
				System.out.println("Sequence: " + sequence );
				
				String senderid = charConverter.byteArrayToString(rcvVar, 17, 1); 
				System.out.println("Include sender ID: " + senderid );
				
				String forceindicator = charConverter.byteArrayToString(rcvVar, 18, 1);
				System.out.println("Force indicator: " + forceindicator );
				
				String text = charConverter.byteArrayToString(rcvVar, 19, 50);
				System.out.println("Text: " + text );
				
				String typeOfDq = charConverter.byteArrayToString(rcvVar, 69, 1);
				System.out.println("Type of data queue: " + typeOfDq );
				
				String autoReclaim = charConverter.byteArrayToString(rcvVar, 70, 1);
				System.out.println("Automatic Reclaim: " + autoReclaim );
				
				String eforceDqLck = charConverter.byteArrayToString(rcvVar, 71, 1);
				System.out.println("Enforce data queue locks: " + eforceDqLck );
				
				int nbrOfMsg = intConverter_.toInt(rcvVar, 72);
				System.out.println("Number of messages: " + nbrOfMsg );
				
				int nbrOfMsgAlc = intConverter_.toInt(rcvVar, 76);
				System.out.println("Number of entries currently allocated: " + nbrOfMsgAlc );			
				
				String dqname = charConverter.byteArrayToString(rcvVar, 80, 10);
				System.out.println("Data queue name used: " +dqname );
				
				String dqlib = charConverter.byteArrayToString(rcvVar, 90, 10);
				System.out.println("Data queue library used: " + dqlib );
				
				int maxNbrOfEntAlw = intConverter_.toInt(rcvVar, 100);
				System.out.println("Maximum number of entries allowed: " + maxNbrOfEntAlw );	
				
				int inlNbrOfEnt = intConverter_.toInt(rcvVar, 104);
				System.out.println("Initial number of entries: " + inlNbrOfEnt );
				
				int maxNbrOfEntSpc = intConverter_.toInt(rcvVar, 108);
				System.out.println("Maximum number of entries specified: " + maxNbrOfEntSpc );
				
				DateTimeConverter dtc = new DateTimeConverter(as400);
				// System current date and time
		        byte[] systemDtsByte = new byte[8];
		        System.arraycopy(rcvVar, 112, systemDtsByte, 0, 8);
		        Date sysDate = dtc.convert(systemDtsByte, "*DTS");
		        String systemTimeStr=null;
		        if (sysDate != null){
		        	cal.setTime(sysDate);
		        	systemTimeStr = df.format(cal.getTime());
		        }
		        System.out.println("Last reclaim date and time: " + systemTimeStr );

			}
			
			} catch(Exception e){
				e.printStackTrace();
			}
	}

	public static String padRight(String s, int n) {
		return String.format("%1$-" + n + "s", s);
	}

	public static void main(String[] args)  {		
		AS400 as400 = new AS400("as400ip", "user", "password");
		rtvDtaqDesc(as400,  "DTAQ", "QGPL");
	}

}







參照: Retrieve Data Queue Description (QMHQRDQD) API




2013-09-14 擷取 Data queue 物件定義 command RTVDTAQD(Command RTVDTAQD with Retrieve Data Queue Description (QMHQRDQD) API)


擷取 Data queue 物件定義 command RTVDTAQD(Command RTVDTAQD with Retrieve Data Queue Description (QMHQRDQD) API)

File  : QCLSRC

Member: RTVDTAQD

Type  : CLP

Usage : CRTCLPGM RTVDTAQD



/*-------------------------------------------------------------------*/
/*                                                                   */
/*  Program . . : RTVDTAQD CPP                                       */
/*  Description : Retrieve data queue description                    */
/*  Author  . . : Vengoal Chang                                      */
/*  Published . : AS400ePaper                                        */
/*  Date  . . . : September 11,2013                                  */
/*  Date Changed: September 16,2013 add parameter RclTime            */
/*                                                                   */
/*  Program function:  RTVDTAQD   command processing program         */
/*                                                                   */
/*                                                                   */
/*  Program summary                                                  */
/*  ---------------                                                  */
/*                                                                   */
/*  Work management APIs:                                            */
/*    QMHQRDQD       Retrieve data queue description                 */
/*                                                                   */
/*    QWCCVTDT       Convert Date and Time Format                    */
/*                                                                   */
/*  Compile options:                                                 */
/*    CrtClPgm   Pgm( RTVDTAQD )                                     */
/*               SrcFile( QCLSRC )                                   */
/*               SrcMbr( *PGM )                                      */
/*                                                                   */
/*-------------------------------------------------------------------*/
    Pgm   ( &FullDtaQ             +
            &RtnLib               +
            &Type                 +
            &MaxLen               +
            &Force                +
            &Seq                  +
            &KeyLen               +
            &SndrId               +
            &MaxEntSpc            +
            &MaxNbrEnt            +
            &InlNbrEnt            +
            &AutoRcl              +
            &Text                 +
            &CurNbrAlc            +
            &NbrOfEnt             +
            &EnFrcLock            +
            &RclTime              +
            &RmtDtaq              +
            &RmtDtaqL             +
            &RmtLocName           +
            &Dev                  +
            &LclLocName           +
            &Mode                 +
            &RmtNetId             +
            &RmtDbName            +
          )

    Dcl   &FullDtaq   *Char    20
    Dcl   &Dtaq       *Char    10
    Dcl   &Lib        *Char    10
    Dcl   &RtnLib     *Char    10
    Dcl   &RtnLibp    *Char    10
    Dcl   &Type       *Char     4
    Dcl   &Typep      *Char     4
    Dcl   &MaxLen     *Dec    ( 5 0 )
    Dcl   &MaxLenp    *Dec    ( 5 0 )
    Dcl   &Force      *Char     4
    Dcl   &Forcep     *Char     4
    Dcl   &Seq        *Char     6
    Dcl   &Seqp       *Char     6
    Dcl   &KeyLen     *Dec    ( 5 0 )
    Dcl   &KeyLenp    *Dec    ( 5 0 )
    Dcl   &SndrId     *Char     4
    Dcl   &SndrIdp    *Char     4
    Dcl   &NbrOfEnt   *Dec    ( 9 0 )
    Dcl   &NbrOfEntp  *Dec    ( 9 0 )
    Dcl   &CurNbrAlc  *Dec    ( 9 0 )
    Dcl   &CurNbrAlcp *Dec    ( 9 0 )
    Dcl   &MaxNbrEntp *Dec    ( 9 0 )
    Dcl   &MaxNbrEnt  *Dec    ( 9 0 )
    Dcl   &InlNbrEntp *Dec    ( 9 0 )
    Dcl   &InlNbrEnt  *Dec    ( 9 0 )
    Dcl   &MaxEntSpcp *Dec    ( 9 0 )
    Dcl   &MaxEntSpc  *Char     9
    Dcl   &AutoRcl    *Char     4
    Dcl   &AutoRclp   *Char     4
    Dcl   &EnFrcLock  *Char     4
    Dcl   &EnFrcLockp *Char     4
    Dcl   &Text       *Char    50
    Dcl   &Textp      *Char    50
    Dcl   &RclTime    *Char    20
    Dcl   &RclTimep   *Char    20
    Dcl   &Textp      *Char    50
    Dcl   &DtsNULL    *Char     8     X'0000000000000000'
    Dcl   &RclDts     *Char     8

/* Format RDQD0200 fields */
    Dcl   &RmtDtaq    *Char    10
    Dcl   &RmtDtaqp   *Char    10
    Dcl   &RmtDtaqL   *Char    10
    Dcl   &RmtDtaqLp  *Char    10
    Dcl   &RmtLocName *Char     8
    Dcl   &RmtLocNamp *Char     8
    Dcl   &Dev        *Char    10
    Dcl   &Devp       *Char    10
    Dcl   &LclLocName *Char     8
    Dcl   &LclLocNamp *Char     8
    Dcl   &Mode       *Char     8
    Dcl   &Modep      *Char     8
    Dcl   &RmtNetId   *Char     8
    Dcl   &RmtNetIdp  *Char     8
    Dcl   &RmtDbName  *Char    18
    Dcl   &RmtDbNamep *Char    18

    Dcl   &RcvR       *Char   120
    Dcl   &RcvRLen    *Char     4

    MonMsg     CPF0000       *N    GoTo Error

    ChgVar     &Dtaq         %SST( &FullDtaq  1 10 )
    ChgVar     &Lib          %SST( &FullDtaq 11 10 )
    ChkObj     Obj(&Lib/&Dtaq) ObjType(*Dtaq)
    IF  (( &Lib *EQ '*LIBL' )    *OR +
         ( &Lib *EQ '*CURLIB' ))   Do
    RtvObjD    Obj(&Lib/&Dtaq) ObjType(*DTAQ) RtnLib(&LIB)
    EndDo

    ChgVar     %BIN( &RcvrLen 1 4 )  120

/* Get format RDQD0100 fields */
    Call       QMHQRDQD    ( &RcvR                    +
                             &RcvRLen                 +
                             RDQD0100                 +
                             &FullDtaq                +
                           )

    ChgVar     &MaxLenp      %BIN( &Rcvr 9 4 )

    If  ( %SST(&RcvR 17 1) *EQ 'K' ) DO
    ChgVar     &KeyLenp      %BIN( &RcvR 13 4 )
    ChgVar     &Seqp         '*KEYED'
    EndDo

    Else Do
    If  ( %SST(&RcvR 17 1) *EQ 'L' )   +
    ChgVar     &Seqp         '*LIFO'
    Else                               +
    ChgVar     &Seqp         '*FIFO'
    EndDo

    If  ( %SST(&RcvR 18 1) *EQ 'N' )   +
          ChgVar &SndrIdp '*NO'
    Else Do
    If  ( %SST(&RcvR 18 1) *EQ 'Y' )   +
          ChgVar &SndrIdp '*YES'
    EndDo

    If  ( %SST(&RcvR 19 1) *EQ 'N' )   +
          ChgVar &Forcep  '*NO'
    Else Do
    If  ( %SST(&RcvR 19 1) *EQ 'Y' )   +
          ChgVar &Forcep  '*YES'
    EndDo

    If  ( %SST(&RcvR 70 1) *EQ '0' )   +
          ChgVar &Typep   '*STD'
    Else                               +
          ChgVar &Typep   '*DDM'

    If  ( %SST(&RcvR 71 1) *EQ '0' )   +
          ChgVar &AutoRclp '*NO'
    Else Do
    If  ( %SST(&RcvR 71 1) *EQ '1' )   +
          ChgVar &AutoRclp '*YES'
    EndDo

    If  ( %SST(&RcvR 72 1) *EQ '0' )   +
          ChgVar &EnFrcLockp '*NO'
    Else Do
    If  ( %SST(&RcvR 72 1) *EQ '1' )   +
          ChgVar &EnFrcLockp '*YES'
    EndDo

    ChgVar     &NbrOfEntp  %BIN( &RcvR  73  4 )
    ChgVar     &CurNbrAlcp %BIN( &RcvR  77  4 )
    ChgVar     &MaxNbrEntp %BIN( &RcvR 101  4 )
    ChgVar     &InlNbrEntp %BIN( &RcvR 105  4 )
    ChgVar     &Textp      %SST( &RCVR  20 50 )
    ChgVar     &MaxEntSpcp %BIN( &RcvR 109  4 )

    If       ( &MaxEntSpcp *EQ -1 ) Do
    ChgVar     &MaxEntSpc  '*MAX16MB'
    MonMsg     MsgId(MCH3601)
    EndDo
    Else Do
    If       ( &MaxEntSpcp *EQ -2 ) Do
    ChgVar     &MaxEntSpc  '*MAX2GB'
    MonMsg     MsgId(MCH3601)
    EndDo
    EndDo
    If       ( &MaxEntSpcp *EQ  0 ) Do
    ChgVar     &MaxEntSpc  ' '
    MonMsg     MsgId(MCH3601)
    EndDo

    ChgVar     &RclDts       %SST(&RCVR 113 8)
    If (&RclDts *NE &DtsNull) Do
    Call       QWCCVTDT    ( '*DTS'             +
                              &RclDts            +
                              '*YYMD'            +
                              &RclTimep          +
                              x'00000000'        +
                           )
    EndDo

    ChgVar     &RtnLib       &Lib
    MonMsg     MsgId(MCH3601)
    ChgVar     &Type         &Typep
    MonMsg     MsgId(MCH3601)
    ChgVar     &MaxLen       &MaxLenp
    MonMsg     MsgId(MCH3601)
    ChgVar     &Force        &Forcep
    MonMsg     MsgId(MCH3601)
    ChgVar     &Seq          &Seqp
    MonMsg     MsgId(MCH3601)
    ChgVar     &KeyLen       &KeyLenp
    MonMsg     MsgId(MCH3601)
    ChgVar     &SndrId       &SndrIdp
    MonMsg     MsgId(MCH3601)
    ChgVar     &MaxNbrEnt    &MaxNbrEntp
    MonMsg     MsgId(MCH3601)
    ChgVar     &InlNbrEnt    &InlNbrEntp
    MonMsg     MsgId(MCH3601)
    ChgVar     &AutoRCL      &AutoRCLp
    MonMsg     MsgId(MCH3601)
    ChgVar     &Text         &Textp
    MonMsg     MsgId(MCH3601)
    ChgVar     &NbrOfEnt     &NbrOfEntp
    MonMsg     MsgId(MCH3601)
    ChgVar     &CurNbrAlc    &CurNbrAlcp
    MonMsg     MsgId(MCH3601)
    ChgVar     &EnFrcLock    &EnFrcLockp
    MonMsg     MsgId(MCH3601)
    ChgVar     &RclTime      &RclTimep
    MonMsg     MsgId(MCH3601)

    If (&Type *EQ '*DDM') Do
/* Get format RDQD0200 fields */
    ChgVar     &RcvR         *BLANKS
    ChgVar     %BIN( &RcvrLen 1 4 )  120
    Call       QMHQRDQD    ( &RcvR                    +
                             &RcvRLen                 +
                             RDQD0200                 +
                             &FullDtaq                +
                           )

    ChgVar     &RmtDtaqp   %SST( &RCVR  51 10 )
    ChgVar     &RmtDtaqLp  %SST( &RCVR  61 10 )
    ChgVar     &RmtLocNamp %SST( &RCVR  27  8 )
    ChgVar     &Devp       %SST( &RCVR   9 10 )
    ChgVar     &LclLocNamp %SST( &RCVR  35  8 )
    ChgVar     &Modep      %SST( &RCVR  19  8 )
    ChgVar     &RmtNetIdp  %SST( &RCVR  43  8 )
    ChgVar     &RmtDbNamep %SST( &RCVR  91 18 )

    ChgVar     &RmtDtaq    &RmtDtaqp
    MonMsg     MsgId(MCH3601)
    ChgVar     &RmtDtaqL   &RmtDtaqLp
    MonMsg     MsgId(MCH3601)
    ChgVar     &RmtLocName &RmtLocNamp
    MonMsg     MsgId(MCH3601)
    ChgVar     &Dev        &Devp
    MonMsg     MsgId(MCH3601)
    ChgVar     &LclLocName &LclLocNamp
    MonMsg     MsgId(MCH3601)
    ChgVar     &Mode       &Modep
    MonMsg     MsgId(MCH3601)
    ChgVar     &RmtNetId   &RmtNetIdp
    MonMsg     MsgId(MCH3601)
    ChgVar     &RmtDbName  &RmtDbNamep
    MonMsg     MsgId(MCH3601)

    EndDo

    Return

Error:
    Call       QMHMOVPM    ( '    '                   +
                             '*DIAG'                  +
                             x'00000001'              +
                             '*PGMBDY'                +
                             x'00000001'              +
                             x'0000000800000000'      +
                           )

    Call       QMHRSNEM    ( '    '                   +
                              x'0000000800000000'     +
                           )

EndPgm:
    EndPgm



File  : QPNLSRC

Member: RTVDTAQDH

Type  : PNLGRP

Usage : CRTPNLGRP PNLGRP(RTVDTAQDH)


.*-----------------------------------------------------------------------**
.*
.*  Compile options:
.*
.*    CrtPnlGrp PnlGrp( RTVDTAQDH )
.*              SrcFile( QPNLSRC )
.*              SrcMbr( *PNLGRP )
.*
.*-----------------------------------------------------------------------**
:PNLGRP.
:HELP NAME='RTVDTAQD'.Retrieve Data Queue Desc - Help
:P.
The Retrieve Data Queue Desc (RTVDTAQD) command returns information
about specified data queue description.
:P.
The data queue description retrieved with API QMHQRDQD format RDQD0100
and RDQD0200.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/DTAQ'.Data queue(DTAQ) - Help
:XH3.Data queue(DTAQ)
:P.
Specifies which data queue whose description should be returned.
:EHELP.
:HELP NAME='RTVDTAQD/RTNLIB'.CL var for RTNLIB       (10) (RTNLIB) - Help
:XH3.CL var for RTNLIB       (10) (RTNLIB)
:P.
Specifies a 10-character variable used to return the name of the library
that contains the object.
:P.
In CL programs, this should be a 10-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/TYPE'.CL var for TYPE          (4) (TYPE) - Help
:XH3.CL var for TYPE          (4) (TYPE)
:P.
Specifies the name of a variable used to retrieve the data queue type.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*STD':DD.Local data queue.
:DT.'*DDM':DD.Remote data queue.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/MAXLEN'.CL var for MAXLEN    (5 0) (MAXLEN) - Help
:XH3.CL var for MAXLEN      (5 0) (MAXLEN)
:P.
Specifies the name of a variable used to retrieve the maximum entry length.
:P.
In CL programs, this should be a 5-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/FORCE'.CL var for FORCE         (4) (FORCE) - Help
:XH3.CL var for FORCE         (4) (FORCE)
:P.
Specifies the name of a variable used to retrieve whether force to auxiliary
storage or not.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.Send and receive operations are immediately forced to storage.
:DT.'*NO' :DD.Send and receive operations are not immediately forced to storage.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/SEQ'     .CL var for SEQ           (6) (SEQ) - Help
:XH3.CL var for SEQ           (6) (SEQ)
:P.
Specifies the name of a variable used to retrieve the sequence in which
entries are received from data queue.
:P.
In CL programs, this should be a 6-character variable.
:P.
Possible return values:
:DL.
:DT.'*FIFO':DD.
:DT.'*LIFO':DD.
:DT.'*KEYED':DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/KEYLEN'.CL var for KEYLEN    (5 0) (KEYLEN) - Help
:XH3.CL var for KEYLEN      (5 0) (KEYLEN)
:P.
Specifies the name of a variable used to retrieve the number of
characters in the key.
:P.
In CL programs, this should be a 5-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/SENDERID'.CL var for SENDERID      (4) (SENDERID) - Help
:XH3.CL var for SENDERID      (4) (SENDERID)
:P.
Specifies the name of a variable used to retrieve whether include sender ID
or not.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.
:DT.'*NO' :DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/MAXENTSPC'.CL var for MAXENTSPC     (9) (MAXENTSPC)- Help
:XH3.CL var for MAXENTSPC     (9) (MAXENTSPC)
:P.
Specifies the name of a variable used to retrieve the maximum number of
entries specified in CRTDTAQ SIZE parameter.
:P.
In CL programs, this should be a 9-character variable.
:P.
Possible return values:
:DL.
:DT.'*MAX16MB':DD.
:DT.'*MAX2GB':DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/MAXNBRENT'.CL var for MAXNBRENT   (9 0) (MAXNBRENT)- Help
:XH3.CL var for MAXNBRENT   (9 0) (MAXNBRENT)
:P.
Specifies the name of a variable used to retrieve the maximum number of
entries specified in CRTDTAQ SIZE parameter.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/INLNBRENT'.CL var for INLNBRENT   (9 0) (INLNBRENT)- Help
:XH3.CL var for INLNBRENT   (9 0) (INLNBRENT)
:P.
Specifies the name of a variable used to retrieve the initial number of
entries specified in CRTDTAQ SIZE parameter.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/AUTORCL'.CL var for AUTORCL       (4) (AUTORCL) - Help
:XH3.CL var for AUTORCL       (4) (AUTORCL)
:P.
Specifies the name of a variable used to retrieve whether automatic reclaim
or not.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.
:DT.'*NO' :DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/TEXT'.CL var for TEXT         (50) (TEXT) - Help
:XH3.CL var for TEXT         (50) (TEXT)
:P.
Specifies the name of a variable used to retrieve the data queue
text description.
:P.
In CL programs, this should be a 50-character variable.
:EHELP.
:HELP NAME='RTVDTAQD/NBROFALC'.CL var for NBROFALC    (9 0) (NBROFALC) - Help
:XH3.CL var for NBROFALC    (9 0) (NBROFALC)
:P.
Specifies the name of a variable used to retrieve the number of entries
currently allocated.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/NBROFENT'.CL var for NBROFENT    (9 0) (NBROFENT) - Help
:XH3.CL var for NBROFENT    (9 0) (NBROFENT)
:P.
Specifies the name of a variable used to retrieve the number of entries
currently in the data queue.
:P.
In CL programs, this should be a 9-position decimal variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/ENFRCLOCK'.CL var for ENFRCLOCK     (4) (ENFRCLOCK) - Help
:XH3.CL var for ENFRCLOCK     (4) (ENFRCLOCK)
:P.
An optional return  variable that will contain a *YES or *NO for whether
an IBM supported data queue will enforce a lock. This value cannot be
specified on CRTDTAQ.
:P.
In CL programs, this should be a 4-character variable.
:P.
Possible return values:
:DL.
:DT.'*YES':DD.
:DT.'*NO' :DD.
:EDL.
:EHELP.
:HELP NAME='RTVDTAQD/LASTRCLTIM'.CL var for LASTRCLTIM   (20) (LASTRCLTIM) - Help
:XH3.CL var for LASTRCLTIM   (20) (LASTRCLTIM)
:P.
An optional return  variable that will contain last reclaim date and
time with format YYYYMMDDHHmmSSsss.
:P.
In CL programs, this should be a 20-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTDTAQ'.CL var for RMTDTAQ      (10) (RMTDTAQ) - Help
:XH3.CL var for RMTDTAQ      (10) (RMTDTAQ)
:P.
An optional return variable that will contain. For TYPE(*STD) data queue,
this field will be blank.
:P.
In CL programs, this should be a 10-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTDTAQL'.CL var for RMTDTAQL     (10) (RMTDTAQL) - Help
:XH3.CL var for RMTDTAQL     (10) (RMTDTAQL)
:P.
An optional return variable that will contain the name of the remote data
queue library. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 10-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTLOCNAME'.CL var for RMTLOCNAME    (8) (RMTLOCNAME) - Help
:XH3.CL var for RMTLOCNAME    (8) (RMTLOCNAME)
:P.
An optional return variable that will contain the name of the remote location
name. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/DEV'.CL var for DEV           (8) (DEV) - Help
:XH3.CL var for DEV           (8) (DEV)
:P.
An optional return variable that will contain the name of the APPC device
name. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/LCLLOCNAME'.CL var for LCLLOCNAME    (8) (LCLLOCNAME) - Help
:XH3.CL var for LCLLOCNAME    (8) (LCLLOCNAME)
:P.
An optional return variable that will contain the name of the local location
name. For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/MODE'.CL var for MODE          (8) (MODE) - Help
:XH3.CL var for MODE          (8) (MODE)
:P.
An optional return variable that will contain the mode.
For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTNETID'.CL var for RMTNETID      (8) (RMTNETID) - Help
:XH3.CL var for RMTNETID      (8) (RMTNETID)
:P.
An optional return variable that will contain remote network identifier.
For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 8-character variable.
:P.
:EHELP.
:HELP NAME='RTVDTAQD/RMTDBNAME'.CL var for RMTDBNAME    (18) (RMTDBNAME) - Help
:XH3.CL var for RMTDBNAME    (18) (RMTDBNAME)
:P.
An optional return variable that will contain remote database name.
For TYPE(*STD) data queue, this field will be blank.
:P.
In CL programs, this should be a 18-character variable.
:P.
:EHELP.
:EPNLGRP.




File  : QCMDSRC

Member: RTVDTAQD

Type  : CMD

Usage : CRTCMD CMD(RTVDTAQD) PGM(RTVDTAQD)


/*  ===============================================================  */
/*  = Command....... RTVDTAQD                                     =  */
/*  = CPP........... RTVDTAQD CLP                                 =  */
/*  =                                                             =  */
/*  = Description...                                              =  */
/*  =  Retrieve data queue description command retrieves the      =  */
/*  =  attributes of a data queue (not the entries)               =  */
/*  =  the API QMHQRDQD is used.                                  =  */
/*  =                                                             =  */
/*  = CrtCmd      Cmd( RtvDtaqD  )                                =  */
/*  =             Pgm( RtvDtaqD   )                               =  */
/*  =             SrcFile( YourSourceFile )                       =  */
/*  =             Allow ( *Ipgm *Bpgm )                           =  */
/*  =             HlpPnlGrp( RTVDTAQDH )                          =  */
/*  =             HlpId( *CMD )                                   =  */
/*  ===============================================================  */
/*  = Date  : 2013/09/11                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */
/*  = Date modify: 2013/09/16 add parameter LASTRCLTIM            =  */
/*  ===============================================================  */

             Cmd        Prompt( 'Rtv Data Queue Description' )

             Parm       Kwd( Dtaq )                                 +
                        Type( Qual1 )                               +
                        Min( 1 )                                    +
                        Prompt('Data queue' )

             Parm       Kwd( RtnLib )                               +
                        Type( *Char )                               +
                        Len( 10 )                                   +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for RTNLIB       (10) .' )

/*  ===============================================================  */
/*  = Type  - Type of data queue                                  =  */
/*  =         *STD, *DDM                                          =  */
/*  ===============================================================  */
             Parm       Kwd( Type )                                 +
                        Type( *Char )                               +
                        Len( 4 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for TYPE          (4) .' )

/*  ===============================================================  */
/*  = MaxLen- Maximum entry length                                =  */
/*  ===============================================================  */
             Parm       Kwd( MaxLen )                               +
                        Type( *Dec )                                +
                        Len( 5 0 )                                  +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for MAXLEN      (5 0) .' )

/*  ===============================================================  */
/*  = Force - Force to auxiliary storage                          =  */
/*  =         *YES, *NO                                           =  */
/*  ===============================================================  */
             Parm       Kwd( Force )                                +
                        Type( *Char )                               +
                        Len( 4 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for FORCE         (4) .' )

/*  ===============================================================  */
/*  = Seq - *FIFO, *LIFO, *KEYED                                  =  */
/*  ===============================================================  */
             Parm       Kwd( Seq )                                  +
                        Type( *Char )                               +
                        Len( 6 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for SEQ           (6) .' )
/*  ===============================================================  */
/*  = KeyLen- Key length                                          =  */
/*  ===============================================================  */
             Parm       Kwd( KeyLen )                               +
                        Type( *Dec )                                +
                        Len( 5 0 )                                  +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for KEYLEN      (5 0) .' )
/*  ===============================================================  */
/*  = SenderId - Include sender ID                                =  */
/*  =            *YES, *NO                                        =  */
/*  ===============================================================  */
             Parm       Kwd( SenderId )                             +
                        Type( *Char )                               +
                        Len( 4 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for SENDERID      (4) .' )
/*  ===============================================================  */
/*  = MaxEntSpc- Maximum number of entries specified              =  */
/*  =            *MAX16MB, *MAX2GB                                =  */
/*  ===============================================================  */
             Parm       Kwd( MaxEntSpc )                            +
                        Type( *Char )                               +
                        Len( 9 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for MAXENTSPC     (9) .' )
/*  ===============================================================  */
/*  = MaxNbrEnt- Maximum number of entries alloweded              =  */
/*  ===============================================================  */
             Parm       Kwd( MaxNbrEnt )                            +
                        Type( *Dec )                                +
                        Len( 9 0 )                                  +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for MAXNBRENT   (9 0) .' )
/*  ===============================================================  */
/*  = InlNbrEnt- Initial number of entries                        =  */
/*  ===============================================================  */
             Parm       Kwd( InlNbrEnt )                            +
                        Type( *Dec )                                +
                        Len( 9 0 )                                  +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for INLNBRENT   (9 0) .' )
/*  ===============================================================  */
/*  = AutoRcl  - Automatic Reclaim                                =  */
/*  =            *YES, *NO                                        =  */
/*  ===============================================================  */
             Parm       Kwd( AutoRcl )                              +
                        Type( *Char )                               +
                        Len( 4 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for AUTORCL       (4) .' )

             Parm       Kwd( Text )                                 +
                        Type( *Char )                               +
                        Len( 50 )                                   +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for TEXT         (50) .' )
/*  ===============================================================  */
/*  = NbrOfAlc - Number of entries currently allocated            =  */
/*  ===============================================================  */
             Parm       Kwd( NbrOfAlc )                             +
                        Type( *Dec )                                +
                        Len( 9 0 )                                  +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for NBROFALC    (9 0) .' )
/*  ===============================================================  */
/*  = NbrOfMsg - Number of entries currently                      =  */
/*  ===============================================================  */
             Parm       Kwd( NbrOfEnt )                             +
                        Type( *Dec )                                +
                        Len( 9 0 )                                  +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for NBROFENT    (9 0) .' )
/*  ===============================================================  */
/*  = EnFrcLock- Enforce lock                                     =  */
/*  =            *YES, *NO                                        =  */
/*  ===============================================================  */
             Parm       Kwd( EnFrcLock )                            +
                        Type( *Char )                               +
                        Len( 4 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for ENFRCLOCK     (4) .' )

/*  ===============================================================  */
/*  = LastRclTim - Last reclaim date and time                     =  */
/*  ===============================================================  */
             Parm       Kwd( LastRclTim )                           +
                        Type( *Char )                               +
                        Len( 20 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for LASTRCLTIM   (20) .' )

             Parm       Kwd( RmtDtaq )                              +
                        Type( *Char )                               +
                        Len( 10 )                                   +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for RMTDTAQ      (10) .' )

             Parm       Kwd( RmtDtaqL )                             +
                        Type( *Char )                               +
                        Len( 10 )                                   +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for RMTDTAQL     (10) .' )

             Parm       Kwd( RmtLocName )                           +
                        Type( *Char )                               +
                        Len( 8 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for RMTLOCNAME    (8) .' )

             Parm       Kwd( Dev )                                  +
                        Type( *Char )                               +
                        Len( 10 )                                   +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for DEV          (10) .' )

             Parm       Kwd( LclLocName )                           +
                        Type( *Char )                               +
                        Len( 8 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for LCLLOCNAME    (8) .' )

             Parm       Kwd( Mode )                                 +
                        Type( *Char )                               +
                        Len( 8 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for MODE          (8) .' )

             Parm       Kwd( RmtNetId )                             +
                        Type( *Char )                               +
                        Len( 8 )                                    +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for RMTNETID      (8) .' )

             Parm       Kwd( RmtDbName )                            +
                        Type( *Char )                               +
                        Len( 18 )                                   +
                        Rtnval( *Yes )                              +
                        Prompt( 'CL var for RMTDBNAME    (18) .' )

 Qual1:      Qual       Type( *Name )                               +
                        Expr( *Yes )
             Qual       Type( *Name )                               +
                        Dft( *Libl )                                +
                        Spcval(( *Libl ) ( *CurLib ))               +
                        Expr( *Yes )                                +
                        Prompt( 'Library' )







參考資訊:

Retrieve Data Queue Description (QMHQRDQD) API




星期一, 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.