Ereignisse auslösen und Behandeln bedeuted in ABAP Objects, daß bestimmte Methoden als Auslöser agieren und Ereignisse auslösen, worauf andere Methoden als Behandler reagieren d.h. zum Ereigniszeitpunkt ausgeführt werden.
Dieser Abschnitt gibt einen Überblick über das Arbeiten mit Ereignissen in ABAP Objects. Für genauere Informationen zu den Anweisungen lesen Sie bitte die entsprechende Schlüsselwortdokumentation.
Ereignisse auslösen
Für das Auslösen eines Ereignisses muß eine Klasse
Ereignisse deklarieren
Ereignisse werden im Deklarationsteil einer Klasse oder in einem Interface deklariert. Zum Deklarieren von Instanzereignissen dient die Anweisung
EVENTS <evt> EXPORTING... VALUE(<ei>) TYPE type [OPTIONAL]..
Zum Deklarieren von statischen Ereignissen dient die Anweisung
CLASS-EVENTS <evt>...
Beide Anweisungen haben die gleiche Syntax.
Bei der Ereignisdeklaration können mit dem EXPORTING-Zusatz Parameter definiert werden, die der Auslöser des Ereignisses an den Behandler übergibt. Die Übergabe erfolgt dabei immer als Wert. Intanzereignisse enthalten immer den impliziten Parameter SENDER, der als Referenz auf die Klasse bzw. das Interface typisiert ist, in dem das Ereignis deklariert wird.
Ereignisse auslösen
Wenn eine Klasse ein Instanzereignis enthält, kann jede Instanzmethode der Klasse das Ereignis auslösen. Ein statisches Ereignis kann von jeder Methode ausgelöst werden. Statische Methoden können aber nur statische Ereignisse auslösen. Zum Auslösen eines Ereignisses in Methoden dient die Anweisung
RAISE EVENT <evt> EXPORTING... <ei> = <f i>...
Für sämtliche nicht optionalen Formalparameter <ei> des Ereignisses müssen mit dem EXPORTING-Zusatz Aktualparameter <f i> angegeben werden. An den impliziten Parameter SENDER wird automatisch die Selbstreferenz ME übergeben.
Ereignisse behandeln
Ereignise werden durch spezielle Methoden behandelt. Um ein Ereignis zu behandeln muß eine Methode
Ereignisbehandlermethoden deklarieren
Jede Klasse kann Ereignisbehandlermethoden für Ereignisse anderer Klassen oder Interfaces enthalten. Ereignisbehandlermethoden für Ereignisse der gleichen Klasse sind natürlich auch möglich. Die Deklaration einer Ereignisbehandlermethode erfolgt über
METHODS <meth> FOR EVENT <evt> OF <cif> IMPORTING.. <ei>..
für eine Instanzmethode und mit CLASS-METHODS entsprechend für eine statische Methode. Dabei ist <evt> ein in Klasse bzw. Interface <cif> deklariertes Ereignis.
Die Schnittstelle einer Ereignisbehandlermethode darf nur Formalparameter enthalten, die bei der Deklaration des Ereignisses <evt> definiert wurden. Die Eigenschaften der Parameter werden ebenfalls vom Ereignis übernommen. Die Ereignisbehandlermethode muß aber nicht alle Parameter übernehmen, die mit der Anweisung RAISE EVENT übergeben werden. Falls der implizite Parameter SENDER übernommen werden soll, muß er ebenfalls in der Schnittstelle aufgeführt werden. Dieser Parameter erlaubt es einem Behandler von Instanzereignissen, auf den Auslöser zuzugreifen und ihm beispielsweise Ergebnisse zu übermitteln.
Die Deklaration einer Ereignisbehandlermethode in einer Klasse bedeuted, daß die Instanzen der Klasse, bzw. die Klasse selbst, prinzipiell in der Lage sind, ein Ereignis <evt>, das in einer Methode ausgelöst wird, zu behandeln.
Ereignisbehandlermethoden registrieren
Damit eine Ereignisbehandlermethode auf ein ausgelöstes Ereignis reagiert, d.h. sie wird zum Ereigniszeitpunkt ausgeführt, muß zur Laufzeit festgelegt werden, auf welche Auslöser sie reagieren soll. Dies geschieht mit der Anweisung
SET HANDLER... <hi>... [FOR]...
Diese Anweisung verknüpft eine Liste von Behandlermethoden mit Auslösermethoden. Dabei sind hinsichtlich der ausgelösten Ereignisse vier Fälle zu unterscheiden:
Das Ereignis ist
deklariert ist. Je nach Ereignis ist die Syntax und die Wirkung der Anweisung SET HANDLER unterschiedlich.
Bei Instanzereignissen muß mit dem Zusatz FOR angegeben werden, für welche auslösende Instanz die Behandler registriert werden. Dabei kann entweder genau eine auslösende Instanz mit Hilfe einer Referenzvariablen <ref> angeben werden:
SET HANDLER... <hi>...FOR <ref>.
Oder die Behandler werden für alle Instanzen registriert, die das Ereignis auslösen können:
SET HANDLER... <hi>...FOR ALL INSTANCES.
Diese Registrierung gilt auch für auslösende Instanzen,die zum Zeitpunkt der Registrierung noch gar nicht erzeugt wurden.
Bei statischen Ereignissen darf kein FOR-Zusatz verwendet werden:
SET HANDLER... <hi>...
Die Registrierung gilt automatisch für die gesamte Klasse, bzw. für alle Klassen, die ein Interface mit einem statischen Ereignis implementieren. Bei Interfaces gilt die Registrierung auch für auslösende Klassen, die erst nach dem Zeitpunkt der Registrierung geladen werden.
Zeitpunkt der Behandlung
Nach der Anweisung RAISE EVENT werden erst alle registrierten Behandlermethoden ausgeführt, bevor die nächste Anweisung bearbeitet wird (synchrone Ereignisbehandlung). Wenn eine Behandlermethode selber Ereignisse auslöst, werden erst deren Behandlermethoden ausgeführt, bevor die Programmausführung in der Behandlermethode fortgesetzt wird. Um endlose Rekursionen zu vermeiden ist die maximale Schachtelung von Ereignissen zur Zeit auf 64 beschränkt.
Die Reihenfolge in der die Behandlermethoden ausgeführt werden, richtet sich nach ihrer Registrierung. Da die Registrierung der Behandlermethoden dynamisch erfolgt, sollte man sich bei der synchronen Ereignisbehandlung aber auf keine Reihenfolge verlassen, sondern von der Annahme ausgehen daß alle Behandlermethoden gleichzeitig ausgeführt werden.
Siehe auch:
Übersichtsgrafiken zu Ereignissen Einführendes Beispiel zu Ereignissen Komplexes Beispiel zu Ereignissen