Das folgende Beispiel zeigt die Deklaration, den Aufruf und die Behandlung von Ereignissen in ABAP Objects.
In diesem Beispiel wird mit der unten abgebildeten Interaktiven Liste gearbeitet, auf der Benutzeraktionen zu Ereignissen in ABAP Objects führen. Die Liste und ihre Daten werden in einer Klasse c_list realisiert. Zur Verarbeitung der Benutzeraktionen dient die Klasse status, die zum Zeitpunkt AT USER-COMMAND ein Ereignis button_clicked auslöst. Das Ereignis wird in der Klasse c_list behandelt. Die Klasse c_list enthält pro Listenzeile ein Objekt der Klassen c_ship oder c_truck, die beide das Interface i_vehicle implementieren. Wenn sich die Geschwindigkeit eines dieser Objekte ändert, wird das Ereignis speed_change ausgelöst, auf das wiederum die Klasse c_list reagiert, um die Listenausgabe anzupassen.
Die ABAP-Anweisungen zur Listenverarbeitungen stehen in ABAP Objects noch nicht in vollem Umfang zur Verfügung. Um einfache Testausgaben zu erstellen, können jedoch folgende Anweisungen verwendet werden:
· WRITE [AT] /offset(length) f
· ULINE
· SKIP
· NEW-LINE
Beachten Sie, dass insbesondere die Funktionalität von Aufbereitungsoptionen und interaktiver Listenverarbeitung im derzeitigen Zustand nicht garantiert ist und sich zum nächsten Release inkompatibel ändern kann.
Das Beispiel ist mit lokalen Interfaces und Klassen realisiert. Es folgen die Deklarationen des Interfaces und der verwendeten Klassen:
*****************************************************************
* Interface and Class declarations
*****************************************************************
INTERFACE i_vehicle.
DATA max_speed TYPE i.
EVENTS speed_change EXPORTING VALUE(new_speed) TYPE i.
METHODS: drive,
stop.
ENDINTERFACE.
*----------------------------------------------------------------
CLASS c_ship DEFINITION.
PUBLIC SECTION.
METHODS constructor.
INTERFACES i_vehicle.
PRIVATE SECTION.
ALIASES max FOR i_vehicle~max_speed.
DATA ship_speed TYPE i.
ENDCLASS.
*----------------------------------------------------------------
CLASS c_truck DEFINITION.
PUBLIC SECTION.
METHODS constructor.
INTERFACES i_vehicle.
PRIVATE SECTION.
ALIASES max FOR i_vehicle~max_speed.
DATA truck_speed TYPE i.
ENDCLASS.
*----------------------------------------------------------------
CLASS status DEFINITION.
PUBLIC SECTION.
CLASS-EVENTS button_clicked EXPORTING VALUE(fcode) LIKE sy-ucomm.
CLASS-METHODS: class_constructor,
user_action.
ENDCLASS.
*----------------------------------------------------------------
CLASS c_list DEFINITION.
PUBLIC SECTION.
METHODS: fcode_handler FOR EVENT
button_clicked OF status
IMPORTING fcode,
list_change FOR EVENT speed_change OF i_vehicle
IMPORTING new_speed,
list_output.
PRIVATE SECTION.
DATA: id TYPE i,
ref_ship TYPE REF
TO c_ship,
ref_truck TYPE REF TO
c_truck,
BEGIN OF line,
id TYPE I,
flag(1) TYPE
c,
iref TYPE
REF TO i_vehicle,
speed TYPE i,
END OF LINE,
LIST LIKE SORTED TABLE OF line
WITH UNIQUE KEY id.
ENDCLASS.
*****************************************************************
In diesem Beispiel werden folgende Ereignisse deklariert:
· Das Instanzereignis speed_change im Interface i_vehicle
· Das statische Ereignis button_clicked in der Klasse status.
Die Klasse c_list enthält Ereignisbehandlermethoden für beide Ereignisse.
Beachten Sie, dass die Klasse status keine Attribute enthält und daher nur mit statischen Methoden und Ereignissen arbeitet.
Es folgen die Implementierungen der Methoden obiger Klassen:
*****************************************************************
* Implementations
*****************************************************************
CLASS c_ship IMPLEMENTATION.
METHOD constructor.
max = 30.
ENDMETHOD.
METHOD i_vehicle~drive.
CHECK ship_speed < max.
ship_speed = ship_speed + 10.
RAISE EVENT
i_vehicle~speed_change
EXPORTING
new_speed = ship_speed.
ENDMETHOD.
METHOD i_vehicle~stop.
CHECK ship_speed > 0.
ship_speed = 0.
RAISE EVENT
i_vehicle~speed_change
EXPORTING
new_speed = ship_speed.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------
CLASS c_truck IMPLEMENTATION.
METHOD constructor.
max = 150.
ENDMETHOD.
METHOD i_vehicle~drive.
CHECK truck_speed < max.
truck_speed = truck_speed + 50.
RAISE EVENT
i_vehicle~speed_change
EXPORTING
new_speed = truck_speed.
ENDMETHOD.
METHOD i_vehicle~stop.
CHECK truck_speed > 0.
truck_speed = 0.
RAISE EVENT
i_vehicle~speed_change
EXPORTING
new_speed = truck_speed.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------
CLASS status IMPLEMENTATION.
METHOD class_constructor.
SET pf-status 'VEHICLE'.
WRITE 'Click a button!'.
ENDMETHOD.
METHOD user_action.
RAISE event button_clicked
EXPORTING fcode = sy-ucomm.
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------
CLASS c_list IMPLEMENTATION.
METHOD fcode_handler.
CLEAR line.
CASE fcode.
WHEN 'CREA_SHIP'.
id = id + 1.
CREATE OBJECT ref_ship.
line-id = id.
line-flag = 'c'.
line-iref = ref_ship.
APPEND line TO list.
WHEN 'CREA_TRUCK'.
id = id + 1.
CREATE OBJECT ref_truck.
line-id = id.
line-flag = 'T'.
line-iref = ref_truck.
APPEND line TO list.
WHEN 'DRIVE'.
CHECK sy-lilli > 0.
READ TABLE list INDEX sy-lilli
INTO line.
CALL METHOD
line-iref->drive.
WHEN 'STOP'.
LOOP AT list INTO line.
CALL METHOD
line-iref->stop.
ENDLOOP.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
CALL METHOD list_output.
ENDMETHOD.
METHOD list_change.
line-speed = new_speed.
MODIFY TABLE list FROM line.
ENDMETHOD.
METHOD list_output.
sy-lsind = 0.
SET TITLEBAR 'TIT'.
LOOP AT list INTO line.
IF line-flag = 'C'.
WRITE / icon_ws_ship AS
icon.
ELSEIF line-flag = 'T'.
WRITE / icon_ws_truck AS
icon.
ENDIF.
WRITE: 'Speed = ', line-speed.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
*****************************************************************
Die statische Methode user_action der Klasse status löst das statische Ereignis button_clicked aus. Die Instanzmethoden i_vehicle~drive und i_vehicle~stop lösen das Instanzereignis i_vehicle~speed_change in den Klassen c_ship und c_truck aus.
Das folgende Programm verwendet obige Klassen:
REPORT demo_abap_objects_events NO STANDARD PAGE HEADING.
*****************************************************************
* Global data of program
*****************************************************************
DATA list TYPE REF TO c_list.
*****************************************************************
* Program events
*****************************************************************
START-OF-SELECTION.
CREATE OBJECT list.
SET HANDLER: list->fcode_handler,
list->list_change FOR ALL INSTANCES.
*----------------------------------------------------------------
AT USER-COMMAND.
CALL METHOD status=>user_action.
*****************************************************************
Das Programm erzeugt ein Objekt der Klasse c_list und registriert die Ereignisbehandlermethode fcode_handler dieses Objekts für das Klassenereignis button_clicked der Klasse Status und die Ereignisbehandlermethode list_change für das Ereignis speed_change aller Instanzen, die das Interface i_vehicle implementieren.