ALV Grid Report Template using Dynpro Custom Container


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

 

, , ,

  1. Leave a comment

Leave a comment