handle-double-click-on-alv-by-cl_salv_table-events

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.

返回ABAP参考资料列表