【ABAP】动态内表创建

21 篇文章 2 订阅

代码如下,类cl_dynamic_obj也可以在SE24建,方便引用
方法来自博客动态内表,非常强大,代码做了一点修改

*&---------------------------------------------------------------------*
*& Report  ZCREATETABLE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zcreatetable.
TABLES:makt.

*----------------------------------------------------------------------*
*       CLASS zcl_dynamic_obj DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_dynamic_obj DEFINITION.
*  public
*  final
*  create public .

  PUBLIC SECTION.

    TYPE-POOLS abap .
    DATA t_comp TYPE abap_component_tab .

    METHODS add_comp_by_table_line
        IMPORTING
          !p_data TYPE ANY TABLE
          !iv_name TYPE c OPTIONAL
          !iv_as_include TYPE abap_bool OPTIONAL
          !iv_suffix TYPE c OPTIONAL .
    METHODS add_comp_by_data
        IMPORTING
          !p_data TYPE any
          !iv_name TYPE c OPTIONAL
          !iv_as_include TYPE abap_bool OPTIONAL
          !iv_suffix TYPE c OPTIONAL .
    METHODS add_comp_by_data_ref
        IMPORTING
          !p_data_ref TYPE REF TO data
          !iv_name TYPE c OPTIONAL
          !iv_as_include TYPE abap_bool OPTIONAL
          !iv_suffix TYPE c OPTIONAL .
    METHODS add_comp_by_name
        IMPORTING
          !p_name TYPE any
          !iv_name TYPE c OPTIONAL
          !iv_as_include TYPE abap_bool OPTIONAL
          !iv_suffix TYPE c OPTIONAL .
    METHODS create_struct
        RETURNING
          value(ro_data) TYPE REF TO data .
    METHODS create_table
        RETURNING
          value(ro_data) TYPE REF TO data .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.                    "zcl_dynamic_obj DEFINITION



*----------------------------------------------------------------------*
*       CLASS zcl_dynamic_obj IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS cl_dynamic_obj IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_DYNAMIC_OBJ=>ADD_COMP_BY_DATA
* +-------------------------------------------------------------------------------------------------+
* | [--->] P_DATA                         TYPE        ANY
* | [--->] IV_NAME                        TYPE        C(optional)
* | [--->] IV_AS_INCLUDE                  TYPE        ABAP_BOOL(optional)
* | [--->] IV_SUFFIX                      TYPE        C(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD add_comp_by_data.
    DATA lw_comp LIKE LINE OF t_comp.

    lw_comp-type ?= cl_abap_typedescr=>describe_by_data(  p_data  = p_data ).
    lw_comp-name = iv_name.
    lw_comp-as_include = iv_as_include.
    lw_comp-suffix = iv_suffix.
    APPEND lw_comp TO t_comp.
  ENDMETHOD.                    "add_comp_by_data


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_DYNAMIC_OBJ=>ADD_COMP_BY_DATA_REF
* +-------------------------------------------------------------------------------------------------+
* | [--->] P_DATA_REF                     TYPE REF TO DATA
* | [--->] IV_NAME                        TYPE        C(optional)
* | [--->] IV_AS_INCLUDE                  TYPE        ABAP_BOOL(optional)
* | [--->] IV_SUFFIX                      TYPE        C(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD add_comp_by_data_ref.
    DATA lw_comp LIKE LINE OF t_comp.

    lw_comp-type ?= cl_abap_typedescr=>describe_by_data_ref(  p_data_ref ).
    lw_comp-name = iv_name.
    lw_comp-as_include = iv_as_include.
    lw_comp-suffix = iv_suffix.
    APPEND lw_comp TO t_comp.
  ENDMETHOD.                    "add_comp_by_data_ref


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_DYNAMIC_OBJ=>ADD_COMP_BY_NAME
* +-------------------------------------------------------------------------------------------------+
* | [--->] P_NAME                         TYPE        ANY
* | [--->] IV_NAME                        TYPE        C(optional)
* | [--->] IV_AS_INCLUDE                  TYPE        ABAP_BOOL(optional)
* | [--->] IV_SUFFIX                      TYPE        C(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD add_comp_by_name.
    DATA lw_comp LIKE LINE OF t_comp.

    lw_comp-type ?= cl_abap_typedescr=>describe_by_name(  p_name  = p_name ).
    lw_comp-name = iv_name.
    lw_comp-as_include = iv_as_include.
    lw_comp-suffix = iv_suffix.
    APPEND lw_comp TO t_comp.
  ENDMETHOD.                    "add_comp_by_name


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_DYNAMIC_OBJ=>ADD_COMP_BY_TABLE_LINE
* +-------------------------------------------------------------------------------------------------+
* | [--->] P_DATA                         TYPE        ANY TABLE
* | [--->] IV_NAME                        TYPE        C(optional)
* | [--->] IV_AS_INCLUDE                  TYPE        ABAP_BOOL(optional)
* | [--->] IV_SUFFIX                      TYPE        C(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD add_comp_by_table_line.
    DATA lw_comp LIKE LINE OF t_comp.
    DATA lo_wa TYPE REF TO data.
    FIELD-SYMBOLS <lfs_wa> TYPE ANY.

    CREATE DATA lo_wa LIKE LINE OF p_data.
    ASSIGN lo_wa->* TO <lfs_wa>.

    lw_comp-type ?= cl_abap_typedescr=>describe_by_data(  p_data  = <lfs_wa> ).
    lw_comp-name = iv_name.
    lw_comp-as_include = iv_as_include.
    lw_comp-suffix = iv_suffix.
    APPEND lw_comp TO t_comp.
  ENDMETHOD.                    "add_comp_by_table_line


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_DYNAMIC_OBJ=>CREATE_STRUCT
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_DATA                        TYPE REF TO DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD create_struct.
    DATA lr_struct TYPE REF TO cl_abap_structdescr.

    lr_struct = cl_abap_structdescr=>create( p_components = t_comp ) .
    CREATE DATA ro_data TYPE HANDLE lr_struct.
    CLEAR t_comp.
  ENDMETHOD.                    "create_struct


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_DYNAMIC_OBJ=>CREATE_TABLE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_DATA                        TYPE REF TO DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD create_table.
    DATA lr_table TYPE REF TO cl_abap_tabledescr.
    DATA lr_structx TYPE REF TO cl_abap_structdescr.
    lr_structx = cl_abap_structdescr=>create( p_components = t_comp p_strict = '' ).
    lr_table = cl_abap_tabledescr=>create( lr_structx ).
    CREATE DATA ro_data TYPE HANDLE lr_table.
    CLEAR t_comp.
  ENDMETHOD.                    "create_table
ENDCLASS.                    "zcl_dynamic_obj IMPLEMENTATION



DATA zobj TYPE REF TO cl_dynamic_obj.
DATA lr_data TYPE REF TO data.
FIELD-SYMBOLS:<lt_itab> TYPE ANY TABLE,
              <ls_itab>.


*--------------------------------------------------------------------*
*   直接用SE24建的类,用如下语法
*zcl_dynamic_obj=>add_comp_by_name( p_name = 'CHAR1' iv_name = 'SIGN' ).
*zcl_dynamic_obj=>add_comp_by_name( p_name = 'CHAR2' iv_name = 'OPTION' ).
*zcl_dynamic_obj=>add_comp_by_name( p_name = 'MARA-MATNR' iv_name = 'LOW' ).
*lr_data = zobj=>create_table( ).
*--------------------------------------------------------------------*

START-OF-SELECTION.
  CREATE OBJECT zobj.
  CALL METHOD zobj->add_comp_by_name( p_name = 'MAKT-MATNR' iv_name = 'MATNR' ).
  CALL METHOD zobj->add_comp_by_name( p_name = 'MAKT-MAKTX' iv_name = 'MAKTX' ).
  lr_data = zobj->create_table( ).
  ASSIGN lr_data->* TO <lt_itab>.


  SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE <lt_itab> FROM makt
     UP TO 10 ROWS ORDER BY matnr.

  IF sy-subrc = 0.
    LOOP AT <lt_itab> ASSIGNING <ls_itab>.

    ENDLOOP.
  ENDIF.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值