!--a11y-->

FORM 命令の USING および CHANGING オプションは、サブルーチンの仮パラメータを定義します。オプションの順序は固定です。各オプションの後には、任意の数の仮パラメータの一覧をつけることができます。サブルーチンを呼び出す際、実パラメータの値で仮パラメータをすべて入力する必要があります。サブルーチンが終了すると、仮パラメータは対応する実パラメータに戻されます。
サブルーチン内では、仮パラメータは動的ローカルデータのように動作します。仮パラメータは、DATA 命令で宣言する標準ローカルデータオブジェクトと同じ方法で使用することができます。これらは同じ名前でグローバルデータオブジェクトをマスクします。サブルーチンの開始時のパラメータ値は、対応する実パラメータから渡された値です。
サブルーチンには以下の仮パラメータがあります。
これらのパラメータは、USING または CHANGING の後に VALUE オプションなしで表示します。
FORM
<subr> USING ...<pi> [TYPE
<t>|LIKE <f>] ...
CHANGING
...<pi> [TYPE <t>|LIKE
<f>] ...
仮パラメータはメモリを占有しません。サブルーチンコール中は、実パラメータのアドレスのみが仮パラメータに転送されます。サブルーチンは呼出元プログラムの項目を使用して作業します。仮プログラムの値が変わると、呼出元プログラムの実パラメータの内容も変わります。
参照によって呼び出す場合は、 USING と CHANGING は同等です。文書目的の場合は、サブルーチンで変更されない入力パラメータに USING を使用して、サブルーチンで変更される出力パラメータにはCHANGING を使用する必要があります。
実パラメータの値が自動的に変更されないようにするには、値によって渡す必要があります。
これらのパラメータは、USING の後に VALUE オプション付きで表示します。
FORM <subr> USING ...VALUE(<pi>) [TYPE <t>|LIKE <f>] ...
仮パラメータは記憶域を占有します。サブルーチンを呼び出すと、実パラメータの値は仮パラメータに渡されます。仮パラメータの値が変わっても、実パラメータには影響しません。
これらのパラメータは、CHANGING の後に VALUE オプション付きで表示します。
FORM <subr> CHANGING ...VALUE(<pi>) [TYPE <t>|LIKE <f>] ...
仮パラメータは記憶域を占有します。サブルーチンを呼び出すと、実パラメータの値は仮パラメータに渡されます。サブルーチンが終了すると、すなわち ENDFORM 命令が使用された場合、またはサブルーチンが CHECK 命令か EXIT 命令で終了した場合は、仮パラメータの現在の値は実パラメータにコピーされます。
エラーメッセージによってサブルーチンが早く終了する場合は、値は渡されません。サブルーチンは画面の PAI プロセス、すなわち PAI モジュールで、AT SELECTION-SCREEN イベントで、または対話一覧イベント後のエラーメッセージで終了する場合のみ意味があります。
仮パラメータには、任意の有効な ABAP データ型を指定することができます。仮パラメータの型は、TYPE または LIKE オプションを使用して、汎用的にも完全的にも指定することができます。汎用的な型を指定する場合、仮パラメータの型は、部分的に指定されるかまったく指定されないかのいずれかです。指定されていない属性はすべて、サブルーチンの呼出時に対応する実パラメータから継承されます。型を完全に指定する場合、仮パラメータのすべての技術属性はサブルーチン定義で定義されます。
パラメータの型の指定に関する以下の留意点は、他のプロシージャのパラメータにも適用されます ( 汎用モジュールおよびメソッド) 。
仮パラメータの型を指定している場合、サブルーチンコール時に、対応する実パラメータと互換性があることがチェックされます。内部サブルーチンの場合、これは構文チェックでチェックされます。外部サブルーチンの場合は、実行時までチェックされません。
型を指定することによって、サブルーチンが常に正しいデータ型を使用して作業することを保証することができます。汎用仮パラメータはどんなデータ型の受け渡しも可能であるため、サブルーチンの呼出時に大幅な自由が確保されます。このことは、サブルーチンでのデータ処理のオプションを制限します。操作はすべてのデータ型に対して有効でなければならないためです。たとえば、あるデータオブジェクトの別のデータオブジェクトへの割当は、すべてのデータ型で実行できるわけではありません。サブルーチンパラメータの型を指定すると、呼出において操作に適したデータだけが渡されるため、より広い範囲の操作を実行することができます。サブルーチンのコンポーネントによって構造化データオブジェクトを処理する場合は、パラメータの型を指定する必要があります。
以下の型を使用すると、実パラメータを使用する際により自由が確保されます。実パラメータは、仮パラメータが保持する属性だけを選択できる必要があります。仮パラメータは、残っている実パラメータからの無名の属性を採用します。
|
型仕様 |
実パラメータのチェック |
|
指定なし TYPE ANY |
サブルーチンはすべての型の実パラメータを使用することができます。仮パラメータは実パラメータのすべての技術属性を継承します。 |
|
TYPE C 、N 、P 、または X |
サブルーチンは型 C 、N 、P 、または X の実パラメータのみを使用することができます。仮パラメータは実パラメータから項目長および DECIMALS 規定 ( 型 P の場合) を継承します。 |
|
TYPE TABLE |
実パラメータが標準内部テーブルかどうかがチェックされます。これは、TYPE STANDARD TABLE の短縮形式です ( 以下を参照) 。 |
|
TYPE ANY TABLE |
実パラメータが内部テーブルかどうかがチェックされます。仮パラメータは実パラメータからすべての属性 ( 行データ型、テーブルデータ型、キー) を継承します。 |
|
TYPE INDEX TABLE |
実パラメータが索引テーブル ( 標準またはソートテーブル) かどうかがチェックされます。仮パラメータは実パラメータからすべての属性 ( 行データ型、テーブルデータ型、キー) を継承します。 |
|
TYPE STANDARD TABLE |
実パラメータが標準内部テーブルかどうかがチェックされます。仮パラメータは実パラメータからすべての属性 ( 行データ型、キー) を継承します。 |
|
TYPE SORTED TABLE |
実パラメータがソートテーブルかどうかがチェックされます。仮パラメータは実パラメータからすべての属性 ( 行データ型、キー) を継承します。 |
|
TYPE HASHED TABLE |
実パラメータがハッシュテーブルかどうかがチェックされます。仮パラメータは実パラメータからすべての属性 ( 行データ型、キー) を継承します。 |
仮パラメータは対応する実パラメータの属性を実行時に動的に継承するため、プログラムコードで識別することはできません。たとえば、サブルーチンで継承テーブルキーを静的にアドレスすることはできませんが、動的にはアドレスできる可能性があります。

TYPES: BEGIN OF LINE,
COL1,
COL2,
END OF LINE.
DATA: WA TYPE LINE,
ITAB TYPE HASHED TABLE OF LINE WITH UNIQUE
KEY COL1,
KEY(4) VALUE 'COL1'.
WA-COL1 = 'X'.INSERT WA INTO TABLE
ITAB.
WA-COL1 = 'Y'.INSERT WA
INTO TABLE ITAB.
PERFORM DEMO USING ITAB.
FORM DEMO USING P TYPE ANY
TABLE.
...
READ TABLE
P WITH TABLE KEY (KEY) = 'X' INTO WA.
...
ENDFORM.
テーブルキーはサブルーチン内で動的にアドレスされます。ただし静的アドレス
READ TABLE P WITH TABLE KEY COL1 = 'X' INTO WA.
は構文的には正しくありません。仮パラメータ P は実行時までテーブルキー ITAB を採用しないためです。
以下の型を使用する場合、仮パラメータの技術属性は完全に指定されます。実パラメータの技術属性は、仮パラメータの技術属性に対応する必要があります。
|
型仕様 |
仮パラメータの技術属性 |
|
TYPE D 、F 、I 、または T |
仮パラメータには事前定義された基本データ型の技術属性があります。 |
|
TYPE <type> |
仮パラメータには型 <type> があります。これはTYPES 命令を使用してプログラム内で定義されたデータ型、または ABAP ディクショナリの型です。 |
|
TYPE REF TO <cif> |
仮パラメータはクラスまたはインタフェース <cif> の参照変数 (ABAP オブジェクト) です。 |
|
TYPE LINE OF <itab> |
仮パラメータには、TYPES 命令を使用して定義された、または ABAP ディクショナリで定義された内部テーブル <itab> の行と同じ型があります。 |
|
LIKE <f> |
仮パラメータには、内部データオブジェクト <f> または構造、または ABAP ディクショナリのデータベーステーブルと同じ型があります。 |
完全に型定義された仮パラメータを使用する場合、属性はソースコードで認識されるため、プログラム内でその属性を静的にアドレスすることができます。
仮パラメータは任意の有効な ABAP データ型を使用することができるため、仮パラメータの型が完全に指定されている限り、構造化された行データ型の構造および内部テーブルを使用することもできます。サブルーチン内で構造のコンポーネントに静的にアドレスすることができます。
構造化実パラメータを、型が正しく指定されていない仮パラメータに汎用的に渡すと、サブルーチン内で構造のコンポーネントに静的にアドレスすることはできません。内部テーブルの場合、これは行の操作しかできないことを意味します。
汎用的に渡された構造のコンポーネントにアクセスするには、フィールドシンボルおよび割当を使用する必要があります。
ASSIGN COMPONENT <idx>|<name> OF STRUCTURE <s> TO <FS>.
<idx> はコンポーネント番号、<name> の内容は汎用構造<s> のコンポーネント名とみなされます。

DATA: BEGIN OF LINE,
COL1 VALUE 'X',
COL2 VALUE 'Y',
END OF LINE.
DATA COMP(4) VALUE 'COL1'.
PERFORM DEMO USING LINE.
FORM DEMO USING P TYPE ANY.
FIELD-SYMBOLS
<FS>.
ASSIGN
COMPONENT COMP OF STRUCTURE P TO <FS>.
WRITE
<FS>.
ASSIGN
COMPONENT 2 OF STRUCTURE P TO <FS>.
WRITE
<FS>.
ENDFORM.
出力は以下のようになります。
X Y
P の構造 ( 汎用的に渡された) のコンポーネント COL1 および COL2 は、フィールドシンボル <FS> に割り当てられます。コンポーネントには、静的にも動的にも 直接アドレスすることはできません。
TYPE または LIKE を使用する代わりに、構造の型を以下のように指定することができます。
... <pi> [STRUCTURE <s>] ...
<s> はプログラム ( 型ではなくデータオブジェクト) 内のローカル構造、または ABAP ディクショナリのフラット構造です。仮パラメータは<s> に従って構造化され、ユーザはサブルーチン内の仮パラメータの個別コンポーネントにアドレスすることができます。実パラメータが渡されると、実パラメータが少なくとも構造と同じ長さであることだけがチェックされます。このため、STRUCTURE では任意のパラメータの構造化ビューを強制することができます。

DATA: BEGIN OF LINE,
COL1,
COL2,
END OF LINE.
DATA TEXT(2) VALUE 'XY'.
PERFORM DEMO USING TEXT.
FORM DEMO USING P STRUCTURE
LINE.
WRITE:
P-COL1, P-COL2.
ENDFORM.
出力は以下のようになります。
X Y
文字列 TEXT は、構造 LINE に適合されます。
以前のリリースとの互換性を確保するために、USING および CHANGING オプションの前に以下のオプションを使用することもできます。
FORM <subr> TABLES ...<itabi> [TYPE <t>|LIKE <f>] ...
仮パラメータ <itabi> は、ヘッダ行とともに標準内部テーブルとして定義されます。この型の仮パラメータに対応する実パラメータとして、ヘッダ行なしで内部テーブルを使用する場合は、仮パラメータに対してサブルーチン内で ローカルヘッダ行が登録されます。ヘッダ行付きで内部テーブルを渡す場合は、テーブル本体およびテーブル作業領域がサブルーチンに渡されます。TABLES を使用して定義された仮パラメータは、参照によって渡すことはできません。構造化された行のコンポーネントにアドレスする場合は、それ相応に TABLES パラメータの型を指定する必要があります。
リリース 3.0 からは、内部テーブルにはTABLES オプションではなく USING または CHANGING を使用する必要があります。ただし、パフォーマンス上の理由により、値によって渡してはなりません。