× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



You're right, it is ugly.
By the way, does this work?
 If  parm <> *OMIT  
I thought it was:
 If %addr(parm) <> *NULL

I ran into this while righting RPG xTools a few years ago and solved it by
including the following in the start of my subprocedures:

     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

This at least isolates the crappy looking stuff to the top of the subproc.

Then in my code, if I need to know if parm 3 was passed in, I check for bP3=1
Whether it is *NOPASS'd or *OMIT'd test above provides for that.
By the way, the "IsParmOmit() proc is the CEETSTA API, as follows;
     D IsParmOmit      PR                  ExtProc('CEETSTA')
     D  nParmPassed                  10I 0
     D  nParmNum                     10I 0 Const
     D  szParmError                  12A   OPTIONS(*OMIT)

Been working consistently great since V4R4 for me. 

-Bob Cozzi
www.RPGxTools.com
RPG xTools - Enjoy programming again.

-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On
Behalf Of Wilt, Charles
Sent: Friday, April 21, 2006 3:32 PM
To: RPG programming on the AS400 / iSeries
Subject: *NOPASS and *OMIT make calling easier but boy are the procedures
ugly,any tips/tricks?

All,

I really like the idea coding optional parameters as (*NOPASS : *OMIT).
Particularly when the parameter is question ends up in a null capable
file field.

However, as far as I can tell actual implementation is ugly beyond
belief.

      /free
           if bin_Required();
             wToBin = AskUserForBin();
             Inventory_MoveSerialized(wPlant:wSerial:wToStkRm:wToBin);
           else;
             Inventory_MoveSerialized(wPlant:wSerial:wToStkRm);
           endif;

           *INLR = *ON;
           return;
      /end-free

     p Inventory_MoveSerialized...
     p                 b                   export
     d Inventory_MoveSerialized...
     d                 pi              n
     d  plant                              like(t_PlantID) const
     d  serial                             like(t_SerialNumber) const
     d  toStkRm                            like(t_StockRoom) const
     d  toBin                              like(t_BinLocation) const
     d                                     options(*NOPASS:*OMIT)
     d  parm5                        10a   const options(*NOPASS:*OMIT)
    
      /free
           if %parms >= 5;
             if parm5 <> *OMIT;
               SomeOtherProc1(plant:parm5);
             else;
               SomeOtherProc1(plant:*OMIT);
             endif;
           else
             SomeOtherProc1(plant);
           endif; 

           if %parms >= 4; 
             if parm4 <> *OMIT;
               SomeOtherProc2(plant:serial:toStkRm:toBin);
             else
               SomeOtherProc2(plant:serial:toStkRm:*OMIT);
             endif;
           else
             SomeOtherProc2(plant:serial:toStkRm);
           endif;        

           if %parms >= 5;
             if parm5 <> *OMIT;
               if toBin <> *OMIT;
                 SomeOtherProc3(plant:toBin:parm5);
               else;
                 SomeOtherProc3(plant:*OMIT:parm5);
               endif;
             elseif toBin <> *OMIT;
                 SomeOtherProc3(plant:toBin:*OMIT);
               else
                 SomeOtherProc3(plant:*OMIT:*OMIT);
               endif;
           elseif %parms >= 4;
             if toBin <> *OMIT;
               SomeOtherProc3(plant:toBin);
             else;
               SomeOtherProc3(plant:*OMIT); 
             endif;
           else 
             SomeOtherProc3(plant);
           endif;
  
           return;
      /end-free

Calling SomeOtherProc1 & SomeOtherProc2 is ugly enough, but calling
SomeOtherProc3 which uses two *NOPASS:OMIT parms is horrible.  I'd hate
to imagine what it would look like if there were more *NOPASS:*OMIT
parameters being passed to it.

So how are you all dealing with this wreak?

Somebody correct me if I'm wrong, but I'm thinking that it might be best
to drop the *NOPASS, since I believe that I can pass along (by const
reference) an *OMITted parameter to another procedure with no problems.
So for instance this would work with parm5 *OMITted or not:

      /free
           if parm5 <> *OMIT;
              dsply parm5;
           endif;
           SomeOtherProc1(plant:parm5);
      /end-free

It would really be nice if RPG allowed you to make a varible NULL
(*OMITted)

So for instance you could have:
     d wToBin      s                 like(t_BinLocation) inz(*OMIT)
      /free
           if bin_Required();
             wToBin = AskUserForBin();
           endif;
           Inventory_MoveSerialized(wPlant:wSerial:wToStkRm:wToBin);

           *INLR = *ON;
           return;
      /end-free

Then in the Inventory_MoveSerialized even with *NOPASS I could have
      /free
           if %parms >= 5;
             wParm5 = parm5;
           else
             wParm5 = *OMIT;
           endif;
           if %parms >= 4;
             wToBin = toBin;
           else
             wToBin = *OMIT;
           endif;

           SomeOtherProc1(plant:parm5);
           SomeOtherProc2(plant:serial:toStkRm:toBin);
           SomeOtherProc3(plant:toBin:parm5);
           
           return;
      /end-free

Thoughts?????

Thanks in advance,

Charles Wilt
--
iSeries Systems Administrator / Developer
Mitsubishi Electric Automotive America
ph: 513-573-4343
fax: 513-398-1121
 


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

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.