09-21-2008 4:10 PM
Hi,
i try to follow this code and i miss something,
why after the commend :
SET HANDLER: list-> fcode_handler,
see below
the go to the class status and not fcode handler ?
REPORT zztest_events.
TYPE-POOLS: icon.
*****************************************************************
* 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. "I_VEHICLE
*----------------------------------------------------------------
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. "C_SHIP DEFINITION
*----------------------------------------------------------------
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. "C_TRUCK DEFINITION
*----------------------------------------------------------------
CLASS status DEFINITION.
PUBLIC SECTION.
CLASS-EVENTS button_clicked EXPORTING value(fcode) LIKE sy-ucomm.
CLASS-METHODS: class_constructor,
user_action.
ENDCLASS. "STATUS DEFINITION
*----------------------------------------------------------------
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,
iref TYPE REF TO i_vehicle,
speed TYPE i,
END OF line,
list LIKE SORTED TABLE OF line WITH UNIQUE KEY id.
ENDCLASS. "C_LIST DEFINITION
*****************************************************************
*****************************************************************
* Implementations
*****************************************************************
CLASS c_ship IMPLEMENTATION.
METHOD constructor.
max = 30.
ENDMETHOD. "CONSTRUCTOR
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. "I_VEHICLE~DRIVE
METHOD i_vehicle~stop.
CHECK ship_speed > 0.
ship_speed = 0.
RAISE EVENT i_vehicle~speed_change
EXPORTING new_speed = ship_speed.
ENDMETHOD. "I_VEHICLE~STOP
ENDCLASS. "C_SHIP IMPLEMENTATION
*----------------------------------------------------------------
CLASS c_truck IMPLEMENTATION.
METHOD constructor.
max = 150.
ENDMETHOD. "CONSTRUCTOR
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. "I_VEHICLE~DRIVE
METHOD i_vehicle~stop.
CHECK truck_speed > 0.
truck_speed = 0.
RAISE EVENT i_vehicle~speed_change
EXPORTING new_speed = truck_speed.
ENDMETHOD. "I_VEHICLE~STOP
ENDCLASS. "C_TRUCK IMPLEMENTATION
*----------------------------------------------------------------
CLASS status IMPLEMENTATION.
METHOD class_constructor.
SET PF-STATUS 'VEHICLE'.
WRITE 'Click a button!'.
ENDMETHOD. "CLASS_CONSTRUCTOR
METHOD user_action.
RAISE EVENT button_clicked EXPORTING fcode = sy-ucomm.
ENDMETHOD. "USER_ACTION
ENDCLASS. "STATUS IMPLEMENTATION
*----------------------------------------------------------------
CLASS c_list IMPLEMENTATION.
METHOD fcode_handler .
CLEAR line.
REPLACE ALL OCCURRENCES OF '/' in fcode with ''.
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. "FCODE_HANDLER
METHOD list_change .
line-speed = new_speed.
MODIFY TABLE list FROM line.
ENDMETHOD. "LIST_CHANGE
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. "LIST_OUTPUT
ENDCLASS. "C_LIST IMPLEMENTATION
*****************************************************************
*****************************************************************
* 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.
Regards
09-22-2008 10:16 AM
Hi Uwe,
Thanks,
i think u miss understood me ,
i wont to ask why in the program the code :
SET HANDLER: list-> fcode_handler,
go to class status and not fcode handler like u call to method(e.g. if i have method fcode_handler in class list)
Regards
09-21-2008 7:06 PM
Hello Ricardo
I assume you are mixing up application toolbar buttons (defined with the GUI-status ) and buttons on the ALV grid.
When you click an application button then you trigger PAI of the screen.
When you click a button on the ALV grid (i.e. the cells of one column are displayed as buttons) this triggers event BUTTON_CLICKED which will then be handled by FCODE_HANDLER.
Regards
Uwe
09-22-2008 10:16 AM
Hi Uwe,
Thanks,
i think u miss understood me ,
i wont to ask why in the program the code :
SET HANDLER: list-> fcode_handler,
go to class status and not fcode handler like u call to method(e.g. if i have method fcode_handler in class list)
Regards
09-22-2008 11:40 AM
09-22-2008 12:55 PM
Hi Uwe,
Sorry if i dont explain my self well,
i want to learn about events in oo and i copy this code and follow in the debugger ,
what i dont understand is that when i push f5 on commend:
list-> fcode_handler
the debugger jump to class status and not to fcode_handler.
Regards
09-23-2008 3:33 AM
Hello Ricardo
I have to excuse for not studying your coding carefully enough. I assume it is a sample report from the ABAP Objects book (by Horst Keller).
To be honest I believe this sample report will confuse you more than it will help you to understand event handling in ABAP-OO.
All ok-codes (like CREA_SHIP, DRIVE, etc.) trigger the list-processing event AT USER-COMMAND. Here the static method
AT USER-COMMAND.
CALL METHOD status=>user_action.
is called.
Within USER_ACTION the class-event BUTTON_CLICKED is triggered:
METHOD user_action.
RAISE EVENT button_clicked EXPORTING fcode = sy-ucomm.
ENDMETHOD. "USER_ACTION
This static event is handled by the instance method FCODE_HANDLER of class C_LIST.
Now let us assume the ok-code = 'DRIVE' has been executed. Within FCODE_HANDLER the corresponding action is executed:
METHOD fcode_handler .
CLEAR line.
REPLACE ALL OCCURRENCES OF '/' IN fcode WITH ''.
CASE fcode.
WHEN 'CREA_SHIP'.
...
WHEN 'DRIVE'.
CHECK sy-lilli > 0.
READ TABLE list INDEX sy-lilli INTO line.
CALL METHOD line-iref->drive.
WHEN 'STOP'.
...
ENDCASE.
CALL METHOD list_output.
ENDMETHOD. "FCODE_HANDLER
The ok-code = 'DRIVE' eventually causes that the DRIVE method of instance LINE-IREF is called.
The instance "knows" whether it is a truck or a ship and calls the corresponding method, i.e. i_vehicle~drive:
METHOD i_vehicle~drive.
CHECK ship_speed < max.
ship_speed = ship_speed + 10.
RAISE EVENT i_vehicle~speed_change
EXPORTING new_speed = ship_speed. " 'true' event raising / handling
ENDMETHOD. "I_VEHICLE~DRIVE
Now within the DRIVE method I see for the first time the "normal" event raising / handling that I am used to. The method has increased the speed thereby raising event SPEED_CHANGE.
Is there anybody "interested" in this event (i.e. do we have a listener for it)?
Answer: Yes, the C_LIST class needs to handle this event because it must change the list output.
METHOD list_change .
line-speed = new_speed.
MODIFY TABLE list FROM line.
ENDMETHOD. "LIST_CHANGE
In order to study "simple" examples of ALV grid event handling you may search the SDN for my sample reports (all of which begin with ZUS_SDN_...). In contrast to the BCALV_... sample reports I believe my reports are easier to understand.
Regards
Uwe
09-23-2008 1:56 PM
09-22-2008 2:05 PM
Hi Ricardo,
In Class STATUS you had CLASS-EVENTS button_clicked (mentioned static Event) which would be the
first one to get triggered first. As CLASS METHOD or the CLASS EVENTS are the one which gets
triggered first. So the control is pointed to STATUS class.. Try commenting that class and you will end up
triggering the c_list where the fcode_handler.
Hope this would help you.
Good luck
Narin