Sunteți pe pagina 1din 14

Command Processing

Programs
Part 24

Presentation Copyright 2008, Bryan Meyers, www.bmeyers.net


Command Components

Command Definition Object (CDO) is actual


*CMD object
Command Processing Program (CPP) is *PGM
object that actually performs work of
command
Receives parameters from CDO, processes them
May be written in any language
May be changed independently from CDO
May be called independently from command
Command Processing Program
PGM PARM(&mbr &qualfile &iferror)
DCLF QGPL/QCLSRC /* Source file model */
DCL &mbr *CHAR 10
DCL &qualfile *CHAR 20
DCL &file *CHAR 10 STG(*DEFINED) DEFVAR(&qualfile)
DCL &lib *CHAR 10 STG(*DEFINED) DEFVAR(&qualfile 11)
DCL &iferror *CHAR 7

MONMSG CPF0000 EXEC(GOTO ERRORS) /* Global monitor */

CHKOBJ OBJ(&lib/&file) OBJTYPE(*FILE) MBR(&mbr)


OVRDBF QCLSRC TOFILE(&lib/&file) MBR(&mbr)

DOUNTIL &eof /* Read source records */
RCVF
MONMSG CPF0864 EXEC(DO)
CHGVAR &eof '1'
LEAVE
ENDDO

/* Process record */
CALL QCMDEXC PARM(&cmdstr 2000) /* Execute command */
MONMSG MSGID(CPF0000) EXEC(DO)
IF (&iferror *EQ '*CANCEL') GOTO ERRORS
ENDDO
ENDDO

RETURN /* Normal end of program */
ERRORS:

ENDPGM
Parameters in the CPP

CPP must accept parameters passed by


command
In same order as defined by command
PARM KWD(MBR) TYPE(*NAME) LEN(10) +
MIN(1) PROMPT('Member')
PARM KWD(SRCFILE) TYPE(Q1) +
PROMPT('Source file name')
PARM KWD(IFERROR) TYPE(*CHAR) LEN(7) +
RSTD(*YES) DFT(*CANCEL) VALUES(*CANCEL *IGNORE) +
PROMPT('Command error action')

PGM PARM(&mbr &qualfile &iferror)


CMD source (CDO)
DCL &mbr *CHAR 10
DCL &qualfile *CHAR 20
CLLE source (CPP) DCL &iferror *CHAR 7
Parameters in the CPP
CMD PARM Definition CL Declaration
TYPE(*CHAR) LEN(x) TYPE(*CHAR) LEN(x)
TYPE(*CMDSTR) LEN(x) TYPE(*CHAR) LEN(x)
TYPE(*DATE) TYPE(*CHAR) LEN(7)
TYPE(*DEC) LEN(x y) TYPE(*DEC) LEN(x y)
TYPE(*GENERIC) LEN(x) TYPE(*CHAR) LEN(x)
TYPE(*HEX) LEN(x) TYPE(*CHAR) LEN(x)
TYPE(*INT2), TYPE(*INT) LEN(2),
Or: TYPE(*CHAR) LEN(2)
TYPE(*UINT2) TYPE(*UINT) LEN(2)
TYPE(*INT4), TYPE(*INT) LEN(4),
Or: TYPE(*CHAR) LEN(4)
TYPE(*UINT4) TYPE(*UINT) LEN(4)
TYPE(*LGL) TYPE(*LGL) Or: TYPE(*CHAR) LEN(1)
TYPE(*NAME) LEN(x) TYPE(*CHAR) LEN(x)
TYPE(*TIME) TYPE(*CHAR) LEN(6)
Qualified Parameters

Length of qualified parameter is sum of


lengths of qualifiers
Use defined variables to parse qualified
parameter
PARM KWD(SRCFILE) TYPE(Q1) PROMPT('Source file name')

Q1: QUAL TYPE(*NAME) LEN(10) DFT(QCLSRC)


QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) SPCVAL((*LIBL)) PROMPT('Library')

CMD source (CDO) CLLE source (CPP)

DCL &qualfile *CHAR 20


DCL &file *CHAR 10 STG(*DEFINED) DEFVAR(&qualfile)
DCL &lib *CHAR 10 STG(*DEFINED) DEFVAR(&qualfile 11)
Executing the Command

After CPP is compiled and bound, command


can be executed
EXCCMD MBR(JOBSTREAM) +
FILE(*LIBL/QCLSRC) +
IFERROR(*CANCEL)
List Parameters

Command may accept a list of values in a


parameter
MAX keyword in CDO source defines
parameter as simple list
Indicates maximum number of values in list
PARM KWD(TOUSR) TYPE(*NAME) LEN(10) +
MIN(1) MAX(5) +
PROMPT('Send to users')
List Parameters

Command passes single parameter to CPP


Length depends on number of list values
Prefixes value(s) with integer indicating number of
list values
TOUSR(BMEYERS JBUCK)

0 0
0 2 BMEYERS JBUCK

TOUSR(BMEYERS JBUCK JHAZEN)

0 0
0 3 BMEYERS JBUCK JHAZEN
List Parameters

CPP parameter declaration must allow for


MAX entries in list
But should not process parameter beyond end of
list
TOUSR(BMEYERS JBUCK JHAZEN)

0 0
0 3 BMEYERS JBUCK JHAZEN ????????????????????

DCL &usrlist *CHAR 52


List Parameters

Use defined variables to break down list


entries
TOUSR(BMEYERS JBUCK JHAZEN)

&nbrelem

0 0
0 3 BMEYERS JBUCK JHAZEN ????????????????????

&list &usr

DCL &nbrelem *INT 2 STG(*DEFINED) DEFVAR(&usrlist)


DCL &list *CHAR 50 STG(*DEFINED) DEFVAR(&usrlist 3)
DCL &ptr *PTR ADDRESS(&list)
DCL &usr *CHAR 10 STG(*BASED) BASPTR(&ptr)
List Parameters
TOUSR(BMEYERS JBUCK JHAZEN)
0 0
0 3 BMEYERS JBUCK JHAZEN ????????????????????

PGM PARM(&usrlist)
DCL &usrlist *CHAR 52
DCL &nbrelem *INT 2 STG(*DEFINED) DEFVAR(&usrlist)
DCL &list *CHAR 50 STG(*DEFINED) DEFVAR(&usrlist 3)
DCL &ptr *PTR ADDRESS(&list)
DCL &usr *CHAR 10 STG(*BASED) BASPTR(&ptr)
DCL &counter *INT 2

DOFOR VAR(&counter) FROM(1) TO(&nbrelem)


/* Process each &usr variable from list here */
IF (&counter *LT &nbrelem) DO
CHGVAR %OFFSET(&ptr) (%OFFSET(&ptr) + 10) /* Move &ptr to next &usr */
ENDDO
ENDDO

Using QCMDEXC as a CPP

QCMDEXC API may be used as CPP


No need to write CPP
May use to create alias command
Hidden parameters to store command, length
CONST keyword
Limited to 32 characters
CMD
PARM KWD(CMDSTR) TYPE(*CHAR) LEN(7) +
CONSTANT('WRKSPLF')
PARM KWD(CMDLEN) TYPE(*DEC) LEN(15 5) + CRTCMD CMD(MYCMD) +
CONSTANT(7) PGM(QCMDEXC) +
SRCFILE(MYLIB/QCMDSRC) +
SRCMBR(MYCMD)
CMD source (CDO)
Using CRTPRXCMD

Create Proxy Command (CRTPRXCMD)


command may also be used to create alias
command
CMD source and CPP not needed
CRTPRXCMD CMD(MYLIB/MYCMD) TGTCMD(QSYS/WRKSPLF)

S-ar putea să vă placă și