Upload
sapabap403
View
136
Download
5
Embed Size (px)
Citation preview
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 declarationDATA: i_vbak TYPE STANDARD TABLE OF vbak INITIAL SIZE 0, i_vbap TYPE STANDARD TABLE OF vbap INITIAL SIZE 0.* Workarea declarationDATA: 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 nameg_repid = sy-repid.
* Building ALV event tableCALL 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 eventevent-name = 'CONTEXT_MENU'.
event-form = 'CONTEXT_MENU'.
APPEND event TO gt_events.
ENDIF.
* Data SelectionSELECT * FROM sflight INTO CORRESPONDING FIELDS
OF TABLE gt_outtab
UP TO 00030 ROWS.
* Display ALV gridCALL 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 clickedCREATE 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 happenedWHEN '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 occuredMODIFY t_catalog FROM w_catalog TRANSPORTING no_out
WHERE fieldname = ls_selfield-fieldname.
IF sy-subrc = 0.
* Set the field catalog with this modified oneCALL 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: