(原创)创建纵深结构的动态内表

     在上一篇博客中已经给出创建非纵深结构动态内表的DEMO,在这篇博客中结合上篇博客中的DEMO,给出创建纵深结构动态内表的DEMO。

选择界面:

输出目标(DEBUG界面):

源代码:

*&---------------------------------------------------------------------*
*& Report Z15540_DYN02
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z15540_dyn02.
DATA:gs_fcat TYPE lvc_s_fcat,
     gt_fcat TYPE lvc_t_fcat.
DATA:dyn_table  TYPE REF TO data,
     dyn_line   TYPE REF TO data,
     dyn_line1  TYPE REF TO data,
     dyn_handle TYPE REF TO data.
DATA:lcl_struct TYPE REF TO cl_abap_structdescr,
     lcl_tab    TYPE REF TO cl_abap_tabledescr.
DATA:gs_components TYPE abap_componentdescr,
     gt_components TYPE abap_component_tab. "存储动态列的数据对象,在后续cl_abap_structdescr的CREATE方法中用到
DATA gt_col TYPE TABLE OF string.
FIELD-SYMBOLS:<fs_table>    TYPE STANDARD TABLE, "非纵深动态内表字段符号
              <fs_table_zs> TYPE STANDARD TABLE. "纵深动态内表字段符号

PARAMETERS p_col TYPE string OBLIGATORY."填入动态创建的列名,以逗号分隔

START-OF-SELECTION.
  "动态创建非纵深结构内表
  PERFORM frm_fcat.
  PERFORM frm_create_dyn."创建非纵深结构动态内表&&填充数据
  "动态创建纵深结构内表
  PERFORM frm_components."填充列
  PERFORM frm_create_dyn_zs."创建纵深结构动态内表&&填充数据&&显示
*&---------------------------------------------------------------------*
*& Form FRM_FCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fcat .

  SPLIT p_col AT ',' INTO TABLE gt_col.
  LOOP AT gt_col ASSIGNING FIELD-SYMBOL(<fs_col>).
    gs_fcat-fieldname = <fs_col>.
    gs_fcat-coltext = <fs_col> && '描述' .
    gs_fcat-ref_table = 'MAKT'.
    gs_fcat-ref_field = 'MAKTX'.
    APPEND gs_fcat TO gt_fcat.
    CLEAR gs_fcat.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DYN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_dyn .

  DATA: lv_col      TYPE i,
        lv_index(2).
  "创建动态内表
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
*     i_style_table   =
      it_fieldcatalog = gt_fcat
*     i_length_in_byte          =
    IMPORTING
      ep_table        = dyn_table
*     e_style_fname   =
*  EXCEPTIONS
*     generate_subpool_dir_full = 1
*     others          = 2
    .
  ASSIGN dyn_table->* TO <fs_table>.
  CREATE DATA dyn_line LIKE LINE OF <fs_table>.
  ASSIGN dyn_line->* TO FIELD-SYMBOL(<fs_line>).
  "填充数据
  DESCRIBE TABLE gt_col LINES lv_col.
  DO lv_col TIMES.
    lv_index = sy-index.
    ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<fs_field>).
    <fs_field> = '填充值' && lv_index .
  ENDDO.
  APPEND <fs_line> TO <fs_table>.
  DO lv_col TIMES.
    lv_index = sy-index.
    ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO <fs_field>.
    <fs_field> = '填充值' && lv_index .
  ENDDO.
  APPEND <fs_line> TO <fs_table>.
  DO lv_col TIMES.
    lv_index = sy-index.
    ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO <fs_field>.
    <fs_field> = '填充值' && lv_index .
  ENDDO.
  APPEND <fs_line> TO <fs_table>.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_COMPONENTS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_components .

  CLEAR gs_components .
  gs_components-type ?= cl_abap_structdescr=>describe_by_name( 'MAKT-MAKTX' ).
  gs_components-name  = 'col1'.
  APPEND gs_components TO gt_components.
  CLEAR gs_components .
  gs_components-type ?= cl_abap_structdescr=>describe_by_name( 'MAKT-MAKTX' ).
  gs_components-name  = 'col2'.
  APPEND gs_components TO gt_components.
  CLEAR gs_components .
  gs_components-type ?= cl_abap_structdescr=>describe_by_data( <fs_table> ).
  gs_components-name  = 'col3'.
  APPEND gs_components TO gt_components.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DYN_ZS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_dyn_zs .

  DATA ldy_table TYPE REF TO data.
  FIELD-SYMBOLS:<fs_col3> TYPE STANDARD TABLE.
  CREATE DATA ldy_table LIKE <fs_table>.
  ASSIGN ldy_table->* TO <fs_col3>.
  "创建纵深动态内表
  lcl_struct ?= cl_abap_structdescr=>create( gt_components )."创建结构对象
  lcl_tab ?= cl_abap_tabledescr=>create( lcl_struct )."创建表类型对象
  CREATE DATA dyn_handle TYPE HANDLE lcl_tab."参照表类型对象创建动态数据对象
  ASSIGN dyn_handle->* TO <fs_table_zs>."将动态数据对象分配给字段符号
  CREATE DATA dyn_line1 LIKE LINE OF <fs_table_zs>."参照字段符号创建工作区数据对象
  ASSIGN dyn_line1->* TO FIELD-SYMBOL(<fs_line1>).
  "填充纵深动态内表
  DO 3 TIMES.
    IF sy-index NE 3.
      ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line1> TO FIELD-SYMBOL(<fs_field1>).
      <fs_field1> = '填充数据' && sy-index.
    ELSE.
      ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line1> TO <fs_col3>.
      <fs_col3> = <fs_table>.
    ENDIF.
  ENDDO.
  APPEND <fs_line1> TO <fs_table_zs>.
  BREAK-POINT.

ENDFORM.
原文地址:https://www.cnblogs.com/jianglaizhen/p/8809410.html