Klasse CL GUI ALV GRID Eventhandler

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Etwas gewöhnungsbedürftig ist der Umgang mit den Events, die von der Klasse CL_GUI_ALV_GRID ausgelöst werden.


lcl_event_receiver DEFINITION

*---------------------------------------------------------------------*
*       CLASS 
*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
    CLASS-METHODS:
     handle_double_click
        FOR EVENT double_click OF cl_gui_alv_grid
            IMPORTING e_row     "Zeile
                      e_column, "Spalte                    "#EC NEEDED
     handle_hotspot_click
        FOR EVENT hotspot_click OF cl_gui_alv_grid
            IMPORTING e_row_id       "Zeile
                      e_column_id,   "Spalte
    handle_data_changed
        for event data_changed of cl_gui_alv_grid
            importing er_data_changed,
     handle_toolbar                                         "#EC NEEDED
        FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object
                      e_interactive,                        "#EC NEEDED
     handle_user_command
        FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,      "sy-ucomm
     handle_menu_button
        FOR EVENT menu_button OF cl_gui_alv_grid
            IMPORTING e_object
                      e_ucomm.                              "#EC NEEDED

ENDCLASS.                    "lcl_event_receiver DEFINITION

lcl_event_receiver IMPLEMENTATION

*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_double_click.
    PERFORM handle_double_click 
      using e_row               "Zeile
            e_column.           "Spalte
  ENDMETHOD.                    "handle_double_click
  METHOD handle_hotspot_click.
    PERFORM handle_hotspot_click
      USING  e_row_id           "Zeile
             e_column_id.       "Spalte
  ENDMETHOD.                    "handle_hotspot_click
  METHOD     handle_data_changed.
    PERFORM handle_data_changed
      USING er_data_changed.    "Zeile/Spalte/Geänderter Wert
  ENDMETHOD.                    "handle_data_changed
  METHOD handle_toolbar.
    PERFORM handle_toolbar
      CHANGING e_object
               e_interactive.
  ENDMETHOD.                    "handle_toolbar
  METHOD handle_menu_button.
    PERFORM handle_menu_button
      USING e_object
            e_ucomm.
  ENDMETHOD.                    "handle_menu_button
  METHOD handle_user_command.
   PERFORM handle_user_command
     using e_ucomm.             "sy-ucomm
  ENDMETHOD.                    "handle_user_command

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

lcl_event_receiver FORMS

*&---------------------------------------------------------------------*
*&      Form  HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*       Doppelklick
*----------------------------------------------------------------------*
FORM HANDLE_DOUBLE_CLICK  
  USING pis_row    type LVC_S_ROW   "Zeile = PIS_ROW-INDEX
        pis_column type LVC_S_COL.  "Feldname

  break-point.

ENDFORM.                    " HANDLE_DOUBLE_CLICK
*&---------------------------------------------------------------------*
*&      Form  HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_hotspot_click
  USING  pis_row TYPE lvc_s_row    "Zeile = PIS_ROW-INDEX
         pis_col TYPE lvc_s_col.   "Feldname

  break-point.

ENDFORM.                    " HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*&      Form  HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_data_changed
  USING pio_data_changed TYPE REF TO cl_alv_changed_data_protocol.

  DATA: ls_good  TYPE lvc_s_modi.

  FIELD-SYMBOLS: <fs_itab> TYPE ty_itab.

*   Tabelle der modifizierten Zellen abarbeiten
  LOOP AT pio_data_changed->mt_mod_cells INTO ls_good.

    READ TABLE gt_itab ASSIGNING <fs_itab> INDEX ls_good-row_id.
    CASE ls_good-fieldname.
      WHEN 'PDF1'.
        "<fs_alv>-pdf1 = ls_good-value.
    ENDCASE.

  ENDLOOP.

ENDFORM.                    " HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*&      Form  HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*       Toolbar
*----------------------------------------------------------------------*
FORM HANDLE_TOOLBAR
  USING pio_object      type ref to CL_ALV_EVENT_TOOLBAR_SET
        piv_interactive type CHAR01.

  break-point.

ENDFORM.                    " HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*&      Form  HANDLE_MENU_BUTTON
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM HANDLE_MENU_BUTTON 
  USING    pio_object  TYPE REF TO CL_CTMENU
           piv_ucomm   TYPE sy-ucomm.

  break-point.

ENDFORM.                    " HANDLE_MENU_BUTTON
*&---------------------------------------------------------------------*
*&      Form  HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_user_command  
  USING  piv_ucomm type SY-UCOMM.
  
  break-point.

ENDFORM.

Objekt instanziieren und Set Handle

 if go_cont is not bound. 
****************************************
* Methode: set_table_for_first_display *
****************************************
* Container erzeugen
  CREATE OBJECT go_cont
    EXPORTING
      container_name = 'ALV_CONT'.

* ALV erzeugen
  CREATE OBJECT go_alv_cont
    EXPORTING
      i_parent = go_cont.


* Rufe die ALV-Liste auf
  CALL METHOD go_alv_cont->set_table_for_first_display
    EXPORTING
      i_bypassing_buffer   = 'X' "lv_bypassing_buffer
      i_save               = 'X' "lv_save
*     i_default            = 'X'
      is_layout            = ls_layout
*     it_toolbar_excluding = lt_toolbar_excluding
*     is_variant           = ls_variant
    CHANGING
      it_outtab            = pct_list
      it_fieldcatalog      = lt_fcat.

  if sy-subrc = 0.
    go_alv_cont->set_gridtitle( i_gridtitle = 'Liste Verträge'(001) ).  "Titelbeschriftung in der ALV-Liste
  endif.

* Register events
    call method go_alv_cont->register_edit_event
      exporting
        i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    call method go_alv_cont->register_edit_event
      exporting
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

* Die Eventhandler werden scharf geschaltet
  SET HANDLER lcl_event_receiver=>handle_double_click   FOR go_alv_cont.
  SET HANDLER lcl_event_receiver=>handle_hotspot_click  FOR go_alv_cont.
  set handler lcl_event_receiver=>handle_data_changed   for go_alv_cont.
  SET HANDLER lcl_event_receiver=>handle_toolbar        FOR go_alv_cont.
  SET HANDLER lcl_event_receiver=>handle_menu_button    FOR go_alv_cont.
  SET HANDLER lcl_event_receiver=>handle_user_command   FOR go_alv_cont.

* Die Toolbar soll ergänzt werden um eigene Buttons
  CALL METHOD go_alv_cont->set_toolbar_interactive.

else.
  PERFORM refresh_alv.
endif.

Web-Links