Makros 

Um in einem Programm die gleiche Anweisungsfolge mehrmals wiederzuverwenden, kann diese ein einziges Mal in einem Makro kodiert werden. Dies kann beispielsweise bei längeren Berechnungen oder komplexen WRITE-Ausgaben sinnvoll sein. Makros stehen nur lokal in einem Programmtext und dort nur für nachfolgende Zeilen zur Verfügung.

Der folgende Anweisungsblock definiert ein Makro <makro>:

DEFINE <makro>.

   <anweisungen>

END-OF-DEFINITION.

Zwischen DEFINE und END-OF-DEFINITION müssen vollständige Anweisungen angeben werden. Diese Anweisungen können bis zu neun Platzhalter &1, &2,...., &9 enthalten. Die Definition eines Makros muß im Programmtext vor seiner Verwendung erfolgen.

Makrodefinitionen gehören nicht zum Deklarationsteil eines Programms. Der DEFINE-Anweisungsblock wird also nicht automatisch vor die Verarbeitungsblöcke eines Programms gezogen. Eine Makro-Definition ist aber auch keine operationale Anweisung, die zur Programmlaufzeit in einem Verarbeitungsblock ausgeführt wird. Makro-Definitionen werden bei der Programmgenerierung nicht an der Stelle berücksichtigt, an denen sie aufgeführt sind und tauchen daher in der Übersicht zum Aufbau von ABAP-Programmen nicht auf.

Eine Makro-Definition führt an beliebiger Position des Programmtexts sozusagen eine Abkürzung ein, die dann in allen nachfolgenden Zeilen dieses Programmtexts verwendet werden kann. Der Programmierer muß dafür sorgen, daß die Definition eines Makros im Programmtext vor dessen Verwendung steht. Besondere Vorsicht ist bei der gleichzeitigen Verwendung von Makros und Include-Programmen geboten, da nicht alle Include-Programme bei der statischen Syntaxprüfung zur Verfügung stehen (Ausnahme: Top-Inlude).

Die Verwendung des Makros erfolgt über die Anweisung

<makro> [<p1> <p2>... <p9>].

Während der Programmgenerierung wird das Makro durch die entsprechenden Anweisungen ersetzt und in den Anweisungen werden die Platzhalter &i wörtlich durch die Parameter <p i > ersetzt. Sie können ein Makro in einem anderen Makro verwenden. Ein Makro kann jedoch nicht sich selbst verwenden.

REPORT demo_mod_tech_macros.

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.

Die Ausgabe sieht so aus:

The result of 4 + 3 is          7

The result of 2 ** 7 is        128

The result of N2 - N1 is          1

In diesem Beispiel werden die beiden Makros OPERATION und OUTPUT definiert. OUTPUT ist in OPERATION geschachtelt. OPERATION wird dreimal mit verschiedenen Parametern aufgerufen. Beachten Sie, wie die Platzhalter &1, &2,... wörtlich in den Makros ersetzt werden.

Dieses Beispiel zeigt, daß eine Makrodefinition tatsächlich nur als Abkürzung für nachfolgende Zeilen in einem Programmtext wirkt. Es soll nicht zur Nachahmung anregen!

Betrachten wir ein Programm mit einem Unterprogramm TEST:

PROGRAM macro_test.

...

FORM test.
  WRITE '...'.
ENDFORM.

Das Programm kann durch Einführung eines Makros MACRO wie folgt umgeschrieben werden:

PROGRAM macro_test.

...

FORM test.

DEFINE macro.
    WRITE '...'.
  ENDFORM.
END-OF-DEFINITION.

MACRO.

Die Einführung des Makros ändert nichts an der generierten Form des Programms. Ein Verarbeitungsblock, hier ein Unterprogramm, ist und bleibt unteilbar! Das Programm könnte auch wie folgt geschrieben werden:

PROGRAM macro_test.

...

DEFINE macro.
    WRITE '...'.
  ENDFORM.
END-OF-DEFINITION.

...

FORM test.

MACRO.

Bei der Definition des Makros ist einzig und allein wichtig, daß es vor der Verwendung steht.