
Słowo wstępu: korzystam z bloga zevolving, w mojej ocenie jest on jednym z najczytelniejszych źródeł informacji na temat salv_table.
Szczególnie wygodne jest to, jak do podstawy kodu:
http://zevolving.com/2008/09/salv-table ... e-display/
...można dorzucić kolejne rzeczy, budując własny szablon alv. Dziś chciałbym pochylić się nad obsługą dwóch hotspotów, z którymi mam problem.
Zacznijmy od uruchomienia pierwszego hotspota, dodając do bazy z powyższego linku, odpowiedni kod z linku poniższego:
http://zevolving.com/2008/09/salv-table ... e-hotspot/
"Sklejając" alv z hotspotem wg zevolvingowych wytycznych, otrzymuję w pełni działający kod, który na ten moment ogarnia temat przechwycenia kliknięcia i daje możliwości dalszego rozwoju programu:
Kod: Zaznacz cały
*&---------------------------------------------------------------------*
*& Report Z_SALV_DWA_HOTSPOTY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z_SALV_DWA_HOTSPOTY.
*
*----------------------------------------------------------------------*
* CLASS lcl_report DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
*
PUBLIC SECTION.
*
* Final output table
TYPES: BEGIN OF ty_icon,
NAME TYPE icon-name,
oleng TYPE icon-oleng,
internal TYPE icon-internal,
END OF ty_icon.
*
DATA: t_icon TYPE STANDARD TABLE OF ty_icon.
*
* ALV reference
DATA: o_alv TYPE REF TO cl_salv_table.
*
METHODS:
* data selection
get_data,
*
* Generating output
generate_output.
*
*$*$*.....CODE_ADD_1 - Begin..................................1..*$*$*
*
* In this section we will define the private methods which can
* be implemented to set the properties of the ALV and can be
* called in the
PRIVATE SECTION.
* Set the various column properties
METHODS:
set_hotspot_name
CHANGING
co_alv TYPE REF TO cl_salv_table
co_report TYPE REF TO lcl_report.
*
* Event Handler for HOTSPOT event
METHODS:
on_link_click_name
FOR EVENT link_click OF cl_salv_events_table
IMPORTING
row
column .
*
*$*$*.....CODE_ADD_1 - End....................................1..*$*$*
*
ENDCLASS. "lcl_report DEFINITION
*
*
START-OF-SELECTION.
DATA: lo_report TYPE REF TO lcl_report.
*
CREATE OBJECT lo_report.
*
lo_report->get_data( ).
*
lo_report->generate_output( ).
*
*----------------------------------------------------------------------*
* CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
*
METHOD get_data.
* data selection
SELECT NAME oleng internal
INTO TABLE t_icon
FROM icon
UP TO 20 ROWS.
*
ENDMETHOD. "get_data
*
*.......................................................................
METHOD generate_output.
* New ALV instance
* We are calling the static Factory method which will give back
* the ALV object reference.
*
* exception class
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = t_icon ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.
*
*$*$*.....CODE_ADD_2 - Begin..................................2..*$*$*
*
* In this area we will call the methods which will set the
* different properties to the ALV
*
* Set Up the Hotspot & Event Handler
CALL METHOD set_hotspot_name
CHANGING
co_alv = o_alv
co_report = lo_report.
*$*$*.....CODE_ADD_2 - End....................................2..*$*$*
*
*
* Displaying the ALV
* Here we will call the DISPLAY method to get the output on the screen
o_alv->display( ).
*
ENDMETHOD. "generate_output
*
*$*$*.....CODE_ADD_3 - Begin..................................3..*$*$*
*
* In this area we will implement the methods which are defined in
* the class definition
METHOD set_hotspot_name.
*
*...HotSpot
DATA: lo_cols_tab TYPE REF TO cl_salv_columns_table,
lo_col_tab TYPE REF TO cl_salv_column_table.
*
* get Columns object
lo_cols_tab = co_alv->get_columns( ).
*
* Get VBELN column
TRY.
lo_col_tab ?= lo_cols_tab->get_column( 'NAME' ).
CATCH cx_salv_not_found.
ENDTRY.
*
* Set the HotSpot for VBELN Column
TRY.
CALL METHOD lo_col_tab->set_cell_type
EXPORTING
value = if_salv_c_cell_type=>hotspot.
.
CATCH cx_salv_data_error .
ENDTRY.
*
*...Events
DATA: lo_events TYPE REF TO cl_salv_events_table.
*
* all events
lo_events = o_alv->get_event( ).
*
* event handler
SET HANDLER co_report->on_link_click_name FOR lo_events.
*
ENDMETHOD. "set_hotspot_vbeln
*
* Handles the UI on the VBELN (HotSpot)
METHOD on_link_click_name.
*
DATA: la_icon TYPE ty_icon.
*
* Get the Sales Order number from the table
READ TABLE lo_report->t_icon INTO la_icon INDEX row.
IF la_icon-name IS NOT INITIAL.
MESSAGE i398(00) WITH 'You have selected' la_icon-name.
ENDIF.
*
ENDMETHOD. "on_link_click
*$*$*.....CODE_ADD_3 - End....................................3..*$*$*
*
*
ENDCLASS. "lcl_report IMPLEMENTATION
Teraz zabłysnę nieznajomością OO, przez którą nie jestem w stanie zrozumieć, co źle robię.
By obsłużyć kolumnę OLENG, tworzę dwie metody: set_hotspot_oleng i on_link_click_oleng.
Kod: Zaznacz cały
* Set the various column properties
METHODS:
set_hotspot_oleng
CHANGING
co_alv TYPE REF TO cl_salv_table
co_report TYPE REF TO lcl_report.
*
* Event Handler for HOTSPOT event
METHODS:
on_link_click_oleng
FOR EVENT link_click OF cl_salv_events_table
IMPORTING
row
column .
Dorzucam także wywołanie metody set_hotspot_oleng, by hotspot ogólnie "ruszył":
Kod: Zaznacz cały
CALL METHOD set_hotspot_oleng
CHANGING
co_alv = o_alv
co_report = lo_report.
Kod: Zaznacz cały
METHOD set_hotspot_oleng.
*
*...HotSpot
DATA: lo_cols_tab TYPE REF TO cl_salv_columns_table,
lo_col_tab TYPE REF TO cl_salv_column_table.
*
* get Columns object
lo_cols_tab = co_alv->get_columns( ).
*
* Get VBELN column
TRY.
lo_col_tab ?= lo_cols_tab->get_column( 'OLENG' ).
CATCH cx_salv_not_found.
ENDTRY.
*
* Set the HotSpot for VBELN Column
TRY.
CALL METHOD lo_col_tab->set_cell_type
EXPORTING
value = if_salv_c_cell_type=>hotspot.
.
CATCH cx_salv_data_error .
ENDTRY.
*
*...Events
DATA: lo_events TYPE REF TO cl_salv_events_table.
*
* all events
lo_events = o_alv->get_event( ).
*
* event handler
SET HANDLER co_report->on_link_click_oleng FOR lo_events.
*
ENDMETHOD.
Kod: Zaznacz cały
METHOD on_link_click_oleng.
*
DATA: la_icon TYPE ty_icon.
*
* Get the Sales Order number from the table
READ TABLE lo_report->t_icon INTO la_icon INDEX row.
IF la_icon-oleng IS NOT INITIAL.
MESSAGE i398(00) WITH 'You have selected' la_icon-oleng.
ENDIF.
*
ENDMETHOD.
Kod: Zaznacz cały
*&---------------------------------------------------------------------*
*& Report Z_SALV_DWA_HOTSPOTY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z_SALV_DWA_HOTSPOTY.
*
*----------------------------------------------------------------------*
* CLASS lcl_report DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
*
PUBLIC SECTION.
*
* Final output table
TYPES: BEGIN OF ty_icon,
NAME TYPE icon-name,
oleng TYPE icon-oleng,
internal TYPE icon-internal,
END OF ty_icon.
*
DATA: t_icon TYPE STANDARD TABLE OF ty_icon.
*
* ALV reference
DATA: o_alv TYPE REF TO cl_salv_table.
*
METHODS:
* data selection
get_data,
*
* Generating output
generate_output.
*
*$*$*.....CODE_ADD_1 - Begin..................................1..*$*$*
*
* In this section we will define the private methods which can
* be implemented to set the properties of the ALV and can be
* called in the
PRIVATE SECTION.
* Set the various column properties
METHODS:
set_hotspot_name
CHANGING
co_alv TYPE REF TO cl_salv_table
co_report TYPE REF TO lcl_report.
*
* Event Handler for HOTSPOT event
METHODS:
on_link_click_name
FOR EVENT link_click OF cl_salv_events_table
IMPORTING
row
column .
*************************************************
* Set the various column properties
METHODS:
set_hotspot_oleng
CHANGING
co_alv TYPE REF TO cl_salv_table
co_report TYPE REF TO lcl_report.
*
* Event Handler for HOTSPOT event
METHODS:
on_link_click_oleng
FOR EVENT link_click OF cl_salv_events_table
IMPORTING
row
column .
*
*$*$*.....CODE_ADD_1 - End....................................1..*$*$*
*
ENDCLASS. "lcl_report DEFINITION
*
*
START-OF-SELECTION.
DATA: lo_report TYPE REF TO lcl_report.
*
CREATE OBJECT lo_report.
*
lo_report->get_data( ).
*
lo_report->generate_output( ).
*
*----------------------------------------------------------------------*
* CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
*
METHOD get_data.
* data selection
SELECT NAME oleng internal
INTO TABLE t_icon
FROM icon
UP TO 20 ROWS.
*
ENDMETHOD. "get_data
*
*.......................................................................
METHOD generate_output.
* New ALV instance
* We are calling the static Factory method which will give back
* the ALV object reference.
*
* exception class
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = t_icon ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.
*
*$*$*.....CODE_ADD_2 - Begin..................................2..*$*$*
*
* In this area we will call the methods which will set the
* different properties to the ALV
*
* Set Up the Hotspot & Event Handler
CALL METHOD set_hotspot_name
CHANGING
co_alv = o_alv
co_report = lo_report.
CALL METHOD set_hotspot_oleng
CHANGING
co_alv = o_alv
co_report = lo_report.
*$*$*.....CODE_ADD_2 - End....................................2..*$*$*
*
*
* Displaying the ALV
* Here we will call the DISPLAY method to get the output on the screen
o_alv->display( ).
*
ENDMETHOD. "generate_output
*
*$*$*.....CODE_ADD_3 - Begin..................................3..*$*$*
*
* In this area we will implement the methods which are defined in
* the class definition
METHOD set_hotspot_name.
*
*...HotSpot
DATA: lo_cols_tab TYPE REF TO cl_salv_columns_table,
lo_col_tab TYPE REF TO cl_salv_column_table.
*
* get Columns object
lo_cols_tab = co_alv->get_columns( ).
*
* Get VBELN column
TRY.
lo_col_tab ?= lo_cols_tab->get_column( 'NAME' ).
CATCH cx_salv_not_found.
ENDTRY.
*
* Set the HotSpot for VBELN Column
TRY.
CALL METHOD lo_col_tab->set_cell_type
EXPORTING
value = if_salv_c_cell_type=>hotspot.
.
CATCH cx_salv_data_error .
ENDTRY.
*
*...Events
DATA: lo_events TYPE REF TO cl_salv_events_table.
*
* all events
lo_events = o_alv->get_event( ).
*
* event handler
SET HANDLER co_report->on_link_click_name FOR lo_events.
*
ENDMETHOD. "set_hotspot_vbeln
METHOD set_hotspot_oleng.
*
*...HotSpot
DATA: lo_cols_tab TYPE REF TO cl_salv_columns_table,
lo_col_tab TYPE REF TO cl_salv_column_table.
*
* get Columns object
lo_cols_tab = co_alv->get_columns( ).
*
* Get VBELN column
TRY.
lo_col_tab ?= lo_cols_tab->get_column( 'OLENG' ).
CATCH cx_salv_not_found.
ENDTRY.
*
* Set the HotSpot for VBELN Column
TRY.
CALL METHOD lo_col_tab->set_cell_type
EXPORTING
value = if_salv_c_cell_type=>hotspot.
.
CATCH cx_salv_data_error .
ENDTRY.
*
*...Events
DATA: lo_events TYPE REF TO cl_salv_events_table.
*
* all events
lo_events = o_alv->get_event( ).
*
* event handler
SET HANDLER co_report->on_link_click_oleng FOR lo_events.
*
ENDMETHOD.
METHOD on_link_click_oleng.
*
DATA: la_icon TYPE ty_icon.
*
* Get the Sales Order number from the table
READ TABLE lo_report->t_icon INTO la_icon INDEX row.
IF la_icon-oleng IS NOT INITIAL.
MESSAGE i398(00) WITH 'You have selected' la_icon-oleng.
ENDIF.
*
ENDMETHOD.
*
* Handles the UI on the VBELN (HotSpot)
METHOD on_link_click_name.
*
DATA: la_icon TYPE ty_icon.
*
* Get the Sales Order number from the table
READ TABLE lo_report->t_icon INTO la_icon INDEX row.
IF la_icon-name IS NOT INITIAL.
MESSAGE i398(00) WITH 'You have selected' la_icon-name.
ENDIF.
*
ENDMETHOD. "on_link_click
*$*$*.....CODE_ADD_3 - End....................................3..*$*$*
*
*
ENDCLASS. "lcl_report IMPLEMENTATION
Czy może mi ktoś wyjaśnić, dlaczego tak się dzieje i jak sobie z tym poradzić?