CLASS lcl_event_handle DEFINITION.
PUBLIC SECTION.
METHODS : hndl_double_click FOR EVENT double_click
OF cl_salv_events_table
IMPORTING row
column.
ENDCLASS.
CLASS lcl_event_handle IMPLEMENTATION.
METHOD hndl_double_click.
MESSAGE ‘Row clicked.’ TYPE ‘I’ .
ENDMETHOD.
ENDCLASS.
CLASS lcl_salv_tab DEFINITION.
PUBLIC SECTION.
CLASS-METHODS : main IMPORTING
i_list TYPE xfeld
i_grid TYPE xfeld
i_alv_tb TYPE c,
fetch_records,
get_alv_instance IMPORTING
i_list TYPE xfeld
i_grid TYPE xfeld
i_alv_tb TYPE c,
display_alv.
PRIVATE SECTION.
TYPE-POOLS : icon, sym.
TYPES : BEGIN OF ty_flight,
status TYPE c LENGTH 1,
icon TYPE icon_d, ” char – 4
symbol TYPE icon_d. ” char – 4
INCLUDE TYPE sflight.
TYPES : END OF ty_flight.
CLASS-DATA : lt TYPE TABLE OF ty_flight,
ls TYPE ty_flight,
lo_salv_tab TYPE REF TO cl_salv_table,
lo_func TYPE REF TO cl_salv_functions_list,
lo_cols TYPE REF TO cl_salv_columns_table,
lo_col TYPE REF TO cl_salv_column,
lo_col_icon TYPE REF TO cl_salv_column,
lo_icon TYPE REF TO cl_salv_column_table,
lo_col_sym TYPE REF TO cl_salv_column,
lo_symbol TYPE REF TO cl_salv_column_table,
rem_seat TYPE i,
lt_icon TYPE TABLE OF icon,
ls_icon TYPE icon,
lo_event TYPE REF TO cl_salv_events_table,
lo_handle TYPE REF TO lcl_event_handle .
ENDCLASS.
CLASS lcl_salv_tab IMPLEMENTATION.
METHOD main.
fetch_records( ).
CREATE OBJECT lo_handle.
get_alv_instance( EXPORTING i_list = i_list
i_grid = i_grid
i_alv_tb = i_alv_tb ).
CALL METHOD lo_salv_tab->get_event
RECEIVING
value = lo_event. “Get all the Events of the table
SET HANDLER lo_handle->hndl_double_click FOR lo_event.
display_alv( ).
ENDMETHOD.
METHOD fetch_records.
DATA indx TYPE sy-tabix.
DATA line TYPE i.
SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE lt UP TO 40 ROWS.
line = LINES( lt ).
SELECT * FROM icon INTO TABLE lt_icon UP TO line ROWS.
LOOP AT lt INTO ls.
indx = sy-tabix.
rem_seat = ls-seatsmax_b – ls-seatsocc_b.
IF rem_seat = 0.
ls-status = 1 .
ELSEIF rem_seat LE 10.
ls-status = 2.
ELSE.
ls-status = 3.
ENDIF.
ls-symbol = sym_caution.
READ TABLE lt_icon INTO ls_icon INDEX indx .
IF sy-subrc = 0.
ls-icon = ls_icon-id.
ENDIF.
IF indx <> 0.
MODIFY LT FROM ls INDEX indx TRANSPORTING status icon symbol .
ENDIF.
CLEAR ls.
ENDLOOP.
ENDMETHOD.
METHOD get_alv_instance.
DATA : flag.
IF i_list = ‘X’ OR i_grid = ‘X’.
IF i_list = ‘X’.
flag = ‘X’.
ELSE.
flag = ‘ ‘.
ENDIF.
TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
list_display = flag
IMPORTING
r_salv_table = lo_salv_tab
CHANGING
t_table = lt.
IF i_alv_tb = abap_true.
**Begin- Displaying toolbar on alv **
CALL METHOD lo_salv_tab->get_functions ” Get the instance of “alv toolbal button
RECEIVING
value = lo_func.
CALL METHOD lo_func->set_default ” pass ‘TRUE’ to display “toobar on alv
EXPORTING
value = if_salv_c_bool_sap=>true.
**End- Displaying toolbar on alv**
ENDIF.
** Begin – Hides paritular column of the table in the list or grid**
CALL METHOD lo_salv_tab->get_columns
RECEIVING
value = lo_cols.
TRY.
CALL METHOD lo_cols->get_column
EXPORTING
columnname = ‘MANDT’
RECEIVING
value = lo_col.
CALL METHOD lo_col->set_technical
EXPORTING
value = if_salv_c_bool_sap=>true.
CATCH cx_salv_not_found .
ENDTRY.
** End – Hides paritular column of the table in the list or grid**
** Begin – Set status field as traffic icon **
TRY.
CALL METHOD lo_cols->set_exception_column
EXPORTING
value = ‘STATUS’.
CATCH cx_salv_data_error .
ENDTRY.
**End – Set status field as traffic icon **
**Begin – Set icon for the column ICON**
TRY.
CALL METHOD lo_cols->get_column
EXPORTING
columnname = ‘ICON’
RECEIVING
value = lo_col_icon.
lo_icon ?= lo_col_icon.
CALL METHOD lo_icon->set_icon
EXPORTING
value = if_salv_c_bool_sap=>true.
CALL METHOD lo_icon->set_long_text
EXPORTING
value = ‘Icon’.
CATCH cx_salv_not_found .
ENDTRY.
**End – Set icon for the column ICON**
**Start- Symbol**
TRY.
CALL METHOD lo_cols->get_column
EXPORTING
columnname = ‘SYMBOL’
RECEIVING
value = lo_col_sym.
lo_symbol ?= lo_col_sym.
CALL METHOD lo_symbol->set_symbol
EXPORTING
value = if_salv_c_bool_sap=>true .
CALL METHOD lo_symbol->set_long_text
EXPORTING
value = ‘Symbol’. ” Column name set
CATCH cx_salv_not_found .
ENDTRY.
**End symbol**
CATCH cx_salv_msg .
ENDTRY.
ENDIF.
ENDMETHOD.
METHOD display_alv.
CALL METHOD lo_salv_tab->display.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS : list RADIOBUTTON GROUP g1,
grid RADIOBUTTON GROUP g1,
alv_tool AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b1.
CALL METHOD lcl_salv_tab=>main EXPORTING
i_list = list
i_grid = grid
i_alv_tb = alv_tool.
Step2.
Step3. Double click on any line line.
Step4. Here is the event output.
How to Add button and hotspot in ALV OOPS
*&---------------------------------------------------------------------*
*& Report YKC_OOPS_ALV *
*& *
*&---------------------------------------------------------------------*
*& Learn how to make ALV through OOPS
*
*& How to add hotspot, & buttons
*& Author: Krishna, Prepared on 6 Nov 08
*&---------------------------------------------------------------------*
REPORT ykc_oops_alv .
TABLES: mara.
DATA: BEGIN OF it_tab OCCURS 0,
matnr LIKE mara-matnr,
ersda LIKE mara-ersda, "creation date
ernam LIKE mara-ernam, "person created
pstat LIKE mara-pstat, "maint stat
lvorm LIKE mara-lvorm, "flg for deletion
mtart LIKE mara-mtart, "mat type
meins LIKE mara-meins, "uom
END OF it_tab.
DATA: wa_it_tab LIKE LINE OF it_tab.
CLASS lcl_events_d0100 DEFINITION DEFERRED.
DATA gr_events_d0100 TYPE REF TO lcl_events_d0100.
*---------------------------------------------------------------------*
* CLASS lcl_events_d0100 DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_events_d0100 DEFINITION.
PUBLIC SECTION.
METHODS:
double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row
e_column,
handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING
e_row_id
e_column_id
es_row_no
sender,
*---code addition for ALV pushbuttons
*--for placing buttons
handle_toolbar_set
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING
e_object
e_interactive,
*---user command on clicking a button
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING
e_ucomm.
ENDCLASS. "lcl_events_d0100 DEFINITION
TYPE-POOLS cndp.
* custom container
DATA container TYPE REF TO cl_gui_custom_container.
** Definition of Control Framework
*CLASS cl_gui_cfw DEFINITION LOAD.
*----------------------------------------------------------------------*
* LOCAL VARIABLE
*----------------------------------------------------------------------*
DATA ok_code TYPE sy-ucomm.
*----------------------------------------------------------------------*
* FOR VARIANT
*----------------------------------------------------------------------*
DATA st_var TYPE disvariant .
DATA save TYPE c.
st_var-report = 'YKC_OOPS_ALV'.
save = 'A'.
*----------------------------------------------------------------------*
* FOR LAYOUT
*----------------------------------------------------------------------*
DATA loyo TYPE lvc_s_layo.
loyo-zebra = 'X'.
loyo-detailinit = 'X'.
loyo-info_fname = 'RED'.
*----------------------------------------------------------------------*
* FOR FIELD CATALOG
*----------------------------------------------------------------------*
DATA fcat TYPE lvc_t_fcat.
DATA wa_fcat LIKE LINE OF fcat.
DATA ref_container TYPE REF TO cl_gui_custom_container.
DATA ref_grid TYPE REF TO cl_gui_alv_grid.
*Declaration for toolbar buttons
*---FOR FIELD CATALOG
DATA : ty_toolbar TYPE stb_button.
DATA : e_object TYPE REF TO cl_alv_event_toolbar_set,
io_alv_toolbar TYPE REF TO cl_alv_event_toolbar_set.
"Alv toolbar
DATA: event_receiver1 TYPE REF TO lcl_events_d0100.
CREATE OBJECT ref_container
EXPORTING
container_name = 'CONTAINER'.
CREATE OBJECT ref_grid
EXPORTING
i_parent = ref_container.
*---------------------------------------------------------------------*
* CLASS lcl_events_d0100 IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_events_d0100 IMPLEMENTATION.
*---------------------------------------------------------------------*
* METHOD double_click *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
METHOD double_click.
* PERFORM d0100_event_double_click USING e_row
* e_column .
*---remember when using double click hotspot will not work
ENDMETHOD. "double_click
*---method for hotspot
METHOD handle_hotspot_click.
DATA: ls_col_id TYPE lvc_s_col.
READ TABLE it_tab INTO wa_it_tab
INDEX e_row_id-index.
IF sy-subrc = 0.
CHECK ( wa_it_tab-lvorm IS NOT INITIAL ).
CASE e_column_id-fieldname.
WHEN 'LVORM'.
LEAVE PROGRAM.
WHEN OTHERS.
* do nothing
ENDCASE.
CALL METHOD ref_grid->set_current_cell_via_id
EXPORTING
is_row_id = e_row_id
is_column_id = ls_col_id.
ENDIF.
ENDMETHOD. "handle_hotspot_click
*---method for handling toolbar
METHOD handle_toolbar_set.
CLEAR ty_toolbar.
CLEAR ty_toolbar.
ty_toolbar-function = 'LEAVE'. "name of btn to catch click
ty_toolbar-butn_type = 0.
ty_toolbar-text = 'EXIT'.
APPEND ty_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar_set
METHOD handle_user_command.
DATA: wr_data_changed TYPE REF TO cl_alv_changed_data_protocol.
DATA: lt_rows TYPE lvc_t_row,
lt_index TYPE lvc_s_row-index.
CASE e_ucomm.
WHEN 'LEAVE'.
LEAVE PROGRAM.
ENDCASE.
ENDMETHOD. "handle_user_command
ENDCLASS. "lcl_events_d0100 IMPLEMENTATION
START-OF-SELECTION.
PERFORM get_data.
PERFORM field_catalog.
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text : getting data into internal table
*----------------------------------------------------------------------*
FORM get_data .
SELECT matnr ersda ernam pstat lvorm mtart meins
INTO TABLE it_tab
FROM mara
WHERE lvorm = 'X'.
ENDFORM. " get_data
*&---------------------------------------------------------------------*
*& Form field_catalog
*&---------------------------------------------------------------------*
FORM field_catalog .
REFRESH fcat.
DATA: lv_pos TYPE i.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'MATNR'.
wa_fcat-coltext = 'Material No'.
wa_fcat-col_pos = lv_pos.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'ERSDA'.
wa_fcat-coltext = 'Creation Date'.
wa_fcat-col_pos = lv_pos.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'ERNAM'.
wa_fcat-coltext = 'Person Created'.
wa_fcat-col_pos = lv_pos.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'PSTAT'.
wa_fcat-coltext = 'Maint Stat'.
wa_fcat-col_pos = lv_pos.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'LVORM'.
wa_fcat-coltext = 'Flag For Deletion'.
wa_fcat-col_pos = lv_pos.
wa_fcat-hotspot = 'X'.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'MTART'.
wa_fcat-coltext = 'Material Type'.
wa_fcat-col_pos = lv_pos.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
lv_pos = lv_pos + 1.
wa_fcat-fieldname = 'MEINS'.
wa_fcat-coltext = 'UOM'.
wa_fcat-col_pos = lv_pos.
wa_fcat-outputlen = 18.
APPEND wa_fcat TO fcat.
CLEAR wa_fcat.
* CREATE OBJECT gr_events_d0100.
* SET HANDLER gr_events_d0100->double_click FOR ref_grid.
CREATE OBJECT event_receiver1.
*set even handlers
SET HANDLER event_receiver1->handle_toolbar_set FOR ref_grid.
SET HANDLER event_receiver1->handle_user_command FOR ref_grid.
SET HANDLER event_receiver1->handle_hotspot_click FOR ref_grid.
*----------------------------------------------------------------------*
* ALV GRID DISPLAY
*----------------------------------------------------------------------*
CALL METHOD ref_grid->set_table_for_first_display
EXPORTING
is_variant = st_var
i_save = save
is_layout = loyo
CHANGING
it_outtab = it_tab[]
it_fieldcatalog = fcat.
CALL SCREEN 100.
ENDFORM. " field_catalog
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
CREATE OBJECT gr_events_d0100.
SET HANDLER gr_events_d0100->double_click
FOR ref_grid.
SET PF-STATUS 'S100'.
SET TITLEBAR 'XXX'.
* create the custom container
CREATE OBJECT container
EXPORTING
container_name = 'CUSTOM'.
*CALL METHOD cl_gui_cfw=>flush
* EXCEPTIONS
* cntl_system_error = 1
* cntl_error = 2.
* IF sy-subrc <> 0.
** error handling
* ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module exit INPUT
*&---------------------------------------------------------------------*
MODULE exit INPUT.
CASE ok_code.
WHEN 'EXIT' .
CLEAR ok_code.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " exit INPUT
Sample code :
* To make a field as hot spot.
CLEAR ls_fldcat.
ls_fldcat-fieldname = 'KUNNR'.
ls_fldcat-col_pos = '4'.
ls_fldcat-coltext = text-t05.
ls_fldcat-hotspot = 'X'.
ls_fldcat-intlen = 10.
APPEND ls_fldcat TO lt_fldcat.
Then call the HOTSPOT event
* Handle hotspot_click event for grid
METHODS : handle_hotspot_click FOR EVENT hotspot_click OF
cl_gui_alv_grid
IMPORTING
e_row_id e_column_id es_row_no.
* Event handler method for hotspot_click event
METHOD handle_hotspot_click.
CLEAR ls_final.
READ TABLE lt_final
INTO ls_final
INDEX e_row_id-index.
IF sy-subrc EQ 0.
CALL TRANSACTION 'VA01'. <----- Which ever you want to call..
ENDIF.
ENDMETHOD.
Before calling 'SET_TABLE_FOR_FIRST_DISPLAY'
IF NOT lt_final[] IS INITIAL.
SET HANDLER o_event_receiver->handle_hotspot_click FOR
gr_alv_grid_100.
CALL METHOD gr_alv_grid_100->set_table_for_first_display
EXPORTING
is_layout = ls_layo
CHANGING
it_outtab = lt_final[]
it_fieldcatalog = lt_fldcat[].
ENDIF.