|
You need to also check the %PARMS value inside your subprocs. *NOPASS can be used hence %PARMS could be 1, 2,3,4,5,6, or 7. While you may pass *OMIT on these parms, *NOPASS means you do not have to. Therefore, If %addr(myparm)<>*NULL is not strickly correct. I always do this insteadL If %parms >= 2 If %addr(myParm2) <> *NULL Eval localVal = Parm2Val Endif Endif It's the only way to be sure. Also, note that the %addr thing with a CONST parameter does not work on V4R5 and may not work on V5R1. I believe it was "fixed" on V5R2. If you're on an earlier release, you have to use that CEE API. So my code really looks like this: D bP1 S 10I 0 D bP2 S 10I 0 D bP3 S 10I 0 D bP4 S 10I 0 D bP5 S 10I 0 C if %Parms >= 1 C CallP IsParmOmit(bP1: 1 : *OMIT) C if %Parms >= 2 C CallP IsParmOmit(bP2: 2 : *OMIT) C if %Parms >= 3 C CallP IsParmOmit(bP3: 3 : *OMIT) C if %Parms >= 4 C CallP IsParmOmit(bP4: 4 : *OMIT) C if %Parms >= 5 C CallP IsParmOmit(bP5: 5 : *OMIT) C endif C endif C endif C endif C endif Kind of ugly, but it is safe and works as far back as I can compile. FYI, IsParmOmit() looks like this: D IsParmOmit PR ExtProc('CEETSTA') D nParmPassed 10I 0 D nParmNum 10I 0 Const D szParmError 12A OPTIONS(*OMIT) -Bob Cozzi www.RPGxTools.com If everything is under control, you are going too slow. - Mario Andretti -----Original Message----- From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of Larry Ducie Sent: Tuesday, July 26, 2005 2:58 PM To: rpg400-l@xxxxxxxxxxxx Subject: Re: creating a new procedure that call an existing procedure withone additional parm Hi Lim, Hmmm... OK, lets take your procedure prototypes as an example: d SndMsg PR opdesc d MsgInId 10 const d MsgInData 32766 const options(*varsize:*nopass:*omit) d MsgInType 10 const options(*nopass:*omit ) d MsgFile 10 const options(*nopass:*omit) d MsgLib 10 const options(*nopass:*omit) d MsgInQueue 10 const options(*nopass:*omit) d SndMsgQ PR opdesc d MsgInQueue 10 const d MsgInId 10 const d MsgInData 32766 const options(*varsize:*nopass:*omit) d MsgInType 10 const options(*nopass:*omit ) d MsgFile 10 const options(*nopass:*omit) d MsgLib 10 const options(*nopass:*omit) Within the body of SndMsg you will already have code such as: d this DS qualified d msgInId like(MsgInId) d msgInData like(MsgInData) d msgInType like(MsgInType) d msgFile like(MsgFile) d msgLib like(MsgLib) d msgInQueue like(MsgInQueue) /free this.msgInId = MsgInId; if %addr(MsgInData) <> *null; this.msgInData = MsgInData; else; this.msgInData = *blanks; endif; if %addr(MsgInType) <> *null; this.msgInType = MsgInType; else; this.msgInType = *blanks; endif; if %addr(MsgFile) <> *null; this.msgFile = MsgFile; else; this.msgFile = *blanks; endif; if %addr(MsgLib) <> *null; this.msgLib = MsgLib; else; this.msgLib = *blanks; endif; if %addr(MsgInQueue) <> *null; this.msgInQueue = MsgInQueue; else; this.msgInQueue = *blanks; endif; // your internal procedure code here... return your.opdesc; /end-free If you move the code to SndMsgQ you can simply remove the check for %addr(MsgInQueue) as it is now a required parameter. Everything within SndMsgQ should work. Now, in SndMsg your whole procedure code will be relagated to: p SndMsg b d SndMsg PR opdesc d MsgInId 10 const d MsgInData 32766 const options(*varsize:*nopass:*omit) d MsgInType 10 const options(*nopass:*omit ) d MsgFile 10 const options(*nopass:*omit) d MsgLib 10 const options(*nopass:*omit) d MsgInQueue 10 const options(*nopass:*omit) d this DS qualified d msgInId like(MsgInId) d msgInData like(MsgInData) d msgInType like(MsgInType) d msgFile like(MsgFile) d msgLib like(MsgLib) d msgInQueue like(MsgInQueue) /free this.msgInId = MsgInId; if %addr(MsgInData) <> *null; this.msgInData = MsgInData; endif; if %addr(MsgInType) <> *null; this.msgInType = MsgInType; else; this.msgInType = *blanks; endif; if %addr(MsgFile) <> *null; this.msgFile = MsgFile; else; this.msgFile = *blanks; endif; if %addr(MsgLib) <> *null; this.msgLib = MsgLib; else; this.msgLib = *blanks; endif; if %addr(MsgInQueue) <> *null; this.msgInQueue = MsgInQueue; else; this.msgInQueue = *blanks; endif; return SndMsgQ(this.msgInQueue :this.msgInId :this.msgInData :this.msgInType :this.msgFile :this.msgLib); /end-free p SndMsg e So what's changed? 1) You've moved your code from SndMsg to SndMsgQ and removed the check for MsgInQueue being passed. 2) You've replaced the internal procedure code in SndMsg with a call to SndMsgQ. That's it! You've only got one set of code - now in SndMsgQ. You've still got your original param checks in SndMsg. You wont get a signature violation on SndMsg as the prototype hasn't changed. You get code in SndMsgQ which you KNOW works. Cheers Larry Ducie
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.