参考江正军老师的[SAP ABAP开发技术总结]反射,动态创建内表、结构、变量
需求:输入一个表名,动态创建一个结构。该结构有2个字段,第一个字段叫tab_name,存放表名信息;第二个字段叫tab_content,是内表,为输入表的结构。
解读: 动态创建类型,就是将前台ddic创建动作的代码化。
如:创建结构,输入字段时,需要输入类型。所以需要先创建该字段的参考类型;
创建表类型时,需要先创建结构,然后参考结构创建表类型。
FORM frm_dynamic_type USING iv_tabname TYPE tabname16.
** 需求:输入一个表名,动态创建一个结构。
** 该结构有2个字段,第一个字段叫tab_name,存放表名信息;
** 第二个字段叫tab_content,是内表,为输入表的结构。
DATA: lo_struct_type TYPE REF TO cl_abap_structdescr,
lo_itab_type TYPE REF TO cl_abap_tabledescr,
lo_elem_type TYPE REF TO cl_abap_elemdescr.
DATA: lt_comp_tab TYPE cl_abap_structdescr=>component_table,
ls_comp_tab TYPE LINE OF cl_abap_structdescr=>component_table.
DATA: lo_req_struct_type TYPE REF TO cl_abap_structdescr,
lo_dref_str TYPE REF TO data.
* 1. 按输入表名,获得对应的结构
lo_struct_type ?= cl_abap_typedescr=>describe_by_name( iv_tabname )."结构类型
* 2. 基于结构类型对象创建内表类型对象
lo_itab_type = cl_abap_tabledescr=>create( lo_struct_type ).
*3. 动态创建基本类型
lo_elem_type ?= cl_abap_elemdescr=>describe_by_name( 'TABNAME16' ).
*4. 准备创建动态结构(2个字段:第一个字段表名,第二个字段为内表)
CLEAR: lt_comp_tab[].
ls_comp_tab-name = 'TAB_NAME'. "为结构新增一个成员
ls_comp_tab-type = lo_elem_type."新增成员的类型对象
APPEND ls_comp_tab TO lt_comp_tab.
CLEAR: ls_comp_tab.
ls_comp_tab-name = 'TAB_CONTENT'.
ls_comp_tab-type = lo_itab_type.
APPEND ls_comp_tab TO lt_comp_tab.
* 动态创建结构类型对象
lo_req_struct_type = cl_abap_structdescr=>create( lt_comp_tab[] ).
CREATE DATA lo_dref_str TYPE HANDLE lo_req_struct_type."使用结构类型对象来创建结构对象
ENDFORM.
运行结果:PERFORM frm_dynamic_type USING 'SPFLI'.