"RPG400-L" <rpg400-l-bounces@xxxxxxxxxxxx> wrote on 10/04/2016 02:05:28
PM:
One possible solution, if you are also working with the calling program,
is to pass a single data structure so that there is, in fact, only one
parm (or none).
Not an option because the large number of parameters was dictated
by the command interface that invokes this program. At this point you
might say that a command interface normally passes all parameters so I
needn't bother checking them. But, this program can also be called from
another RPG program via a prototype that provides *nopass and *omit
support. Therein lies my conundrum. I'd like to simply have this:
// build minimum fields (by key) to satisfy request
RTSFA_KCnt = 2; // at least two keys required
RTSFA_Keys(1) = RTSFA_Codes(1); // key code for internal job
ident
RTSFA_Keys(2) = RTSFA_Codes(2); // key code for internal splf
ident
for RTSFA_CCnt = 3 by 1 to %elem(RTSFA_Codes);
if %parms >= (RTSFA_CCnt + 3) // if parm passed
and %addr(????????) <> *null; // and not omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
endif;
endfor;
That is instead of what I actually have -- which is this:
// build minimum fields (by key) to satisfy request
RTSFA_KCnt = 2; // at least two keys required
RTSFA_Keys(1) = RTSFA_Codes(1); // key code for internal job
ident
RTSFA_Keys(2) = RTSFA_Codes(2); // key code for internal splf
ident
for RTSFA_CCnt = 3 by 1 to %elem(RTSFA_Codes);
select;
when (RTSFA_CCnt + 3) = %parmnum(pFileName)
and %parms >= %parmnum(pFileName) // if parm passed
and %addr(pFileName) <> *null; // and not omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pFileNbr)
and %parms >= %parmnum(pFileNbr) // if parm not passed
and %addr(pFileNbr) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pJobName)
and %parms >= %parmnum(pJobName) // if parm not passed
and %addr(pJobName) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pJobUser)
and %parms >= %parmnum(pJobUser) // if parm not passed
and %addr(pJobUser) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pJobNbr)
and %parms >= %parmnum(pJobNbr) // if parm not passed
and %addr(pJobNbr) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pOutQueNm)
and %parms >= %parmnum(pOutQueNm) // if parm not passed
and %addr(pOutQueNm) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pOutQueLb)
and %parms >= %parmnum(pOutQueLb) // if parm not passed
and %addr(pOutQueLb) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pDevice)
and %parms >= %parmnum(pDevice) // if parm not passed
and %addr(pDevice) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pDevType)
and %parms >= %parmnum(pDevType) // if parm not passed
and %addr(pDevType) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pFormType)
and %parms >= %parmnum(pFormType) // if parm not passed
and %addr(pFormType) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pUserData)
and %parms >= %parmnum(pUserData) // if parm not passed
and %addr(pUserData) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pStatus)
and %parms >= %parmnum(pStatus) // if parm not passed
and %addr(pStatus) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pPriority)
and %parms >= %parmnum(pPriority) // if parm not passed
and %addr(pPriority) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pCreDate)
and %parms >= %parmnum(pCreDate) // if parm not passed
and %addr(pCreDate) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pCreTime)
and %parms >= %parmnum(pCreTime) // if parm not passed
and %addr(pCreTime) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pTotPgs)
and %parms >= %parmnum(pTotPgs) // if parm not passed
and %addr(pTotPgs) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pCurPge)
and %parms >= %parmnum(pCurPge) // if parm not passed
and %addr(pCurPge) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pRemCpy)
and %parms >= %parmnum(pRemCpy) // if parm not passed
and %addr(pRemCpy) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pAspNbr)
and %parms >= %parmnum(pAspNbr) // if parm not passed
and %addr(pAspNbr) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pAspDvN)
and %parms >= %parmnum(pAspDvN) // if parm not passed
and %addr(pAspDvN) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
when (RTSFA_CCnt + 3) = %parmnum(pFileSz)
and %parms >= %parmnum(pFileSz) // if parm not passed
and %addr(pFileSz) <> *null; // or was omitted
RTSFA_KCnt += 1; // increment key count
RTSFA_Keys(RTSFA_KCnt) = RTSFA_Codes(RTSFA_CCnt);
endsl;
endfor;
Sincerely,
Dave Clark
As an Amazon Associate we earn from qualifying purchases.