Add custom sub-menu in ALV context menu

By Joyjit Ghosh, IBM India

Code:
REPORT z_alv_context_menu NO STANDARD PAGE HEADING.
*******************************************************************
* Type pool declaration
*******************************************************************
TYPE-POOLS: slis.
******************************************************************
* Internal table declaration
******************************************************************
DATA: BEGIN OF gt_outtab OCCURS 0.
        INCLUDE STRUCTURE sflight.
DATA: END OF gt_outtab.
data: gt_events       TYPE slis_t_event.
*****************************************************************
* Structure / Variable declaration
*****************************************************************
DATA: g_repid         LIKE sy-repid,
      event           TYPE slis_alv_event.
*****************************************************************
* Event: START-OF-SELECTION
******************************************************************
START-OF-SELECTION.
* Storing the program name
  g_repid = sy-repid.
* Building ALV event table
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      i_list_type     = 4
    IMPORTING
      et_events       = gt_events
    EXCEPTIONS
      list_type_wrong = 1
      OTHERS          = 2.
  IF sy-subrc = 0.
    REFRESH gt_events.
*   Adding records for CONTEXT_MENU event
    event-name = 'CONTEXT_MENU'.
    event-form = 'CONTEXT_MENU'.
    APPEND event TO gt_events.
  ENDIF.
* Data Selection
  SELECT * FROM sflight INTO CORRESPONDING FIELDS
                   OF TABLE gt_outtab
                   UP TO 00030 ROWS.
* Display ALV grid
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
      i_callback_program          = g_repid
      i_callback_user_command     = 'USER_COMMAND'
      i_structure_name            = 'SFLIGHT'
      it_events                   = gt_events
    TABLES
      t_outtab                    = gt_outtab
    EXCEPTIONS
      program_error               = 1
      OTHERS                      = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
*****************************************************************
* FORM html_top_of_page
*****************************************************************
FORM html_top_of_page USING top TYPE REF TO cl_dd_document.
  CALL METHOD top->add_text
    EXPORTING
      text      = 'Hello world '
      sap_style = 'heading'.
  CALL METHOD top->add_gap
    EXPORTING
      width = 200.
  CALL METHOD top->add_picture
    EXPORTING
      picture_id = 'ENJOYSAP_LOGO'.
ENDFORM.                    "html_top_of_page
****************************************************************
* Form  context_menu
****************************************************************
FORM context_menu USING e_object TYPE REF TO cl_ctmenu.
  DATA: l_smenu TYPE REF TO cl_ctmenu.
  IF e_object IS BOUND.
*   Create custom Sub-menu to hide column on which right
*   mouse button will be clicked
    CREATE OBJECT l_smenu.
    CALL METHOD l_smenu->add_function
      EXPORTING
        fcode = 'ZFN1'
        text  = 'Hide Column'(001).
    CALL METHOD e_object->add_submenu
      EXPORTING
        menu = l_smenu
        text = 'Hide'(002).
  ENDIF.
ENDFORM.                    "CONTEXT_MENU
******************************************************************
* Form  user_command
******************************************************************
FORM user_command  USING r_ucomm TYPE sy-ucomm
                         ls_selfield TYPE slis_selfield.
  DATA: g_grid TYPE REF TO cl_gui_alv_grid,
        t_catalog TYPE lvc_t_fcat,
        w_catalog TYPE lvc_s_fcat,
        l_repid  TYPE sy-repid.
  CASE r_ucomm.
*   When 'hide column' sub-menu is clicked from the context menu
*   then hide the column from where this is happened
    WHEN 'ZFN1'.
*     Get the global instance of the ALV grid as well as
*     it's field catalog info.
      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_callback_program = l_repid
          e_grid             = g_grid
          et_fieldcat_lvc    = t_catalog.
      CHECK l_repid = g_repid.
      IF g_grid IS BOUND AND t_catalog[] IS NOT INITIAL.
*       Set the 'NO_OUT' attribute of the catalog to 'X'
        w_catalog-no_out = 'X'.
*       Modify the field with this above value
*       on which right click occured
        MODIFY t_catalog FROM w_catalog TRANSPORTING no_out
            WHERE fieldname = ls_selfield-fieldname.
        IF sy-subrc = 0.
*         Set the field catalog with this modified one
          CALL METHOD g_grid->set_frontend_fieldcatalog
            EXPORTING
              it_fieldcatalog = t_catalog.
        ENDIF.
      ENDIF.
    WHEN OTHERS.
* Do nothing
  ENDCASE.
  ls_selfield-refresh = 'X'.
ENDFORM.                    "USER_COMMAND

Output:

 

 

Please send us your feedback/suggestions at webmaster@SAPTechnical.COM 

HomeContribute About Us Privacy Terms Of Use • Disclaimer • SafeCompanies: Advertise on SAPTechnical.COM | Post JobContact Us  

Graphic Design by Round the Bend Wizards

footer image footer image