zoukankan      html  css  js  c++  java
  • (原创)创建纵深结构的动态内表

         在上一篇博客中已经给出创建非纵深结构动态内表的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.
  • 相关阅读:
    如何判断栈的增长方向
    时间复杂度
    shell基础part3
    shell基础part2
    shell基础part2
    linux基础part5
    linux基础part4
    linux基础part3
    linux基础part2
    shell基础part1
  • 原文地址:https://www.cnblogs.com/jianglaizhen/p/8809410.html
Copyright © 2011-2022 走看看