代码如下,类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.