Вы находитесь на странице: 1из 12

Adding custom context menu in classical list

By Joyjit Ghosh, IBM India

*&---------------------------------------------------------------*
*& Report Z_CONTEXT_MENU_DEMO
*&
*&---------------------------------------------------------------*
*& published at SAPTechnical.COM
*&
*&---------------------------------------------------------------*
REPORT z_context_menu_demo.
* Table declaration
DATA: i_vbak TYPE STANDARD TABLE OF vbak INITIAL SIZE 0,
i_vbap TYPE STANDARD TABLE OF vbap INITIAL SIZE 0.
* Workarea declaration
DATA: w_vbak TYPE vbak,
w_vbap TYPE vbap.
START-OF-SELECTION.
* Set custom status
SET PF-STATUS 'BASIC'.
* Fetch header data
SELECT * FROM vbak
INTO TABLE i_vbak
UP TO 50 ROWS.
IF sy-subrc = 0.
* Fetch line item data
SELECT * FROM vbap
INTO TABLE i_vbap
FOR ALL ENTRIES IN i_vbap
WHERE vbeln = i_vbap-vbeln.
CHECK sy-subrc = 0.
* Display basic list
LOOP AT i_vbak INTO w_vbak.
FORMAT COLOR COL_HEADING.
WRITE : /10 w_vbak-vbeln,
20 w_vbak-erdat,
35 w_vbak-erzet,
55 w_vbak-ernam.
HIDE: w_vbak-vbeln.
ENDLOOP.
ENDIF.
AT USER-COMMAND.
* Handle user command
CASE sy-ucomm.
WHEN 'DETAIL'.
CHECK NOT w_vbak IS INITIAL.
* Display detail list
LOOP AT i_vbap INTO w_vbap WHERE vbeln =
w_vbak-vbeln.
FORMAT COLOR COL_HEADING.
WRITE : /10 w_vbap-vbeln,
25 w_vbap-posnr,
35 w_vbap-matnr,
55 w_vbap-matwa.
ENDLOOP.
WINDOW STARTING AT 20 20
ENDING AT 120 110.
ENDCASE.
*&---------------------------------------------------------------*
*& Form on_ctmenu_request
*&---------------------------------------------------------------*
* Creation of custom context menu- It is called dynamically
* by ABAP runtime
*----------------------------------------------------------------*
* -->L_MENU Handle for context menu
*----------------------------------------------------------------*
FORM on_ctmenu_request USING l_menu TYPE REF TO cl_ctmenu.
DATA lin TYPE i.
GET CURSOR LINE lin.
IF lin > 2 AND sy-lsind = 0.
* Add menu
CALL METHOD l_menu->add_function
EXPORTING
fcode = 'DETAIL'
text = text-001.
ENDIF.
* Add menu
CALL METHOD l_menu->add_function
EXPORTING
fcode = 'BACK'
text = text-002.
ENDFORM. "on_ctmenu_request

How SAP calls the routine ON_CTMENU_REQUEST:

Whenever user presses right mouse button or shift + F10 key combinations sap triggers system
event and calls the method DISPATCH_SYSTEM_EVENTS of class CL_GUI_CFW. Within it, it
calls the method DISPATCH of class LCL_DYNPRO_PROXY (defined within the class pool of
CL_GUI_CFW).
 

 
From this method (DISPATCH) it calls the routine ON_CTMENU_REQUEST which is defined in
our program.
 

Output:  

Basic list:
 

Detail list:

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:

Вам также может понравиться