在AS400中的程序之间传递可选parm

时间:2017-05-04 05:01:06

标签: ibm-midrange rpgle rpg

我有一个PGMA(RPGLE),它是从PGMB(CL)和PGMC(CL)调用的。 PGMB用2个parms调用PGMA,而PGMC用3个parms调用PGMA。

我如何在PGMA中处理这个问题。我为第三个parm尝试了选项(* Nopass)(这是可选的),但这仅适用于我猜的程序。我不能把这个选项放在PGMA的* PLIST中。

2 个答案:

答案 0 :(得分:3)

Options(*nopass)适用于程序和程序。我倾向于将*ENTRY PLIST替换为dcl-pi,但即使使用PLIST,您也可以将参数设为可选。

所以最好的方式:

ctl-opt Main(MyProgram);

...

dcl-proc MyProgram;
  dcl-pi *n ExtPgm('MYPROGRAM');
    parm1     Char(10);
    parm2     Char(10);
    optparm   Char(10) options(*nopass);
  end-pi;

  ...

  // to process optional parm
  if %parms() >= %parmnum(optparm);
    // do something with optparm;
  endif;

end-proc;

如果没有线性主要规范,您只需将PI添加到程序的主体中,如下所示:

dcl-pi MyProgram ExtPgm('MYPROGRAM');
  parm1     Char(10);
  parm2     Char(10);
  optparm   Char(10) options(*nopass);
end-pi;

  ...

// to process optional parm
if %parms() >= %parmnum(optparm);
  // do something with optparm;
endif;

这是v5版本

 d MyProgram       pr                  ExtPgm('MYPROGRAM')
 d  parm1                        10a        
 d  parm2                        10a   
 d  optparm                      10a   options(*nopass)
 d
 d MyProgram       pi                 
 d  parm1                        10a        
 d  parm2                        10a   
 d  optparm                      10a   options(*nopass)
  *
  /free
   if %parms() >= 3;
     // do something with optparm
   endif;

但是如果你使用PLIST它甚至可以工作,但是在这种情况下你不能在因子1或2中包含条目。这只能在固定格式程序中使用,而且我通常不会在没有情有可原的情况下编写新的固定格式代码,所以我会把它归类为最后的选择。

 C     *Entry        PLIST
 C     input1        PARM                    parm1
 C     input2        PARM                    parm2
 C                   PARM                    optparm
 C*
 C                   if        %parms() >= 3
 C*        do something with optparm
 C                   endif

注意:我没有将任何原型添加到我的自由格式程序界面示例中,因为它们不再需要。但是,如果您的程序可以被另一个RPG IV程序或程序调用,最好创建一个包含该原型的副本,并将其包含在原始程序和任何调用程序中。这可以确保原型与调用者匹配。

在所有这些情况下,了解您不能使用未传递的参数非常重要。因此,在程序开始时,我将使用if %parms() >= ...结构测试所有可选参数,如果parm已通过,我将其移动到我在程序中定义的变量中。如果它不存在,我默认值。上面的固定格式示例适用于自v3r2 / v3r6以来的所有RPG IV版本。如果您的RPG版本没有内置%parms(),则可以使用“程序状态数据结构”中的字段来确定参数的数量。这确实可以追溯到过去,因为%parms()是在1990年代中期的第二版RPG IV中引入的。

答案 1 :(得分:1)

使用* ENTRY PLIST时,所有参数都是自动可选的。