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() >= ...
и, если параметр был передан, я перемещаю его в переменную, которую я определил в программе. Если он не существует, я использую значение по умолчанию. Приведенный выше пример с фиксированным форматом работает для всех версий RPG IV, начиная с v3r2/v3r6. Если ваша версия RPG не имеет встроенной функции %parms(), вы можете использовать поле в структуре данных состояния программы, чтобы определить количество параметров. Это действительно уходит в прошлое, поскольку %parms() был представлен во втором выпуске RPG IV в середине 1990-х годов.
person
jmarkmurphy
schedule
04.05.2017