Ereignisblöcke 

Ein Ereignisblock wird durch ein Ereignisschlüsselwort eingeleitet und durch den nachfolgenden Verarbeitungsblock beendet. Der nachfolgende Verarbeitungsblock kann wieder eine Ereignisblock sein und durch ein Ereignisschlüsselwort eingeleitet werden, oder er ist ein anderer, in diesem Kontext erlaubter Verarbeitungsblock, wie z.B. ein Unterprogramm oder ein Dialogmodul. Ein Ereignisschlüsselwort hat den gleichen Namen wie das Ereignis, auf das reagiert werden soll.

Beispiel für den Aufbau eines Reports:

REPORT...

NODES: spfli, sflight.

DATA:...

INITIALIZATION.
...

AT SELECTION-SCREEN.
...

START-OF-SELECTION.
...

GET spfli...
..

GET sflight...
...

GET spfli LATE.
...

END-OF-SELECTION.
...

FORM...
...
ENDFORM.

Die Reihenfolge der Verarbeitungsblöcke in einem Programm ist nicht entscheidend. Die Verarbeitungsabfolge wird ausschließlich über die externen Ereignisse gesteuert. Aus Gründen der Lesbarkeit sollten die Ereignisblöcke aber in etwa in der Reihenfolge im Programm aufgeführt werden, in der sie aufgerufen werden und Unterprogramme sollten am Ende des Programms stehen.

Bis auf die zwei Ausnahmen AT SELECTION-SCREEN und GET haben Ereignisblöcke keinen lokalen Datenbereich. Alle deklarativen Anweisungen in Ereignisblöcken werden den globalen Datendeklarationen des ABAP-Programms zugeschlagen. Deshalb sollten alle deklarativen Schlüsselwörter prinzipiell am Anfang des Programms aufgeführt werden (siehe auch Aufbau von ABAP-Programmen).

Anweisungen, die keinem Verarbeitungsblock zugeordnet sind, werden nie ausgeführt. In Programmen vom Typ 1 werden dabei noch alle nichtdeklarativen Anweisungen zwischen den Anweisungen REPORT oder PROGRAM und dem ersten Verarbeitungsblock dem Standardereignis START-OF-SELECTION zugeordnet. Enthält ein Programm keinen explizit definierten Ereignisblock START-OF-SELECTION, bilden diese Anweisungen den vollständigen Ereignisblock START-OF-SELECTION. Enthält ein Programm einen explizit definierten Ereignisblock START-OF-SELECTION, werden diese Anweisungen am Anfang des Ereignisblocks eingefügt. Enthält ein Programm überhaupt keine explizit definierten Ereignisblöcke, bilden alle nichtdeklarativen Anweisungen den Verarbeitungsblock START-OF-SELECTION.

REPORT demo_abap_events_1.

WRITE / 'Anweisung 1'.

FORM routine.
  WRITE / 'Unterprogramm'.
ENDFORM.

WRITE / 'Anweisung 2'.
PERFORM routine.
WRITE / 'Anweisung 3'.

Die Ausgabe sieht so aus:

Anweisung 1

In diesem Programm wird nur der Ereignisblock START-OF-SELECTION gestartet. Der Block besteht aus der ersten WRITE-Anweisung.

Nun wird eine START-OF-SELECTION-Anweisung in das Programm eingefügt:

REPORT demo_abap_events_2.

WRITE / 'Anweisung 1'.

FORM routine.
  WRITE / 'Unterprogramm'.
ENDFORM.

START-OF-SELECTION.
  WRITE / 'Anweisung 2'.
  PERFORM routine.
  WRITE / 'Anweisung 3'.

Die Ausgabe sieht nun so aus:

Anweisung 1

Anweisung 2

Unterprogramm

Anweisung 3

In diesem Programm besteht der Verarbeitungsblock START-OF-SELECTION aus allen Anweisungen, bis auf den Verarbeitungsblock FORM-ENDFORM. Eine lesbarere Form des gleichen Programms sähe so aus:

REPORT demo_abap_events_3.

START-OF-SELECTION.
  WRITE / 'Anweisung 1'.
  WRITE / 'Anweisung 2'.
  PERFORM routine.
  WRITE / 'Anweisung 3'.

FORM routine.
  WRITE / 'Unterprogramm'.
ENDFORM.

Hier könnte man das Ereignisschlüsselwort START-OF-SELECTION auch weglassen.