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

           有时我们最终要输出的内表字段并不是固定的,可能随着情况的变化而变化,此时我们就需要用到动态内表。一般来讲,创建动态内表的方式有两种。一种是调用cl_alv_table_create 的create_dynamic_table 方法,这种创建只能适用于最终创建的动态内表是非纵深结构(参考的扁平结构内未嵌套扁平结构)的情况,还有一种是调用类CL_ABAP_STRUCTDESCR和类CL_ABAP_TABLEDESCR的相关方法,可以创建纵深结构的动态内表。

    纵深结构示例(扁平结构LVC_S_SCOL内嵌套扁平结构LVC_S_COLO):

           这次先给出一个创建非纵深结构动态内表的DEMO示例:

    输出目标:根据选择屏幕中填入的列名输出ALV,列名之间用逗号分隔。

    源代码:

    *&---------------------------------------------------------------------*
    *& Report Z15540_DYN01
    *&---------------------------------------------------------------------*
    *&
    *&---------------------------------------------------------------------*
    REPORT z15540_dyn01.
    DATA:gs_layo TYPE lvc_s_layo,
         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.
    DATA gt_col TYPE TABLE OF string.
    FIELD-SYMBOLS:<fs_table> TYPE STANDARD TABLE.
    
    PARAMETERS p_col TYPE string OBLIGATORY."填入动态创建的列名,以逗号分隔
    
    START-OF-SELECTION.
      PERFORM frm_layo.
      PERFORM frm_fcat.
      PERFORM frm_create_dyn."创建动态内表&&填充数据
      PERFORM frm_alv_dispaly.
    
    *&---------------------------------------------------------------------*
    *& Form FRM_LAYO
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM frm_layo .
      CLEAR gs_layo.
      gs_layo-zebra = 'X'.
      gs_layo-cwidth_opt = 'X'.
    ENDFORM.
    *&---------------------------------------------------------------------*
    *& 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_ALV_DISPALY
    *&---------------------------------------------------------------------*
    *& text
    *&---------------------------------------------------------------------*
    *& -->  p1        text
    *& <--  p2        text
    *&---------------------------------------------------------------------*
    FORM frm_alv_dispaly .
      "显示ALV
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
    *     I_CALLBACK_PROGRAM = SY-REPID
          is_layout_lvc   = gs_layo
          it_fieldcat_lvc = gt_fcat
        TABLES
          t_outtab        = <fs_table>
        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.
  • 相关阅读:
    静态变量和非静态实例变量的区别
    引用iScroll.js实现上拉和下拖刷新
    微信公众平台开发(一) 配置接口
    Javascript中event.srcElement和event.target的区别
    js执行环境的深入理解
    jQuery on()方法
    JAVA基本类库介绍
    Java程序员学习之路
    Java以基础类库
    jQuery插件的开发之$.extend(),与$.fn.extend()
  • 原文地址:https://www.cnblogs.com/jianglaizhen/p/8808787.html
Copyright © 2011-2022 走看看