!--a11y-->

PERFORM 命令を使うと、同じ ABAP プログラムでコーディングされたサブルーチン ( 内部コール) 、または他の ABAP プログラムでコーディングされたサブルーチン ( 外部コール) を呼び出すことができます。
実行時にサブルーチンの名前を動的に指定して、一覧からサブルーチンを呼び出すこともできます。
同じプログラムで定義されたサブルーチンを呼び出すには、PERFORM 命令で名前を指定するだけで済みます。
PERFORM <subr>
[USING ... <pi>...]
[CHANGING...<pi>...
].
内部サブルーチンは、呼出元プログラムのすべてのグローバルデータにアクセスすることができます。

PROGRAM FORM_TEST.
DATA: NUM1 TYPE I,
NUM2
TYPE I,
SUM TYPE I.
NUM1 = 2. NUM2 = 4.
PERFORM ADDIT.
NUM1 = 7. NUM2 = 11.
PERFORM ADDIT.
FORM ADDIT.
SUM = NUM1
+ NUM2.
PERFORM
OUT.
ENDFORM.
FORM OUT.
WRITE: /
'Sum of', NUM1, 'and', NUM2, 'is', SUM.
ENDFORM.
出力は以下のようになります。
Sum of 2 and 4 is 6
Sum of 7 and 11 is 18
この例では、プログラムの最後に 2 つの内部サブルーチン ADDIT および OUT が定義されています。ADDIT はこのプログラムから呼び出され、OUT は ADDIT から呼び出されています。サブルーチンはグローバル項目 NUM1 、NUM2 、および SUM にアクセスすることができます。
外部サブルーチンの呼出
サブルーチンの主な機能は、ローカルプログラムのモジュール化および構造化です。ただし、サブルーチンは外部で他の ABAP プログラムから呼び出すこともできます。極端なケースでは、ABAP プログラムにサブルーチン以外何も含まれないこともあります。これらのプログラムは自分自身では実行できませんが、他の ABAP プログラムによって外部サブルーチンのプールとして使用されます。
ただし、ある機能をシステム全体で使用できるようにするには、外部サブルーチンではなく汎用モジュールを使用する必要があります。汎用モジュールビルダを使って、ABAP ワークベンチに汎用モジュールを登録します。汎用モジュールは中央ライブラリに保存され、承認手順が定義されています。
属性に機能およびデータをカプセル化し、クラスメソッドを ABAP オブジェクトにカプセル化することができます。基本的な機能を上回る要求については、外部サブルーチンでなくグローバルクラスを使用することができます。
サブルーチンを外部で呼び出す場合は、サブルーチンが定義されたプログラムの名前を知っている必要があります。
PERFORM <subr>(<prog>)
[USING ...<pi>...]
[CHANGING...<pi>...] [IF
FOUND].
プログラム名 <prog> を静的に指定します。プログラム <prog> にサブルーチン <sub> がない場合は、IF FOUND オプションを使用して、実行時エラーの発生を防ぐことができます。この場合、PERFORM 命令は無視されます。
外部サブルーチンを呼び出すと、サブルーチンを含むプログラム全体が呼出元プログラムの内部セッションにロードされます ( まだロードされていない場合) 。追加情報については、APAB プログラムのメモリ構造 を参照してください。記憶域を節約するために、異なるプログラムで呼び出されるサブルーチンの数を最小限に抑える必要があります。

あるプログラムに以下のサブルーチンが含まれているとします。
PROGRAM FORMPOOL.
FORM HEADER.
WRITE: /
'Program started by', SY-UNAME,
/ 'on host', SY-HOST,
'date:', SY-DATUM, 'time:', SY-UZEIT.
ULINE.
ENDFORM.
このサブルーチンは、以下のようにして他のプログラムから呼び出すことができます。
PROGRAM FORM_TEST.
PERFORM HEADER(FORMPOOL) IF FOUND.
この例では、呼出元プログラムとサブルーチンの間でデータはやりとりされていません。
サブルーチンの名前、および外部コールの場合はサブルーチンが生成されるプログラム名を、以下のように動的に指定することができます。
PERFORM (<fsubr>)[IN PROGRAM
(<fprog>)][USING ...<pi>...]
[CHANGING...<pi>...]
[IF FOUND].
サブルーチン名および外部プログラム名は、それぞれ項目 <fsubr> および<fprog> の内容です。<fprog> に <fsubr> という名前のサブルーチンがない場合は、IF FOUND オプションを使用して、実行時エラーの発生を防ぐことができます。括弧を省略すると、PERFORM 命令のこのバリアントは静的バリアントのように動作します。

あるプログラムに以下のサブルーチンが含まれているとします。
PROGRAM FORMPOOL.
FORM SUB1.
WRITE: /
'Subroutine 1'.
ENDFORM.
FORM SUB2.
WRITE: /
'Subroutine 2'.
ENDFORM.
動的サブルーチン仕様:
PROGRAM FORM_TEST.
DATA: PROGNAME(8) VALUE 'FORMPOOL',
SUBRNAME(8).
SUBRNAME = 'SUB1'.
PERFORM (SUBRNAME) IN PROGRAM
(PROGNAME) IF FOUND.
SUBRNAME = 'SUB2'.
PERFORM (SUBRNAME) IN PROGRAM
(PROGNAME) IF FOUND.
出力は以下のようになります。
Subroutine 1
Subroutine 2
文字項目 PROGNAME には、サブルーチンが含まれるプログラムの名前が入っています。サブルーチンの名前は、文字項目SUBRNAME に代入されます。
一覧からのサブルーチンの呼出
以下のようにして、一覧からサブルーチンを呼び出すことができます。
PERFORM <idx> OF <subr1> <subr2>....<subrn>.
ポジション <idx> で、サブルーチン一覧で指定されたサブルーチンが呼び出されます。PERFORM 命令のこのバリアントは、内部サブルーチンコールおよびパラメータインタフェースのないサブルーチンに対してのみ使用することができます。項目<idx> には、変数またはリテラルを指定します。

PROGRAM FORM_TEST.
DO 2 TIMES.
PERFORM
SY-INDEX OF SUB1 SUB2.
ENDDO.
FORM SUB1.
WRITE /
'Subroutine 1'.
ENDFORM.
FORM SUB2.
WRITE /
'Subroutine 2'.
ENDFORM.
出力は以下のようになります。
Subroutine 1
Subroutine 2
この例では、2 つの内部サブルーチン SUB1 および SUB2 が一覧から連続して呼び出されます。