On 18 Apr 2013 14:58, Stone, Joel wrote:
Thanks Vern. But I made the length 502 and still see the same error -
CPD0162 "Parameters do not match those in program SET_ENVR in *LIBL".
On v5r4
  That is because the problem being diagnosed by CPD0162 has nothing to 
do with the attributes specified for the declaration of that parameter's 
variable.  The error is very specifically about the CMD and its CPP 
having a mismatch in the number of PARM; i.e. the number of arguments 
passed by the compiled CMD object SET_ENVR [presumed to be in *LIBL] 
does not match the number of parameters declared for the compiled 
program object SET_ENVR in *LIBL.
  Believe it or not, there is not enough information available from the 
CLP for the Command Analyzer invocation to even inquire of the 
parameters.  After the number of parameters is validated, there is 
nothing about the actual parameters declared in the CLP that will be 
validated before the CA attempts to pass control to that CLP as CPP.
Is it possible to NOT use some parms when using a command in CL?
Like RTVMBRD: I only want to code the parms that I want to retrieve
(instead of listing all parms).
  Works just fine.  Fix the mismatch between the CPP and the CMD, and 
that specific error CPD0162 will be resolved.  Then your command should 
be able to invoke the CPP with none, all, or any combination of the 
inout\RNTVAL(*YES) parameters having a CL variable unspecified or specified.
  Further comments inline below.
Vernon Hamberg on Thursday, April 18, 2013 4:53 PM wrote:
Your first parameter has to be defined with length 502 - because
the varying puts the length in the first 2 bytes.
If you are current enough, you can set up another 502-long
parameter - I forget, but either *BASED or *DEFINED variables can't
be declared over parameters.
  It need not be /another/ parameter, just a redefinition of the 
storage for the parameter &text [after correction to include all 502 
bytes].  The /current enough/ refers to the availability of the STG() 
parameter on the DCL, since v5r4.
Then do an *INT2 *DEFINED over the first 2 positions and a 500
*CHAR starting at position 3.
  Correct.  The first parameter can have the first two bytes redefined 
using STG(*DEFINED) to represent the *INT2 as specified by the PARM 
VARY(*YES *INT2) in the command-source, and the remaining 500 bytes 
redefined as STG(*DEFINED) for *CHAR LEN(500).
  FWiW I showed such a declaration of the 502-byte *CHAR in the 
following link, with two means to access that passed length within the 
CPP using the variable &VCLEN.  One means is available only since v5r4, 
using the STG(*DEFINED).  And that is left commented, thus showing the 
form that is available since many releases prior, although a later 
comment in the given source explains how the CHGVAR to set &VCLEN is 
redundant if the STG(*DEFINED) no longer remains within comments.
http://archive.midrange.com/midrange-l/201304/msg00831.html
"...
pgm parm(&vc500inp) /* CPP for PARM500 command */
dcl &vc500inp *char 502 /* this is an *input-only* parameter */
dcl &vclen *int 2 /* stg(*defined) defvar(&vc500inp 1) */
dcl &chlen *char 3
dcl &dclen *dec 3
dcl &text *char 500 /* local copy of the "500-char" field */
chgvar &vclen %bin(&vc500inp 1 2) /* already set if defined stg */
 ..."
  Although that message describes /input-only/ as the basis for the 
example, I clarify in my next reply of that message thread, that an 
output capable field can be used, *if* the necessary care is taken to 
avoid corrupting the storage of the program that is the invoker of the 
command.
http://archive.midrange.com/midrange-l/201304/msg00901.html
  Further comments inline below.
On 4/18/2013 4:47 PM, Stone, Joel wrote:
I am attempting to build a CL command (w/o ILE) with OPTIONAL
parms.
Note: I now have 4 parms on both the command and the CPP, but
still get CPD0162 error "Parameters do not match those in program
SET_ENVR in *LIBL."
  As noted in a separate reply, that message begs for the validation of 
the "Number of Parameters" in the DSPPGM *LIBL/SET_ENVR, as compared to 
the number of parameters that are shown in the prompted SET_ENVR that is 
coded in the failing program; i.e. verify that the actual compiled 
objects that are presumed and verified to be getting invoked, are in 
fact the desired objects versus being previous iterations of either of 
the CMD or CPP for which the number of declared parameters might 
mismatch... just as the error suggests is the situation.
http://archive.midrange.com/midrange-l/201304/msg00977.html
The IBM manual seems to show a simple MIN(0) MAX(1) on the PARM
statement is all that is required.
PARM       KWD(DBLIB) TYPE(*CHAR) LEN(10) RTNVAL(*YES) +
                MIN(0) MAX(1) PROMPT('database lib: _CMISDB')
  It is pretty much that simple.  But realize that optional 
/positional/ parameters must be specified positionally.  Or, the 
parameter must be specified with its Keyword.
However if I use the command and skip some parms, I receive the
error shown below.
   set_envr &EMADDR1
  According to the source snippet below, that is the first\positional 
parameter; i.e. Kwd=TEXT.  Thus that request is the equivalent of:
     *LIBL/SET_ENVR TEXT(&EMADDR1)
  No positional parameters are skipped with that invocation, but all 
parameters following the first are omitted.
  The command-source below however, does not explicitly specify MIN(0) 
MAX(1) like the source snippet from above, so the former is subject to 
changed defaults.  That is unlikely ever to be an issue, but worth 
noting, because a reviewer of the source can not see the explicit 
definition, and so they must infer the intention of the unspecified 
MIN(0) as defaulting to effect an /optional/ parameter.  Best to 
explicitly specify MIN(0) to make that intention conspicuous.
  Further comments inline below.
Is there a trick to using OPTIONAL parms in a CMD and CL pgm? Or
must they always match up?
CMD        PROMPT('Set Envr Names')
PARM       KWD(TEXT) TYPE(*CHAR) VARY(*YES *INT2) +
              RTNVAL(*YES) PROMPT('TEXT')
PARM       KWD(DBLIB) TYPE(*CHAR) LEN(10) +
              RTNVAL(*YES)PROMPT('database lib: _CMISDB')
PARM       KWD(DATALIB) TYPE(*CHAR) LEN(10) +
              RTNVAL(*YES) PROMPT('work lib: _DATALIB')
PARM       KWD(FORCED2T) TYPE(*CHAR) LEN(1) +
              RTNVAL(*YES) PROMPT('force DEMO to TEST? +
              Y or blank')
SetEnvr CLP pgm:
PGM        parm(&text &dblib &datalib &forceD2T)
dcl        &text          *char  len(500)
dcl        &dblib         *char  len(10)
dcl        &datalib       *char  len(10)
dcl        &forceD2T      *char  len(1)
<<SNIP>>
  The PARM command-source statements must correspond one-to-one with 
the CL variable elements on the PARM specification on the PGM 
CL-program-source statement.  While the order of presentation for 
prompting can be modified with the second element of the PROMPT() 
parameter for a PARM, the relative position of the declarations in both 
the CMD-source and the CL-PGM-source remain correlated one-to-one. 
Thus, in source, they must "always match up".
  Once the issue diagnosing the mismatch between parameters for the 
*CMD and the *PGM object has been resolved, the above command source is 
very likely to create a *CMD that functions as expected for /optional/ 
parameter specifications; i.e. such that any of the following should be 
functional invocations, given no other errors prevent the requests:
   set_envr dblib(&c10)
   set_envr datalib(&c10)
   set_envr forced2t(&c1)
   set_envr () &c10 /* datalib positionally 2nd */
   set_envr /* all parms passed as *NULL; no work by CPP to be done */
As an Amazon Associate we earn from qualifying purchases.