我有一个PGMA(RPGLE),它是从PGMB(CL)和PGMC(CL)调用的。 PGMB用2个parms调用PGMA,而PGMC用3个parms调用PGMA。
我如何在PGMA中处理这个问题。我为第三个parm尝试了选项(* Nopass)(这是可选的),但这仅适用于我猜的程序。我不能把这个选项放在PGMA的* PLIST中。
答案 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时,所有参数都是自动可选的。