!--a11y-->

サブルーチンにパラメータインタフェースがある場合は、サブルーチンの呼出時に、そのインタフェースの すべての仮パラメータに値を指定する必要があります。実パラメータを、PERFORM 命令の USING または CHANGING オプションの後に表示します。
値を渡す際、PERFORM 命令の実パラメータの順序は重要です。一覧の最初の実パラメータの値は最初の仮パラメータに、2 番めは 2 番めに、というように渡されます。USING オプションと CHANGING オプションは、まったく同じ意味を持ちます。どちらか一方を使用すれば済みます。ただし、記録目的では、パラメータをインタフェース定義で使用したのと同じ方法で分割することをお奨めします。
実パラメータには、技術属性が対応する仮パラメータに指定された型と互換性のある呼出元プログラムの、任意のデータオブジェクトまたはフィールドシンボルを指定することができます。実パラメータを指定する場合、参照によって仮パラメータに渡したすべて、および値によって出力パラメータに渡したすべてを、サブルーチンによって変更することができます。このため、変更するデータオブジェクトのみが、実パラメータ一覧の対応するポジションに表示されるようにする必要があります。
サブルーチンのインタフェースに TABLES パラメータが含まれる場合は、これらを PERFORM 命令の TABLES オプションで、USING および CHANGING パラメータの前に指定する必要があります。TABLES パラメータは以前のリリースとの互換性を確保するためにのみサポートされており、その後は使用されません。
実パラメータには、フィールドシンボルのオフセットアドレシングと同じ方法でこれをを使用することができます。すなわち、指定された実パラメータの境界の外にあるメモリ領域を選択することができます。

PROGRAM form_test.
DATA: a1 TYPE p DECIMALS 3,
a2 TYPE i,
a3 TYPE d,
a4 TYPE spfli-carrid,
a5(1) TYPE c.
...
PERFORM subr USING a1 a2 a3 a4 a5.
...
PERFORM subr CHANGING a1 a2 a3 a4 a5.
...
PERFORM subr USING a1 a2
a3
CHANGING a4 a5.
...
FORM subr USING
value(f1)
TYPE p
value(f2)
TYPE i
f3 LIKE
a3
CHANGING
value(f4)
TYPE spfli-carrid
f5.
...
ENDFORM.
この例では、5 つの仮パラメータ F1 から F5 までで構成されるパラメータインタフェースを持つサブルーチン SUBR が定義されています。サブルーチンは内部で 3 回呼び出されています。実パラメータはデータオブジェクト A1 から A5 です。3 つのサブルーチンコールはすべて等しく有効です。 実パラメータの順序が変更されない限り、等しく有効な追加の PERFORM 命令も存在します。それぞれの呼出では、A1 が F1 に、A2 が F2 にというように渡されます。サブルーチンの終了時には、A3 、A4 、および A5 はそれぞれ値 F3 、F4 、および F5 を受け取ります。3 番めのサブルーチンコールはプログラムに、サブルーチンのパラメータインタフェースが何を示すかを記録します。すなわち、A4 および A5 だけが変更されます。A3 が変更されるかどうかは、サブルーチンがプログラムされた方法によって決まります。
以下の例は、汎用的に型定義された仮パラメータが、対応する実パラメータから技術属性を継承する方法を示しています。

REPORT demo_mod_tech_describe.
DATA:
date1 TYPE
d,
date2 TYPE t,
string1(6) TYPE
c,
string2(8) TYPE c,
number1 TYPE p DECIMALS
2, number2 TYPE p DECIMALS 0,
count1 TYPE
i,
count2 TYPE i.
PERFORM typetest USING
date1 string1 number1 count1.
SKIP.
PERFORM typetest USING
date2 string2 number2 count2.
FORM typetest USING
now
txt
TYPE c
value(num)
TYPE p
int
TYPE i.
DATA: t(1) TYPE c.
DESCRIBE FIELD now TYPE t.
WRITE: / 'Type of NOW is', t.
DESCRIBE FIELD txt LENGTH t IN CHARACTER MODE.
WRITE: / 'Length of TXT is', t.
DESCRIBE FIELD num DECIMALS t.
WRITE: / 'Decimals of NUM are', t.
DESCRIBE FIELD int TYPE t.
WRITE: / 'Type of INT is', t.
ENDFORM.
これにより、出力は以下のようになります。
Type of NOW is D
Length of TXT is 6
Decimals of NUM are 2
Type of INT is I
Type of NOW is T
Length of TXT is 8
Decimals of NUM are 0
Type of INT is I
内部サブルーチン TYPETEST は、異なる実パラメータで 2 回呼び出されています。実パラメータおよび仮パラメータは互換性があり、構文チェック時にエラーメッセージは発生しません。COUNT2 を型 I ではなく型 F で宣言した場合、仮パラメータ INT は型 I で指定されているため、構文チェックでエラーが返されます。汎用型の仮パラメータは、対応する技術属性に従ってさまざまな技術属性を採用します。