Ansicht
Dokumentation

ABENMACROS_GUIDL - MACROS GUIDL

ABENMACROS_GUIDL - MACROS GUIDL

General Material Data   SUBST_MERGE_LIST - merge external lists to one complete list with #if... logic for R3up  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Makros

Ein Makro ist eine Zusammenfassung einer Anweisungsfolge zur programminternen Wiederverwendung zwischen DEFINE und END-OF-DEFINITION. Die Einbindung der Anweisungsfolge an einer anderen Stelle des Programms erfolgt über die Angabe des Makronamens. Ein Makro kann bis zu neun Platzhalter &1 bis &9 anstelle von ABAP-Wörtern und Operanden oder Teilen von Operanden enthalten, die bei der Einbindung des Makros durch konkrete Wörter ersetzt werden müssen.

Makros nur in Ausnahmefällen verwenden

Verwenden Sie vorzugsweise Prozeduren (Methoden) oder Ausdrücke mit passenden Operatoren anstelle von Makros.

Makros werden häufig wie aufrufbare Einheiten anstelle von echten Prozeduren benutzt. Dies ist jedoch nur in den wenigsten Fällen sinnvoll. Makros haben zum einen keinen eigenen Kontext, und zum anderen können sie nicht schrittweise im ABAP Debugger ausgeführt werden. Dies macht eine Fehlersuche in Programmen, die umfangreiche oder komplexe Makros verwenden, nahezu unmöglich. Aus diesen Gründen ist ein Makro kein vollwertiger Ersatz für eine echte Prozedur.

Darüber hinaus wurden Makros in der Vergangenheit nicht nur als Prozedurersatz, sondern unter anderem auch dazu verwendet, häufig wiederkehrende Deklarationen strukturierter Daten vorzunehmen. Heutzutage werden hierfür natürlich keine Makros, sondern eigenständige Typen verwendet.

In vielen Fällen können heute auch Ausdrücke statt Makros verwendet werden. Ein Beispiel ist der Einsatz des Wertoperators VALUE zum Füllen von internen Tabellen, der die Verwendung von Makros, welche im Wesentlichen die Anweisung APPEND enthalten, überflüssig macht.

In bestimmten Fällen kann der Einsatz von Makros dennoch gerechtfertigt sein, und zwar dann, wenn einfache, wiederkehrende Anweisungsmuster vorliegen. Ein Makro kann hier als Mittel zur Designzeit-Generierung angesehen werden. Das folgende gute Beispiel zeigt eine solche Verwendung eines Makros. In einem solchen Fall kann der Einsatz eines Makros aus folgenden Gründen die bessere Lösung als die Verwendung einer Prozedur sein:

  • Die im Makro enthaltene Anweisungsfolge ist hinreichend einfach und offensichtlich, sodass die fehlende Möglichkeit des Debuggens nicht ins Gewicht fällt.
  • Die Anweisungen werden statisch von der Syntaxprüfung auf Korrektheit hin überprüft. Beim Einsatz der sonst notwendigen dynamischen Sprachmittel in einer Prozedur würden Fehler (in diesem Beispiel falsch angegebene Bezeichner) erst zur Laufzeit entdeckt werden. Darüber hinaus wäre der dynamische Zugriff zeitaufwendiger.
  • Gegenüber der Ausformulierung aller Einzelanweisungen bleibt der Quelltext beim Einsatz solcher Makros übersichtlicher, insbesondere bei einer hohen Anzahl von Wiederholungen der Anweisungsfolge. Die Gefahr von trivialen Schreibfehlern sinkt, da weniger sich stark ähnelnder Quelltext erstellt und gepflegt werden muss. Änderungen an der Logik sind im Nachhinein mit geringerem Aufwand möglich.

In bestimmten Fällen kann der Einsatz von Makros die Korrektheit und Wartbarkeit von Quelltext also erhöhen. Makros, die nicht triviale Kontrollstrukturen enthalten, stellen aber stets ein Wartungsproblem dar, da sie nicht schrittweise vom ABAP Debugger ausgeführt werden können. Wenn daher Makros verwendet werden, sollte dies äußerst sparsam geschehen, und sie sollten nur wenige Zeilen umfassen, da Fehler in Makros kaum zu analysieren sind.

Hinweis

Außer im Quelltext eines Programms können Makros auch noch programmübergreifend in Type-Pools oder in der Datenbanktabelle TRMAC abgelegt sein. Es sollen aber keine neuen Makros mehr in Type-Pools oder TRMAC definiert werden.

Folgender Quelltext zeigt ein Beispiel, in dem ein Makro als ungeeigneter Ersatz für eine echte Prozedur dient. Im gezeigten Fall wäre das Makro auch nur ein einziges Mal in einem Kontext einsetzbar, da der Arbeitsbereich wa dort nur einmal deklariert werden darf. In diesem Beispiel wäre eine Prozedur mit dynamischen Anteilen sinnvoller.

DEFINE get_data.
  DATA wa TYPE &1.
  SELECT SINGLE *
         FROM &1
         WHERE &2 = @&3 AND
               &4 = @&5
         INTO @wa.
END-OF-DEFINITION.

get_data spfli carrid 'LH' connid '0400'.

Folgender Quelltext zeigt ein Beispiel, in dem die Verwendung eines Makros sinnvoll sein kann. Einige einfache Anweisungsfolgen (jeweils in IF eingeschlossene Zuweisungen) sollen in größerer Zahl wiederholt werden, wobei auch die Namen der verwendeten Operanden einer gewissen Regelmäßigkeit folgen. Diese Funktionalität ließe sich zwar auch mit anderen Mitteln implementieren, wie zum Beispiel über eine Prozedur, in der mit dynamischen Mitteln auf die Variablen zugegriffen wird, oder durch die Ausformulierung jedes einzelnen IF-Blocks. Die Verwendung eines kleinen Makros dient in diesem Fall aber durchaus der Lesbarkeit und Wartbarkeit des Programms.

TYPES: BEGIN OF value_and_flag,
         value TYPE string,
         flag TYPE c LENGTH 1,
       END OF value_and_flag.

TYPES: BEGIN OF structure,
         component_up TYPE value_and_flag,
         component_down TYPE value_and_flag,
         ...
         component_top TYPE value_and_flag,
       END OF structure.

DATA struct TYPE structure.

DEFINE macro_set_value_if_flag_is_set.
   IF struct-component_&1-flag = abap_true.
      struct-component_&1-value = &2.
   ENDIF.
END-OF-DEFINITION.

...

macro_set_value_if_flag_is_set up 'ABC'.
macro_set_value_if_flag_is_set down 'IJK'.
...
macro_set_value_if_flag_is_set top 'XYZ'.
...






RFUMSV00 - Advance Return for Tax on Sales/Purchases   Fill RESBD Structure from EBP Component Structure  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 7674 Date: 20240523 Time: 104639     sap01-206 ( 127 ms )