2017-05-04 13 views
3

私はPGMB(CL)とPGMC(CL)から呼び出されるPGMA(RPGLE)を持っています。 PGMBはPGMAを2つのparmsで呼び出し、PGMCはPGMAを3つのparmsで呼び出します。AS400のプログラム間でオプションのparmを渡す

これはPGMAでどう対処しますか?私はオプション(* Nopass)3番目のparm(これはオプションです)を試しましたが、それは私が推測する手順のためだけです。 PGMAの*エントリのPLISTにこのオプションを入れることはできません。

答えて

3

Options(*nopass)は、プログラムと手順の両方で動作します。 *ENTRY PLISTdcl-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() >= ...構造を持つすべてのオプションのparmsをテストし、parmが渡されていれば、プログラムで定義した変数にそのparmを渡します。存在しない場合は、デフォルト値になります。上の固定フォーマットの例は、v3r2/v3r6以降のRPG IVのすべてのバージョンで有効です。ご使用のRPGのバージョンに%parms()ビルトインがない場合は、プログラム状況データ構造のフィールドを使用して、パラメーターの数を判別することができます。 %parms()が1990年代半ばのRPG IVの2番目のリリースで導入されたので、これは本当に過去に戻っています。

+0

オプションのparmsは、渡されないとmchエラーを生成します。エラーを処理する場合は、plilを渡すことができます。 – danny117

+0

@ danny117これは、渡されなかったparmで何かをしようとする場合にのみ当てはまります。これが 'if%parms()> =%parmnum(optparm)'の理由です。 – jmarkmurphy

+0

CLP内のコードです。バージョン5では? – danny117

1

* ENTRY PLISTを使用すると、すべてのパラメータが自動的にオプションです。

+0

オプションのparmsをコード化する必要があります。オーバーロード機能はLEでコード化しなければなりません。 – danny117

関連する問題