Context Menu in ALV-Based Account Balance
Back to list < Debit entry with closed posting period Fire Protection Tax >
,
In the classic, text-based FS-CD account balance there is a practical context menu with the most important commands. Unfortunately, this context menu does not exist in the ALV-based account balance. In this blog post I show how this context menu can be easily retrofitted.
FS-CD account balance has been implemented by SAP in function group FKL9. Because the data objects we need access to are defined as global variables in the TOP include of this function group, we can access them using external assignments.
The solution consists of a function module that is to be called from FS-CD at event 1205 and a local class that should be stored in the same function group (or, of course, a global class).
Definition of the local class
This class registers the ALV-based account balance of transaction FPL9 for the events CONTEXT_MENU_REQUEST
and USER_COMMAND
and reacts to these events when they are triggered. The event CONTEXT_MENU_REQUEST
is triggered when the user presses the right mouse button. In this event it is possible to create the context menu entries. When the user selects a command from the context menu, we can trigger the appropriate functionality in the event handler for USER_COMMAND
.
CLASS lcl_event_listener DEFINITION. PUBLIC SECTION. CLASS-METHODS subscribe. PRIVATE SECTION. CLASS-METHODS on_context_menu_request FOR EVENT context_menu_request OF cl_gui_alv_grid IMPORTING e_object sender. CLASS-METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm sender. CLASS-METHODS get_current_item IMPORTING value(io_alv) TYPE REF TO cl_gui_alv_grid RETURNING value(rs_item) TYPE fkkepos. ENDCLASS.
Register events
This method is called from the function module for event 1205 and registers itself with the ALV Grid control of the account balance for both events. Since the ALV Grid control was not created when event 1205 was first called, we do this at this point using an external perform.
METHOD subscribe. FIELD-SYMBOLS <o_alv> TYPE REF TO cl_gui_alv_grid. " Generating the ALV Grid now PERFORM grid_pbo_311 IN PROGRAM saplfkl9. " Determine reference to ALV grid ASSIGN ('(SAPLFKL9)GR_ALV_GRID_0311') TO <o_alv>. IF <o_alv> IS NOT ASSIGNED OR <o_alv> IS NOT BOUND. RETURN. ENDIF. " Register Event Handlers SET HANDLER on_context_menu_request FOR <o_alv>. SET HANDLER on_user_command FOR <o_alv>. ENDMETHOD.
Setting Up the Context Menu
The context-dependent menu is set up in this method. An auxiliary method is used to determine the current line of the account balance. Entries are added to the context menu depending on the origin of the document and the clearing status of the item. The structure is based on the usual context menu of the classic account balance.
METHOD on_context_menu_request. DATA(ls_item) = get_current_item( sender ). IF ls_item IS INITIAL. RETURN. " No context menu for rows with ALV subtotals ENDIF. " Determine origin key SELECT SINGLE herkf FROM dfkkko WHERE opbel = @ls_item-opbel INTO @DATA(lv_source). "Add context menu (see FuGr FKL9, FORM on_ctmenu_request) e_object->add_separator( ). IF lv_source = '12'. e_object->add_function( fcode = 'INST' text = 'Installment plan'(001) ). e_object->add_function( fcode = 'RATP' text = 'Original items'(002) ). ELSE. e_object->add_function( fcode = 'BELG' text = 'Show position'(003) ). e_object->add_function( fcode = 'FPE2' text = 'Change position'(004) ). e_object->add_function( fcode = 'FP08' text = 'Cancel'(005) ). IF ls_item-augst IS NOT INITIAL. e_object->add_function( fcode = 'FP07' text = 'Undo clearing'(006) ). ENDIF. ENDIF. e_object->add_function( fcode = 'BELZ' text = 'Payments/returns'(007) ). e_object->add_function( fcode = 'DUNH' text = 'Dunning history'(008) ). e_object->add_function( fcode = 'ZHIS' text = 'Interest history'(009) ). e_object->add_separator( ). e_object->add_function( fcode = 'STMM' text = 'Business partner'(010) ). e_object->add_function( fcode = 'VKON' text = 'Contract account'(011) ). e_object->add_function( fcode = '1201' text = 'Contract'(012) ). e_object->add_separator( ). e_object->add_function( fcode = 'FPE2M' text = 'Mass change'(013) ). e_object->add_function( fcode = 'FP06' text = 'Account maintenance'(014) ). e_object->add_separator( ). CASE lv_source. WHEN '05'. e_object->add_function( fcode = 'BAZS' text = 'Payment lot position'(015) ). WHEN '06'. e_object->add_function( fcode = 'BAZL' text = 'Payment run'(016) ). WHEN '08'. e_object->add_function( fcode = 'BARL' text = 'Returns detail'(017) ). ENDCASE. ENDMETHOD.
Handling User Commands
This method is called when the user has selected a command from the context menu. We trigger the desired function by passing the OK code to function group FKL9 via external assign and performing an external perform. This simulates that the user would have called the command from the menu bar.
METHOD on_user_command. FIELD-SYMBOLS <v_ok_code> TYPE c. " Pass on user command to FPL9 ASSIGN ('(SAPLFKL9)OK-CODE') TO <v_ok_code>. IF <v_ok_code> IS ASSIGNED. <v_ok_code> = e_ucomm. ENDIF. PERFORM ucomm_general IN PROGRAM saplfkl9. ENDMETHOD.
Determine current item
In this auxiliary method, the current row is determined from the account balance. There are two internal tables in the function group, one with the summarized items and one with the unsummarized items. The method returns the unsummarized item, if possible, otherwise the summarized item.
METHOD get_current_item. TYPES t_postab TYPE TABLE OF fkkepos WITH NON-UNIQUE DEFAULT KEY . FIELD-SYMBOLS <t_postab> TYPE t_postab. FIELD-SYMBOLS <s_item_alv> LIKE LINE OF <t_postab>. FIELD-SYMBOLS <s_item_db> LIKE LINE OF <t_postab>. " Get current line io_alv->get_current_cell( IMPORTING es_row_no = DATA(ls_row_info) ). " First access to the table of summarized items ASSIGN ('(SAPLFKL9)GT_POSTAB[]') TO <t_postab>. IF <t_postab> IS NOT ASSIGNED. RETURN. ENDIF. READ TABLE <t_postab> INDEX ls_row_info-row_id ASSIGNING <s_item_alv>. IF sy-subrc <> 0. RETURN. ENDIF. " then access to the table of unsummarized items ASSIGN ('(SAPLFKL9)POSTAB[]') TO <t_postab>. IF <t_postab> IS NOT ASSIGNED. RETURN. ENDIF. READ TABLE <t_postab> WITH KEY orisp = <s_item_alv>-oriso ASSIGNING <s_item_db>. IF sy-subrc = 0. rs_item = <s_item_db> " Return unsummarized items ELSE. rs_item = <s_item_alv>. " Return summarized items ENDIF. ENDMETHOD.
Include in event 1205
To include the context menu in the ALV account balance, you must finally add the following lines to the customer function module in event 1205:
IF i_first_call = abap_true AND i_fkkl1-xgrid = abap_true AND i_fkkeposc-tcode = 'FPL9' AND i_fkkeposc-varnr IS NOT INITIAL. lcl_event_listener=>subscribe( ). ENDIF.
Translated with DeepL
Back to list < Debit entry with closed posting period Fire Protection Tax >