I know you ended up with the loop that you wanted. But, for those cases where that doesn't work, don't just force a loop in there. I have seen this select structure before, and it always seems contrived to me. Specifically, in this case the loop around the select buys you nothing, but does confuse things. You already have all the conditions you want to test in a line in your code, since you want to test them all in order anyway, why not just replace the single select wrapped in a loop with a series of if statements? You end up with less code and less confusion. A little Pseudocode will help illustrate:
Instead of this (which is contrived just to get a loop in there)
loop until done
select !?
first time through
Do Process A
second time through
Do Process B
third time through
Do Process C
...
last time through
Do Process Last
Exit Loop
End of loop
Do this (straight forward)
Do Process A
Do Process B
Do Process C
...
Do Process Last
See? The loop adds nothing but confusion and extra code in this case. Only use a loop, and prefer it in these cases, where you can use it to remove duplicate code. If the duplicate code has to be there despite the loop, get rid of the loop.
Mark Murphy
STAR BASE Consulting, Inc.
mmurphy@xxxxxxxxxxxxxxx
-----dlclark@xxxxxxxxxxxxxxxx wrote: -----
To: "RPG programming on the IBM i \(AS/400 and iSeries\)" <rpg400-l@xxxxxxxxxxxx>
From: dlclark@xxxxxxxxxxxxxxxx
Date: 10/04/2016 02:48PM
Subject: Re: Examine Parms in a Loop
"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.