dynamic alv

*This program I created to show how to do with dynamic ALV 

TYPE-POOLSabapslis.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME.
PARAMETERS p_tab TYPE LENGTH 30 DEFAULT 'T001'.
SELECTION-SCREEN END OF BLOCK blk1.


FIELD-SYMBOLS<gfs_dy_tab> TYPE STANDARD TABLE,
               <gfs_dy_wa>.

DATA gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE.
DATA gt_fieldcatlog TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA gt_itab TYPE REF TO data.

START-OF-SELECTION.
  PERFORM sub_get_fieldcat" Build fieldcat for ALV function
  PERFORM sub_get_table.    " Get inernal table
  PERFORM sub_get_data.     " Fill data into internal table
  PERFORM sub_alv_display.  " Display inernnal table using ALV





*&---------------------------------------------------------------------*
*&      Form  SUB_GET_FIELDCAT
*&---------------------------------------------------------------------*
*       Build fieldcat for ALV function
*----------------------------------------------------------------------*
FORM sub_get_fieldcat .
*   Define cl_abap_structdescr object
  DATA lo_stru_des TYPE REF TO cl_abap_structdescr.
*   Define components internal table
  DATA lt_components TYPE  abap_compdescr_tab.
*   Work area
  DATA ls_components LIKE LINE OF lt_components.
*   Detail info of table field
  DATA lt_dfies_tab TYPE STANDARD TABLE OF dfies WITH HEADER LINE.
*   Pass object to lo_stru_des
  lo_stru_des ?= cl_abap_typedescr=>describe_by_namep_tab ).
*   get components attribute
  lt_components[] lo_stru_des->components[].
*   Set properties of gt_fieldcat
  LOOP AT lt_components INTO ls_components.
    CLEAR gt_fieldcat.
    gt_fieldcat-col_pos sy-tabix.
    gt_fieldcat-fieldname ls_components-name.
    gt_fieldcat-inttype ls_components-type_kind.
    gt_fieldcat-intlen = ( ls_components-length div 2 ).
    APPEND gt_fieldcat.
  ENDLOOP.

*  MOVE-CORRESPONDING fields from gt_fieldcat to gt_fieldcatlog.
  LOOP AT gt_fieldcat.
    MOVE-CORRESPONDING gt_fieldcat TO gt_fieldcatlog.
*   get detailed information of table field
    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        tabname        p_tab
        fieldname      gt_fieldcat-fieldname
        langu          sy-langu
      TABLES
        dfies_tab      lt_dfies_tab
      EXCEPTIONS
        not_found      1
        internal_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.
    READ TABLE lt_dfies_tab INDEX 1.
*    set label for each column
    gt_fieldcatlog-seltext_m lt_dfies_tab-scrtext_m.
    APPEND gt_fieldcatlog.
  ENDLOOP.

ENDFORM.                    " SUB_GET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  SUB_GET_TABLE
*&---------------------------------------------------------------------*
*       Get inernal table
*----------------------------------------------------------------------*
FORM sub_get_table .
*   Create dynamic table using fieldcat
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           gt_fieldcat[]
    IMPORTING
      ep_table                  gt_itab
    EXCEPTIONS
      generate_subpool_dir_full 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.
  ASSIGN gt_itab->TO <gfs_dy_tab>.
ENDFORM.                    " SUB_GET_TABLE

*&---------------------------------------------------------------------*
*&      Form  SUB_GET_DATA
*&---------------------------------------------------------------------*
*       Fill data into internal table
*----------------------------------------------------------------------*
FORM sub_get_data .
  SELECT *  UP TO 100 ROWS
    INTO TABLE <gfs_dy_tab>
    FROM (p_tab).
ENDFORM.                    " SUB_GET_DATA

*&---------------------------------------------------------------------*
*&      Form  SUB_ALV_DISPLAY
*&---------------------------------------------------------------------*
*       Display inernnal table using ALV
*----------------------------------------------------------------------*
FORM sub_alv_display .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat   gt_fieldcatlog[]
    TABLES
      t_outtab      <gfs_dy_tab>
    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.

ENDFORM.                    " SUB_ALV_DISPLAY

你可能感兴趣的:(dynamic alv)