Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Event Link_click

Former Member
0 Likes
7,759

Hello!!

I have a problem because when I click on the button-luggweight. I can't see any message so my program can't detect any event.

I think that in my code I forget something but I don't know what. Anybody can help me, please?

ZBC405_INCLUDE_CLASS

CLASS LCL_HANDLER DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
    ON_LINK_CLICK
    FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
    IMPORTING
       ROW
       COLUMN.
ENDCLASS.  
CLASS LCL_HANDLER IMPLEMENTATION.
  METHOD ON_LINK_CLICK.
    CASE COLUMN.
      WHEN 'LUGGWEIGHT'.
        MESSAGE I041.
ENDCASE.
ENDMETHOD.
ENDCLASS.

_____________________________________

ZBC405_05_COLUM_TOP

TABLES: SBOOK,SCARR,SFLIGHT.
TYPE-POOLS: COL,ICON.

TYPES: BEGIN OF ST_BOOK.
        INCLUDE STRUCTURE SBOOK.

TYPES:  IT_CELL_TYPES TYPE SALV_T_INT4_COLUMN,
        IT_HYPERLINK TYPE SALV_T_INT4_COLUMN,
        URL TYPE SERVICE_RL,
        END OF ST_BOOK.
DATA: IT_BOOK TYPE TABLE OF ST_BOOK.
DATA: WA_BOOK LIKE LINE OF IT_BOOK,
          WA_CELL_TYPES LIKE LINE OF WA_BOOK-IT_CELL_TYPES.
DATA: GR_ALV TYPE REF TO CL_SALV_TABLE,
      LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE,
      LR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE.

__________________________________________________________

ZBC405_05_COLUMN_PROGRAM

SELECT * FROM SBOOK INTO CORRESPONDING FIELDS OF WA_BOOK
                      WHERE CARRID = M_CARRID.
    INSERT WA_BOOK INTO TABLE IT_BOOK.
  ENDSELECT.
CALL METHOD CL_SALV_TABLE=>FACTORY
          EXPORTING
                 LIST_DISPLAY   = IF_SALV_C_BOOL_SAP=>FALSE
*             R_CONTAINER    =
*             CONTAINER_NAME =
           IMPORTING
                 R_SALV_TABLE   = GR_ALV
           CHANGING
                  T_TABLE        = IT_BOOK.
PERFOM PESO.
FORM PESO.

  LOOP AT IT_BOOK INTO WA_BOOK.
    IF WA_BOOK-LUGGWEIGHT = 0
        AND WA_BOOK-WUNIT = 'KG'
        AND WA_BOOK-SMOKER = ' '.

      CLEAR WA_CELL_TYPES.

      WA_CELL_TYPES-COLUMNNAME = 'LUGGWEIGHT'.
      WA_CELL_TYPES-VALUE = IF_SALV_C_CELL_TYPE=><b>BUTTON.</b>
      APPEND WA_CELL_TYPES TO WA_BOOK-IT_CELL_TYPES.
    ENDIF.

    MODIFY IT_BOOK FROM WA_BOOK TRANSPORTING IT_CELL_TYPES.
  ENDLOOP.

  LR_COLUMNS = GR_ALV->GET_COLUMNS( ).
  TRY.
      LR_COLUMNS->SET_CELL_TYPE_COLUMN( VALUE = 'IT_CELL_TYPES' ).
    CATCH CX_SALV_DATA_ERROR.
  ENDTRY.
  TRY.
      CALL METHOD GR_ALV->GET_EVENT
        RECEIVING
          VALUE = LR_EVENT.
    CATCH CX_SALV_DATA_ERROR.
  ENDTRY.
    SET HANDLER LCL_HANDLER=>ON_LINK_CLICK
  FOR LR_EVENT.



ENDFORM.                    "PESO

thanks a lot.

1 ACCEPTED SOLUTION
Read only

marcelo_ramos1
SAP Mentor
SAP Mentor
0 Likes
3,206

Hi,

Maybe this code be useful for you, it uses events <b>on_link_click</b> and <b>on_double_click</b> and display a field as icon that trigger its events.


REPORT zsalv_event_mar NO STANDARD PAGE HEADING.

INCLUDE <icon>.

*----------------------------------------------------------------------*
*       CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
  PUBLIC SECTION.

    METHODS select_alv IMPORTING amount TYPE i.

    METHODS display_alv.

    METHODS on_link_click
                FOR EVENT link_click OF cl_salv_events_table
                IMPORTING row column.

    METHODS on_double_click
               FOR EVENT double_click OF cl_salv_events_table
               IMPORTING row column.

  PROTECTED SECTION.

    DATA: o_table   TYPE REF TO cl_salv_table,
          o_columns TYPE REF TO cl_salv_columns_table,
          o_column  TYPE REF TO cl_salv_column_table,
          o_events  TYPE REF TO cl_salv_events_table.

    DATA: BEGIN OF s_alv2.
    INCLUDE TYPE alv_tab.
    DATA:   button      TYPE icon_d,
          END   OF s_alv2.

    DATA t_alv2 LIKE TABLE OF s_alv2.

ENDCLASS.                    "lcl_alv DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.

  METHOD select_alv.

    SELECT *
      FROM alv_tab
      INTO CORRESPONDING FIELDS OF TABLE t_alv2
          UP TO amount ROWS.

    LOOP AT t_alv2 INTO s_alv2.
      MOVE icon_oo_class_event TO s_alv2-button.
      MODIFY t_alv2 FROM s_alv2 INDEX sy-tabix.
    ENDLOOP.

  ENDMETHOD.                    "SELECT_ALV

  METHOD display_alv.

    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table = o_table
          CHANGING
            t_table      = t_alv2 ).
      CATCH cx_salv_msg.
    ENDTRY.

    o_columns = o_table->get_columns( ).
    o_columns->set_optimize( abap_true ).

    TRY.
        o_column ?= o_columns->get_column( 'CARRID' ).
        o_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      CATCH cx_salv_not_found.
    ENDTRY.

    TRY.
        o_column ?= o_columns->get_column( 'BUTTON' ).
        o_column->set_icon( if_salv_c_bool_sap=>true ).
        o_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
        o_column->set_long_text( 'My Button' ).
      CATCH cx_salv_not_found.
    ENDTRY.

    o_events = o_table->get_event( ).

    SET HANDLER me->on_link_click FOR o_events.

    SET HANDLER me->on_double_click FOR o_events.

    o_table->display( ).

  ENDMETHOD.                    "display_alv

  METHOD on_link_click.

    MESSAGE i000(0k) WITH 'You Clicked on Line'
                           row
                           'Of Column'
                           column.

  ENDMETHOD.                    "on_single_click

  METHOD on_double_click.

    MESSAGE i000(0k) WITH 'You Double Clicked on Line'
                       row
                       'Of Column'
                       column.

  ENDMETHOD.                    "on_double_click

ENDCLASS.                    "lcl_alv IMPLEMENTATION

DATA o_alv TYPE REF TO lcl_alv.

START-OF-SELECTION.

  CREATE OBJECT o_alv.

  o_alv->select_alv( 30 ).
  o_alv->display_alv( ).

Regards.

Marcelo Ramos

Hello!!

I have a problem because when I click on the button-luggweight. I can't see any message so my program can't detect any event.

I think that in my code I forget something but I don't know what. Anybody can help me, please?

ZBC405_INCLUDE_CLASS

CLASS LCL_HANDLER DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
    ON_LINK_CLICK
    FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE
    IMPORTING
       ROW
       COLUMN.
ENDCLASS.  
CLASS LCL_HANDLER IMPLEMENTATION.
  METHOD ON_LINK_CLICK.
    CASE COLUMN.
      WHEN 'LUGGWEIGHT'.
        MESSAGE I041.
ENDCASE.
ENDMETHOD.
ENDCLASS.

_____________________________________

ZBC405_05_COLUM_TOP

TABLES: SBOOK,SCARR,SFLIGHT.
TYPE-POOLS: COL,ICON.

TYPES: BEGIN OF ST_BOOK.
        INCLUDE STRUCTURE SBOOK.

TYPES:  IT_CELL_TYPES TYPE SALV_T_INT4_COLUMN,
        IT_HYPERLINK TYPE SALV_T_INT4_COLUMN,
        URL TYPE SERVICE_RL,
        END OF ST_BOOK.
DATA: IT_BOOK TYPE TABLE OF ST_BOOK.
DATA: WA_BOOK LIKE LINE OF IT_BOOK,
          WA_CELL_TYPES LIKE LINE OF WA_BOOK-IT_CELL_TYPES.
DATA: GR_ALV TYPE REF TO CL_SALV_TABLE,
      LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE,
      LR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE.

__________________________________________________________

ZBC405_05_COLUMN_PROGRAM

SELECT * FROM SBOOK INTO CORRESPONDING FIELDS OF WA_BOOK
                      WHERE CARRID = M_CARRID.
    INSERT WA_BOOK INTO TABLE IT_BOOK.
  ENDSELECT.
CALL METHOD CL_SALV_TABLE=>FACTORY
          EXPORTING
                 LIST_DISPLAY   = IF_SALV_C_BOOL_SAP=>FALSE
*             R_CONTAINER    =
*             CONTAINER_NAME =
           IMPORTING
                 R_SALV_TABLE   = GR_ALV
           CHANGING
                  T_TABLE        = IT_BOOK.
PERFOM PESO.
FORM PESO.

  LOOP AT IT_BOOK INTO WA_BOOK.
    IF WA_BOOK-LUGGWEIGHT = 0
        AND WA_BOOK-WUNIT = 'KG'
        AND WA_BOOK-SMOKER = ' '.

      CLEAR WA_CELL_TYPES.

      WA_CELL_TYPES-COLUMNNAME = 'LUGGWEIGHT'.
      WA_CELL_TYPES-VALUE = IF_SALV_C_CELL_TYPE=><b>BUTTON.</b>
      APPEND WA_CELL_TYPES TO WA_BOOK-IT_CELL_TYPES.
    ENDIF.

    MODIFY IT_BOOK FROM WA_BOOK TRANSPORTING IT_CELL_TYPES.
  ENDLOOP.

  LR_COLUMNS = GR_ALV->GET_COLUMNS( ).
  TRY.
      LR_COLUMNS->SET_CELL_TYPE_COLUMN( VALUE = 'IT_CELL_TYPES' ).
    CATCH CX_SALV_DATA_ERROR.
  ENDTRY.
  TRY.
      CALL METHOD GR_ALV->GET_EVENT
        RECEIVING
          VALUE = LR_EVENT.
    CATCH CX_SALV_DATA_ERROR.
  ENDTRY.
    SET HANDLER LCL_HANDLER=>ON_LINK_CLICK
  FOR LR_EVENT.



ENDFORM.                    "PESO

thanks a lot.

6 REPLIES 6
Read only

Former Member
0 Likes
3,206

Where have you instantiated your local class LCL_HANDLER

Read only

marcelo_ramos1
SAP Mentor
SAP Mentor
0 Likes
3,206

Hi Ana,

Take a look at the program SALV_DEMO_TABLE_EVENTS, it's a Demonstration of Event In ALV Model. It does what you want.

<b>Don't forget to reward points for useful answers.</b>

Regards.

Marcelo Ramos

Read only

marcelo_ramos1
SAP Mentor
SAP Mentor
0 Likes
3,206

Hi Ana,

See the follow my example, it was based on 'SALV_DEMO_TABLE_EVENTS.

1 - It seems you forgetting to create a object of your class like

DATA: gr_events TYPE REF TO lcl_handle_events.

2 - You must instantiate this object like

CREATE OBJECT gr_events.

3 - You can set up your field as Hotspot with this statement


  TRY.
      lr_column ?= lr_columns->get_column( 'CARRID' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.

4 - You Must create and instantiate a object of class <b>cl_salv_events_table</b> responsible to get all events. You can do as follow

 
  DATA: lr_events TYPE REF TO cl_salv_events_table.
  lr_events = gr_table->get_event( ).

5 - You MUST active event handler for events that you want to work


  SET HANDLER gr_events->on_link_click FOR lr_events.

<b>You can see it working running the code below. I hope I have helped you with this informations. Good Look !

Ps.: Don't forget to reward points for useful answers and close this thread when your question be answered !.

</b>


REPORT zsalv_event_mar NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS:
      on_link_click FOR EVENT link_click OF cl_salv_events_table
        IMPORTING row column.
ENDCLASS.                    "lcl_handle_events DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
  METHOD on_link_click.

    DATA: l_row_string TYPE string,
          l_col_string TYPE string,
          l_row        TYPE char128.

    MESSAGE i000(0k) WITH 'You Clicked on Line'
                           row
                           'Of Column'
                           column.

  ENDMETHOD.                    "on_single_click
ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

DATA: gr_events TYPE REF TO lcl_handle_events.

DATA: gt_outtab TYPE STANDARD TABLE OF alv_tab.

DATA: gr_table   TYPE REF TO cl_salv_table.

SELECTION-SCREEN BEGIN OF BLOCK gen WITH FRAME.
PARAMETERS: p_amount TYPE i DEFAULT 30.
SELECTION-SCREEN END OF BLOCK gen.

START-OF-SELECTION.

  PERFORM select_data.

  PERFORM display.

*&---------------------------------------------------------------------*
*&      Form  select_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM select_data .

  SELECT *
    FROM alv_tab
    INTO TABLE gt_outtab
        UP TO p_amount ROWS.

ENDFORM.                    " select_data
*&---------------------------------------------------------------------*
*&      Form  display
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display .

  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = gr_table
        CHANGING
          t_table      = gt_outtab ).
    CATCH cx_salv_msg.                                  "#EC NO_HANDLER
  ENDTRY.

  DATA: lr_functions TYPE REF TO cl_salv_functions_list.

  lr_functions = gr_table->get_functions( ).
  lr_functions->set_default( abap_true ).

*... set the columns technical
  DATA: lr_columns TYPE REF TO cl_salv_columns_table,
        lr_column  TYPE REF TO cl_salv_column_table.

  lr_columns = gr_table->get_columns( ).
  lr_columns->set_optimize( abap_true ).

  TRY.
      lr_column ?= lr_columns->get_column( 'CARRID' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
    CATCH cx_salv_not_found.                            "#EC NO_HANDLER
  ENDTRY.

  DATA: lr_events TYPE REF TO cl_salv_events_table.
  lr_events = gr_table->get_event( ).

  CREATE OBJECT gr_events.

  SET HANDLER gr_events->on_link_click FOR lr_events.

  gr_table->display( ).

ENDFORM.                    " display

Regards.

Marcelo Ramos

Read only

Former Member
0 Likes
3,206

Thanks, your answers have been very useful.

But my problem was that I didn't use a dynpro so the program can't detect the button (I think )but it can detect a hotspot.

I can't see the difference between use BUTTON and HOTSPOT because if my program can detect the HOTSPOT why don't detect the BUTTON?

OK lr_column ?= lr_columns->get_column( 'CARRID' ).

lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

KO lr_column ?= lr_columns->get_column( 'CARRID' ).

lr_column->set_cell_type( if_salv_c_cell_type=>BUTTON ).

Read only

marcelo_ramos1
SAP Mentor
SAP Mentor
0 Likes
3,207

Hi,

Maybe this code be useful for you, it uses events <b>on_link_click</b> and <b>on_double_click</b> and display a field as icon that trigger its events.


REPORT zsalv_event_mar NO STANDARD PAGE HEADING.

INCLUDE <icon>.

*----------------------------------------------------------------------*
*       CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv DEFINITION.
  PUBLIC SECTION.

    METHODS select_alv IMPORTING amount TYPE i.

    METHODS display_alv.

    METHODS on_link_click
                FOR EVENT link_click OF cl_salv_events_table
                IMPORTING row column.

    METHODS on_double_click
               FOR EVENT double_click OF cl_salv_events_table
               IMPORTING row column.

  PROTECTED SECTION.

    DATA: o_table   TYPE REF TO cl_salv_table,
          o_columns TYPE REF TO cl_salv_columns_table,
          o_column  TYPE REF TO cl_salv_column_table,
          o_events  TYPE REF TO cl_salv_events_table.

    DATA: BEGIN OF s_alv2.
    INCLUDE TYPE alv_tab.
    DATA:   button      TYPE icon_d,
          END   OF s_alv2.

    DATA t_alv2 LIKE TABLE OF s_alv2.

ENDCLASS.                    "lcl_alv DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv IMPLEMENTATION.

  METHOD select_alv.

    SELECT *
      FROM alv_tab
      INTO CORRESPONDING FIELDS OF TABLE t_alv2
          UP TO amount ROWS.

    LOOP AT t_alv2 INTO s_alv2.
      MOVE icon_oo_class_event TO s_alv2-button.
      MODIFY t_alv2 FROM s_alv2 INDEX sy-tabix.
    ENDLOOP.

  ENDMETHOD.                    "SELECT_ALV

  METHOD display_alv.

    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table = o_table
          CHANGING
            t_table      = t_alv2 ).
      CATCH cx_salv_msg.
    ENDTRY.

    o_columns = o_table->get_columns( ).
    o_columns->set_optimize( abap_true ).

    TRY.
        o_column ?= o_columns->get_column( 'CARRID' ).
        o_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      CATCH cx_salv_not_found.
    ENDTRY.

    TRY.
        o_column ?= o_columns->get_column( 'BUTTON' ).
        o_column->set_icon( if_salv_c_bool_sap=>true ).
        o_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
        o_column->set_long_text( 'My Button' ).
      CATCH cx_salv_not_found.
    ENDTRY.

    o_events = o_table->get_event( ).

    SET HANDLER me->on_link_click FOR o_events.

    SET HANDLER me->on_double_click FOR o_events.

    o_table->display( ).

  ENDMETHOD.                    "display_alv

  METHOD on_link_click.

    MESSAGE i000(0k) WITH 'You Clicked on Line'
                           row
                           'Of Column'
                           column.

  ENDMETHOD.                    "on_single_click

  METHOD on_double_click.

    MESSAGE i000(0k) WITH 'You Double Clicked on Line'
                       row
                       'Of Column'
                       column.

  ENDMETHOD.                    "on_double_click

ENDCLASS.                    "lcl_alv IMPLEMENTATION

DATA o_alv TYPE REF TO lcl_alv.

START-OF-SELECTION.

  CREATE OBJECT o_alv.

  o_alv->select_alv( 30 ).
  o_alv->display_alv( ).

Regards.

Marcelo Ramos

Read only

Former Member
0 Likes
3,206

Thanks a lot . I resolved the problem