передача необязательных параметров между программами в AS400

У меня есть PGMA(RPGLE), которая вызывается из PGMB(CL) и PGMC(CL). PGMB вызывает PGMA с 2 параметрами, а PGMC вызывает PGMA с 3 параметрами.

Как мне справиться с этим в PGMA. Я пробовал параметры (* Nopass) для третьего параметра (который является необязательным), но я думаю, что это только для процедур. Я не могу поместить эту опцию в PLIST *entry в PGMA.


person AS400 User    schedule 04.05.2017    source источник


Ответы (2)


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
comment
необязательные параметры генерируют ошибку mch, если они не переданы. Вы можете пройти через plist, если обработаете ошибку. - person danny117; 04.05.2017
comment
@ danny117 Это верно только в том случае, если вы пытаетесь что-то сделать с параметром, который не был передан. Это причина if %parms() >= %parmnum(optparm) - person jmarkmurphy; 04.05.2017
comment
Закодируйте это в CLP. На версии 5? - person danny117; 04.05.2017
comment
Да, это работает при вызове из CLP в v5. Однако есть некоторые оговорки: v5 поддерживает только спецификации C свободной формы, поэтому вам нужно либо использовать *ENTRY PLIST, либо определить интерфейс прототипа и процедуры в спецификациях D. - person jmarkmurphy; 04.05.2017

Все параметры автоматически становятся необязательными при использовании *ENTRY PLIST.

person Barbara Morris    schedule 05.05.2017
comment
нам все еще нужно кодировать необязательные параметры. Функции перегрузки должны быть закодированы в LE. - person danny117; 15.05.2017