zoukankan      html  css  js  c++  java
  • ABAP动态创建内表并展示--自撸版

    根据别人的经验总结的如下动态创建内表的代码,自撸版

    FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
                   <dyn_wa> TYPE ANY,
                   <dyn_field>.
    DATA: dy_table TYPE REF TO data,
          dy_line  TYPE REF TO data,
          it_structure TYPE lvc_t_fcat,
          wa_structure TYPE lvc_s_fcat.
    
    DATA: lt_table LIKE TABLE OF dntab,
          ls_table TYPE dntab.
    
    DATA gt_fieldcat TYPE slis_t_fieldcat_alv.
    DATA ls_fieldcat LIKE LINE OF gt_fieldcat.
    
    START-OF-SELECTION.
      PERFORM create_structure.        "定义内表的结构
      PERFORM create_dynamic_table.    "按照定义的内表结构,产生一个内表
      PERFORM write_data_to_dyntable.  "向动态内表中写数
      PERFORM show_alv_data.           "显示数据
    *&---------------------------------------------------------------------*
    *&      Form  create_structure
    *&---------------------------------------------------------------------*
    FORM create_structure .
    *  获取表的结构信息
      CALL FUNCTION 'NAMETAB_GET'
        EXPORTING
          langu   = sy-langu
          tabname = 'MARA'
        TABLES
          nametab = lt_table
        EXCEPTIONS
          no_texts_found = 1.
      LOOP AT lt_table INTO ls_table.
        CLEAR wa_structure.
        wa_structure-fieldname = ls_table-fieldname.   "列名
        wa_structure-col_pos   = ls_table-position.    "可以省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
        wa_structure-inttype   = ls_table-inttype.     "数据类型
        wa_structure-intlen    = ls_table-intlen.      "长度
        wa_structure-reptext   = ls_table-fieldtext.   "标题文本
        APPEND wa_structure TO it_structure.
      ENDLOOP.
    ENDFORM.                    " create_structure
    *&---------------------------------------------------------------------*
    *&      Form  create_dynamic_table
    *&---------------------------------------------------------------------*
    FORM create_dynamic_table .
      CALL METHOD cl_alv_table_create=>create_dynamic_table
        EXPORTING
          it_fieldcatalog = it_structure
        IMPORTING
          ep_table        = dy_table.
      ASSIGN dy_table->* TO <dyn_table>.    " 用表类型指针 <dyn_table> 指向 数据对象的内容.
    ENDFORM.                    " create_dynamic_table
    *&---------------------------------------------------------------------*
    *&      Form  write_data_to_dyntable
    *&---------------------------------------------------------------------*
    FORM write_data_to_dyntable .
      DATA: i TYPE n.
      CREATE DATA dy_line LIKE LINE OF <dyn_table>.  " 建立一个与动态内表结构相同的数据对象,且数据对象为是一个结构
      ASSIGN dy_line->* TO <dyn_wa>.                 " 用<dyn_wa>指针指向该结构
      DO 5 TIMES.
        i = i + 1.   "随便写的物料号
        LOOP AT it_structure INTO wa_structure.
          "懒得填数据,所以用IF卡控,随便填物料号
          IF wa_structure-fieldname = 'MATNR'.
            ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.  " 用指针 <dyn_field>指向工作区<dyn_wa>中的一个字段,字段名为wa_structure-fieldname.
            <dyn_field> = i.                                              " 给指针指向的字段赋值
          ENDIF.
        ENDLOOP.
        APPEND <dyn_wa> TO <dyn_table>.
      ENDDO.
    ENDFORM.                    " write_data_to_dyntable
    *&---------------------------------------------------------------------*
    *&      Form  show_alv_data
    *&---------------------------------------------------------------------*
    FORM show_alv_data.
      LOOP AT it_structure INTO wa_structure..
        ls_fieldcat-fieldname = wa_structure-fieldname.
        ls_fieldcat-seltext_m = wa_structure-reptext.
        APPEND ls_fieldcat to gt_fieldcat.
        CLEAR ls_fieldcat.
      ENDLOOP.
    
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          it_fieldcat = gt_fieldcat
        TABLES
          t_outtab    = <dyn_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.

     根据自己定义的内表创建

    FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
                   <dyn_wa> TYPE ANY,
                   <dyn_field>.
    DATA: dy_table TYPE REF TO data,
          dy_line  TYPE REF TO data,
          it_structure TYPE lvc_t_fcat,
          wa_structure TYPE lvc_s_fcat.
    
    DATA: lt_table LIKE TABLE OF dntab,
          ls_table TYPE dntab.
    
    DATA gt_fieldcat TYPE slis_t_fieldcat_alv.
    DATA ls_fieldcat LIKE LINE OF gt_fieldcat.
    
    ***添加结构字段
    DATA:BEGIN OF gt_itab,
           matnr LIKE makt-matnr,
           spras LIKE makt-spras,
           maktx LIKE makt-maktx,
         END OF gt_itab.
    DATA:gt_components LIKE TABLE OF rstrucinfo,
         gs_components LIKE LINE OF gt_components.
    
    START-OF-SELECTION.
      PERFORM create_structure.        "定义内表的结构
      PERFORM create_dynamic_table.    "按照定义的内表结构,产生一个内表
      PERFORM write_data_to_dyntable.  "向动态内表中写数
      PERFORM show_alv_data.           "显示数据
    *&---------------------------------------------------------------------*
    *&      Form  create_structure
    *&---------------------------------------------------------------------*
    FORM create_structure .
    *  获取内表的结构信息
      CALL FUNCTION 'GET_COMPONENT_LIST'
      EXPORTING
        program = sy-repid
        fieldname = 'GT_ITAB'
      TABLES
        components = gt_components.
    
      LOOP AT gt_components INTO gs_components.
        CLEAR wa_structure.
        wa_structure-fieldname = gs_components-compname.   "列名
    *    wa_structure-col_pos   = ls_table-position.    "可以省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
        wa_structure-inttype   = gs_components-type.     "数据类型
        wa_structure-intlen    = gs_components-olen.      "长度
        "标题暂时用hard code
        IF gs_components-compname = 'MATNR'.
          wa_structure-reptext   = '物料号'.            "标题文本
        ELSEIF gs_components-compname = 'SPRAS'.
          wa_structure-reptext   = '语言'.
        ELSEIF gs_components-compname = 'MAKTX'.
          wa_structure-reptext   = '描述'.
        ELSE.
        ENDIF.
        APPEND wa_structure TO it_structure.
      ENDLOOP.
    ENDFORM.                    " create_structure
    *&---------------------------------------------------------------------*
    *&      Form  create_dynamic_table
    *&---------------------------------------------------------------------*
    FORM create_dynamic_table .
      CALL METHOD cl_alv_table_create=>create_dynamic_table
        EXPORTING
          it_fieldcatalog = it_structure
        IMPORTING
          ep_table        = dy_table.
      ASSIGN dy_table->* TO <dyn_table>.    " 用表类型指针 <dyn_table> 指向 数据对象的内容.
    ENDFORM.                    " create_dynamic_table
    *&---------------------------------------------------------------------*
    *&      Form  write_data_to_dyntable
    *&---------------------------------------------------------------------*
    FORM write_data_to_dyntable .
      CREATE DATA dy_line LIKE LINE OF <dyn_table>.  " 建立一个与动态内表结构相同的数据对象,且数据对象为是一个结构
      ASSIGN dy_line->* TO <dyn_wa>.                 " 用<dyn_wa>指针指向该结构
    ***动态字段赋值   暂时用hard code
      DEFINE m_add_value.
        ASSIGN COMPONENT &1 OF STRUCTURE <dyn_wa> TO <dyn_field>.
        <dyn_field> = &2.
        UNASSIGN <dyn_field>.
      END-OF-DEFINITION.
    
      m_add_value 'MATNR' '物料编码'.
      m_add_value 'SPRAS' '语言代码'.
      m_add_value 'MAKTX' '物料名称'.
      APPEND <dyn_wa> TO <dyn_table>.
    ENDFORM.                    " write_data_to_dyntable
    *&---------------------------------------------------------------------*
    *&      Form  show_alv_data
    *&---------------------------------------------------------------------*
    FORM show_alv_data.
      LOOP AT it_structure INTO wa_structure..
        ls_fieldcat-fieldname = wa_structure-fieldname.
        ls_fieldcat-seltext_m = wa_structure-reptext.
        APPEND ls_fieldcat to gt_fieldcat.
        CLEAR ls_fieldcat.
      ENDLOOP.
    
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          it_fieldcat = gt_fieldcat
        TABLES
          t_outtab    = <dyn_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.
  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/seven1314pp/p/15093624.html
Copyright © 2011-2022 走看看