Here’s my ALV grid report template using dynpro custom container.
The template includes
- logic to cater for selection screen’s ALV variant, i.e. setting default variant, showing search help, validation, and apply it into the report
- handling double click event
- define sorting sequence
- changing few common attributes of field catalog
REPORT [report name]. *----------------------------------------------------------------------- * LOCAL CLASS - DEFINITION *----------------------------------------------------------------------- CLASS lcl_event_handler DEFINITION. METHODS on_double_click_grid FOR EVENT double_click OF CL_GUI_ALV_GRID IMPORTING E_ROW E_COLUMN ES_ROW_NO. "#EC NEEDED ENDCLASS. "lcl_event_handler DEFINITION TYPES BEGIN OF t_report. INCLUDE TYPE [report structure]. TYPES END OF t_report. *----------------------------------------------------------------------- * CONSTANTS *----------------------------------------------------------------------- *----------------------------------------------------------------------- * DATA - INTERNAL TABLES & WORKING AREA *----------------------------------------------------------------------- * Report table, displayed by ALV DATA i_report TYPE STANDARD TABLE OF t_report. DATA k_report TYPE t_report. *----------------------------------------------------------------------- * DATA - ALV *----------------------------------------------------------------------- CONSTANTS c_ccname TYPE scrfname VALUE 'ALV_CCTRL'. DATA o_alvgrid TYPE REF TO cl_gui_alv_grid. DATA o_alvcontainer TYPE REF TO cl_gui_custom_container. DATA v_variant TYPE disvariant. *----------------------------------------------------------------------- * STRUCTURE *----------------------------------------------------------------------- ************************************************************************ * Selection Screen Design ************************************************************************ * Box Data Selection SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01. [data selection options] SELECTION-SCREEN END OF BLOCK b1. * Box ALV Output options SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-t04. PARAMETERS p_vari TYPE disvariant-variant. SELECTION-SCREEN END OF BLOCK b4. ************************************************************************ ** INITIALIZATION ************************************************************************ INITIALIZATION. PERFORM set_alv_default_variant. ************************************************************************ ** AT SELECTION-SCREEN ************************************************************************ AT SELECTION-SCREEN. AT SELECTION-SCREEN ON p_vari. PERFORM check_alv_selected_variant. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari. PERFORM f4_alv_vari. START-OF-SELECTION. PERFORM get_data. PERFORM process_data. END-OF-SELECTION. IF i_report[] IS INITIAL. MESSAGE 'No data selected'(m04) TYPE 'S'. ELSE. CALL SCREEN '0100'. ENDIF. *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* * Set screen status *----------------------------------------------------------------------* module STATUS_0100 output. SET PF-STATUS 'REPSCR'. SET TITLEBAR 'REPSCR'. endmodule. " STATUS_0100 OUTPUT *&---------------------------------------------------------------------* *& Module DISPLAY_ALV OUTPUT *&---------------------------------------------------------------------* * Display ALV Grid Report *----------------------------------------------------------------------* module DISPLAY_ALV output. PERFORM display_alv_grid. endmodule. " DISPLAY_ALV OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* * Handle user command *----------------------------------------------------------------------* module USER_COMMAND_0100 input. CASE sy-ucomm. WHEN '&BACK' OR '&EXIT' OR '&CANCEL'. LEAVE TO SCREEN 0. WHEN OTHERS. ENDCASE. endmodule. " USER_COMMAND_0100 INPUT *----------------------------------------------------------------------- * LOCAL CLASS - IMPLEMENTATION *----------------------------------------------------------------------- CLASS lcl_event_handler IMPLEMENTATION. METHOD on_double_click_grid. DATA lv_row TYPE SALV_DE_ROW. DATA lv_col TYPE SALV_DE_COLUMN. lv_row = e_row-index . lv_col = e_column-fieldname. on_double_click( row = lv_row column = lv_col ). ENDMETHOD. ENDCLASS. "lcl_event_handler IMPLEMENTATION *&---------------------------------------------------------------------* *& Form SET_ALV_DEFAULT_VARIANT *&---------------------------------------------------------------------* * Set default ALV variant *----------------------------------------------------------------------* FORM set_alv_default_variant. DATA lv_def_layout TYPE disvariant. * Set variant default value CLEAR lv_def_layout. MOVE sy-repid TO lv_def_layout-report. CALL FUNCTION 'LVC_VARIANT_DEFAULT_GET' EXPORTING i_save = 'A' CHANGING cs_variant = lv_def_layout EXCEPTIONS not_found = 2. IF sy-subrc = 0. p_vari = lv_def_layout-variant. ENDIF. ENDFORM. " SET_ALV_DEFAULT_VARIANT *&---------------------------------------------------------------------* *& Form F4_ALV_VARI *&---------------------------------------------------------------------* * popup F4 help to select an ALV layout *----------------------------------------------------------------------* FORM f4_alv_vari . DATA lv_layout TYPE disvariant. DATA lv_exit TYPE c LENGTH 1. DATA lv_spec_layout TYPE disvariant. CLEAR lv_layout. MOVE sy-repid TO lv_layout-report. CALL FUNCTION 'LVC_VARIANT_F4' EXPORTING is_variant = lv_layout i_save = 'A' IMPORTING e_exit = lv_exit es_variant = lv_spec_layout EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. IF lv_exit NE 'X'. * set name of layout on selection screen p_vari = lv_spec_layout-variant. ENDIF. ENDIF. ENDFORM. " F4_ALV_VARI *&---------------------------------------------------------------------* *& Form CHECK_ALV_SELECTED_VARIANT *&---------------------------------------------------------------------* * Check selected ALV variant *----------------------------------------------------------------------* FORM check_alv_selected_variant . DATA lv_spec_layout TYPE disvariant. IF p_vari IS NOT INITIAL. CLEAR lv_spec_layout. MOVE p_vari TO lv_spec_layout-variant. MOVE sy-repid TO lv_spec_layout-report. CALL FUNCTION 'LVC_VARIANT_EXISTENCE_CHECK' EXPORTING i_save = 'A' CHANGING cs_variant = lv_spec_layout EXCEPTIONS wrong_input = 1 not_found = 2 program_error = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. ENDFORM. " CHECK_ALV_SELECTED_VARIANT *&---------------------------------------------------------------------* *& Form DISPLAY_ALV_GRID *&---------------------------------------------------------------------* * Display ALV Grid Report *----------------------------------------------------------------------* form DISPLAY_ALV_GRID . DATA ls_layout TYPE lvc_s_layo. DATA li_fcat TYPE lvc_t_fcat. DATA li_sort TYPE lvc_t_sort. DATA lk_sort TYPE lvc_s_sort. DATA lv_default TYPE c LENGTH 1 VALUE 'X'. DATA lv_save TYPE c LENGTH 1 VALUE 'A'. DATA lo_ev_handler TYPE REF TO lcl_event_handler. IF o_alvgrid IS NOT BOUND. * create ALV Grid container CREATE OBJECT o_alvcontainer EXPORTING container_name = c_ccname EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 others = 6. IF sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. * create ALV Grid object CREATE OBJECT o_alvgrid EXPORTING i_parent = o_alvcontainer EXCEPTIONS error_cntl_create = 1 error_cntl_init = 2 error_cntl_link = 3 error_dp_create = 4 others = 5 . IF sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. * Generate field catalog CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING I_STRUCTURE_NAME = 'ZBID_TRACK' I_INTERNAL_TABNAME = 'I_REPORT' CHANGING ct_fieldcat = li_fcat EXCEPTIONS INCONSISTENT_INTERFACE = 1 PROGRAM_ERROR = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. * Change column display PERFORM change_column_grid USING li_fcat: [EXAMPLE:] 'KUNAG' ' ' ' ' ' ' ' ' 'Quote Sold-to #'(001) 'QuotSld-to'(003), 'NETWR' ' ' ' ' 'WAERK' ' ' 'Net Value (LC)'(031) 'N.V. (LC)'(033), 'REJQTY' ' ' ' ' ' ' 'VRKME' 'Rejected Quantity'(049) 'Rejd Qty'(051), 'WAERS_RC' 'X' 'X' ' ' ' ' ' ' ' '. * optimize column width ls_layout-CWIDTH_OPT = 'X'. * Prepare variant v_variant-report = sy-repid. v_variant-username = sy-uname. IF p_vari IS NOT INITIAL. v_variant-variant = p_vari. ENDIF. * Set event handler CREATE OBJECT lo_ev_handler. SET HANDLER lo_ev_handler->on_double_click_grid FOR o_alvgrid. * Define sorting lk_sort-fieldname = '[sort field1]'. APPEND lk_sort TO li_sort. lk_sort-fieldname = '[sort field2]'. APPEND lk_sort TO li_sort. lk_sort-fieldname = '[sort field3]'. APPEND lk_sort TO li_sort. lk_sort-fieldname = '[sort field4]'. APPEND lk_sort TO li_sort. * Display ALV CALL METHOD o_alvgrid->set_table_for_first_display EXPORTING is_variant = v_variant i_save = lv_save i_default = lv_default is_layout = ls_layout CHANGING it_outtab = i_report it_fieldcatalog = li_fcat it_sort = li_sort * it_filter = EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 others = 4. IF sy-subrc <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ELSE. CALL METHOD o_alvgrid->refresh_table_display EXCEPTIONS finished = 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. ENDIF. endform. " DISPLAY_ALV_GRID *&---------------------------------------------------------------------* *& Form CHANGE_COLUMN_GRID *&---------------------------------------------------------------------* * change a report column attributes *----------------------------------------------------------------------* FORM change_column_grid USING pi_fcat TYPE lvc_t_fcat pv_fieldname TYPE c pv_technical TYPE c pv_invisible TYPE c pv_currref TYPE c pv_quanref TYPE c pv_fieldtextlm TYPE c pv_fieldtexts TYPE c. FIELD-SYMBOLS <fcat> TYPE lvc_s_fcat. READ TABLE pi_fcat ASSIGNING <fcat> WITH KEY fieldname = pv_fieldname. IF sy-subrc = 0. <fcat>-tech = pv_technical. <fcat>-no_out = pv_invisible. IF <fcat>-no_out IS NOT INITIAL OR <fcat>-tech IS NOT INITIAL. RETURN. ENDIF. <fcat>-cfieldname = pv_currref. <fcat>-qfieldname = pv_quanref. IF pv_fieldtextlm IS NOT INITIAL. <fcat>-reptext = <fcat>-scrtext_l = <fcat>-scrtext_m = pv_fieldtextlm. ENDIF. IF pv_fieldtexts IS NOT INITIAL. <fcat>-scrtext_s = pv_fieldtexts. ENDIF. ENDIF. ENDFORM. " CHANGE_COLUMN *&---------------------------------------------------------------------* *& Form GET_DATA *&---------------------------------------------------------------------* * Get data from database *----------------------------------------------------------------------* FORM get_data . [data selection logic] ENDFORM. " GET_DATA *&---------------------------------------------------------------------* *& Form PROCESS_DATA *&---------------------------------------------------------------------* * Process data *----------------------------------------------------------------------* FORM process_data . [data processing logic] ENDFORM. " PROCESS_DATA |