Saturday, July 26, 2008

Add custom sub-menu in ALV context menu

By Joyjit Ghosh,
Kolkata
, 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:



1 comment:

Chinna said...

My name is Raja. When I was searching for ABAP Code for copying the highlighted text to paste it where it is required with the key word 'CONTEXT_MENU_1' or 'ABAP Code for copying the highlighted text', I found your website and learn the CONTEXT_MENU usage using ALV and thanks for it and thanks for all other aspects even if I understand SAP Scripts and ALVs of your blog why bcoz your blog explanation is at ease