!--a11y-->

1 つのプログラムで同じ命令のセットを 2 回以上再利用する場合は、その命令のセットをマクロに組み込むことができます。マクロは、たとえば長い計算や複雑な WRITE 命令を実行するときに役立ちます。マクロは、そのマクロが定義されているプログラム内でのみ使用することができます。また、マクロは、その定義に続くプログラムの行でのみ呼び出すことができます。
マクロ < マクロ> は、以下の命令ブロックで定義されます。
DEFINE < マクロ>.
< 命令>
END-OF-DEFINITION.
DEFINE と END-OF-DEFINITION の間には完全な命令を指定する必要があります。< 命令> には、最大で 9 個のプレースホルダ (&1 、&2 、... 、&9) を指定することができます。マクロは、そのマクロを使用するプログラムの箇所の前で定義する必要があります。
マクロはプログラムの定義部分には属しません。したがって、DEFINE...END-OF-DEFINITION ブロックは、プログラムの処理ブロックの前では解釈されません。一方、マクロはまた、ランタイム時に処理ブロックで実行される 操作命令ではありません。プログラムの生成時、マクロ定義はその定義箇所で考慮されません。このため、マクロ定義は ABAP プログラムの構造 の概要に表示されません。
マクロ定義は、プログラムの任意の箇所にショートカットの形式で挿入され、プログラムの 任意の後続箇所で使用することができます。プログラマは、マクロ自体が使用される前にマクロ定義がプログラムで確実に実行されるようにする必要があります。マクロとインクルードプログラムの両方を使用する場合は、特に注意する必要があります。一部のインルードプログラムは、構文チェックの対象に含まれていないからです。
マクロを使用するには、以下の書式を使用します。
< マクロ> [<p1> <p2> ... <p9>].
プログラムの生成時に、< マクロ> は定義済の命令で置換され、各プレースホルダ &i はパラメータ <p i> で置換されます。マクロはネストして使用することができます。ただし、そのマクロ自身をマクロで呼び出すことはできません。

DATA: RESULT TYPE
I,
N1 TYPE I VALUE 5,
N2 TYPE I VALUE 6.
DEFINE OPERATION.
RESULT = &1 &2 &3.
OUTPUT &1 &2 &3
RESULT.
END-OF-DEFINITION.
DEFINE OUTPUT.
WRITE: / 'The result of &1 &2 &3 is', &4.
END-OF-DEFINITION.
OPERATION 4 + 3.
OPERATION 2 ** 7.
OPERATION N2 - N1.
次のように画面に表示されます。
The result of 4 + 3 is 7
The result of 2 ** 7 is 128
The result of N2 - N1 is 1
ここでは、2 つのマクロOPERATION と OUTPUT が定義されています。OUTPUT は OPERATION の中にネストされています。OPERATION は、それぞれ別のパラメータで 3 回呼び出されます。マクロ内でプレースホルダ &1 、&2 、... がどのように置換されているかに留意してください。

以下の例は、マクロ定義がそれに続くプログラムの行でのみ機能することを示しています。マクロ定義は コピーしないでください。
サブルーチン TEST をプログラムで使用するものと仮定します。
PROGRAM MACRO_TEST.
...
FORM TEST.
WRITE
'...'.
ENDFORM.
次に、このプログラムを以下のように変更したとします。
PROGRAM MACRO_TEST.
...
FORM TEST.
DEFINE MACRO.
WRITE
'...'.
ENDFORM.
END-OF-DEFINITION.
MACRO.
マクロを挿入しても、生成されたプログラムの書式はまったく変更されません。処理ブロック ( ここではサブルーチン) は常に非表示です。次のようにプログラムを作成することもできます。
PROGRAM MACRO_TEST.
...
DEFINE MACRO.
WRITE
'...'.
ENDFORM.
END-OF-DEFINITION.
...
FORM TEST.
MACRO.
マクロ定義の最も基本的な特徴は、そのマクロが使用される前にマクロ定義が存在しなければならないということです。