目录
1、动态内表/结构
方法一
场景:可以用到批导,输入表名导入或者删除对应的数据库表。
*&表名
data p_name TYPE tabname.
DATA: dref_tab TYPE REF TO data,
struct_type TYPE REF TO cl_abap_structdescr,
ls_tab TYPE REF TO cl_abap_tabledescr,
lt_tab TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.
FIELD-SYMBOLS: <fs_data> TYPE any,
<fs_itab> TYPE ANY TABLE.
struct_type ?= cl_abap_structdescr=>describe_by_name( p_name ).
lt_tab[] = struct_type->get_components( ).
struct_type = cl_abap_structdescr=>create( lt_tab[] ).
*CREATE DATA gt_data TYPE HANDLE struct_type.
ls_tab = cl_abap_tabledescr=>create( struct_type ).
CREATE DATA dref_tab TYPE HANDLE ls_tab.
ASSIGN dref_tab->* TO <fs_itab>.
*&动态内表<fs_itab>.
*&动态更新表
MODIFY (p_name) FROM TABLE <fs_itab>.
方法二
TYPE-POOLS:abap,slis.
data p_tab like tabname.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE, "内表指针
<dyn_wa>, "工作区
<dyn_field>. "字段
DATA:dy_table TYPE REF TO data,
dy_line TYPE REF TO data, "行
wa_fcat TYPE lvc_s_fcat, "列结构
it_fcat TYPE lvc_t_fcat.
DATA lt_table TYPE TABLE OF dfies. "字段结构表
DATA ls_table TYPE dfies.
"获取字段名
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = p_tab
TABLES
dfies_tab = lt_table
EXCEPTIONS
not_found = 1
OTHERS = 2.
LOOP AT lt_table INTO ls_table.
MOVE-CORRESPONDING ls_table TO wa_fcat.
APPEND wa_fcat TO it_fcat.
CLEAR wa_fcat.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fcat
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA dy_line LIKE LINE OF <dyn_table>. "动态内表
ASSIGN dy_line->* TO <dyn_wa>. "内表对应的结构
2、实例
描述:把表里所有字段里的 \ 替换成 \\ 。
REPORT ztestd.
*&行转列的内表
DATA: BEGIN OF gs_col,
index TYPE i,
name TYPE string,
value TYPE string,
END OF gs_col.
DATA gt_col LIKE TABLE OF gs_col.
DATA:cl_descr TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <fs> TYPE any.
FIELD-SYMBOLS: <f3> TYPE any.
FIELD-SYMBOLS:<fs_comp> TYPE abap_compdescr.
**动态显示内表
FIELD-SYMBOLS:<fs_dyntab> TYPE table,
<fs_dynwa> TYPE any.
**明细表结构
DATA: gt_alv_cat TYPE TABLE OF lvc_s_fcat,
gs_alv_cat LIKE LINE OF gt_alv_cat.
DATA:lt_ref TYPE REF TO data,
ls_ref TYPE REF TO data.
DATA:gt_table TYPE TABLE OF dntab,
gs_table TYPE dntab.
PARAMETERS p_name TYPE tabname.
START-OF-SELECTION.
*&获得表的字段
CALL FUNCTION 'NAMETAB_GET'
EXPORTING
langu = sy-langu
tabname = p_name
TABLES
nametab = gt_table
EXCEPTIONS
no_texts_found = 1.
*&通过FIELDCAT获得动态内表
LOOP AT gt_table INTO gs_table.
MOVE-CORRESPONDING gs_table TO gs_alv_cat.
APPEND gs_alv_cat TO gt_alv_cat.
CLEAR: gs_alv_cat,gs_table.
ENDLOOP.
*&通过函数内表生成
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_alv_cat
IMPORTING
ep_table = lt_ref.
***指定生成的内表到字段符号
ASSIGN lt_ref->* TO <fs_dyntab>.
CREATE DATA ls_ref LIKE LINE OF <fs_dyntab>.
*&获得动态内表对应的结构
ASSIGN ls_ref->* TO <fs_dynwa>.
*&
SELECT * FROM (p_name) INTO CORRESPONDING FIELDS OF TABLE <fs_dyntab>.
*&获取字段名
cl_descr ?= cl_abap_typedescr=>describe_by_data( <fs_dynwa> ).
*&行转列
LOOP AT <fs_dyntab> INTO <fs_dynwa>.
gs_col-index = sy-tabix.
LOOP AT cl_descr->components ASSIGNING <fs_comp>.
ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_dynwa> TO <fs>.
gs_col-name = <fs_comp>-name.
gs_col-value = <fs>.
APPEND gs_col TO gt_col.
ENDLOOP.
ENDLOOP.
*-------------------------------------------------------
*&处理后保存表,修改数据库表
REFRESH <fs_dyntab>.
CLEAR <fs_dynwa>.
*处理每个值。
LOOP AT gt_col INTO gs_col.
SEARCH gs_col-value FOR '\'.
IF sy-subrc = 0.
REPLACE ALL OCCURRENCES OF '\' IN gs_col-value WITH '\\'.
*&列转行
ASSIGN COMPONENT sy-tabix OF STRUCTURE <fs_dynwa> TO <f3>.
IF <f3> IS ASSIGNED.
<f3> = gs_col-value.
ENDIF.
AT END OF index.
APPEND <fs_dynwa> TO <fs_dyntab>.
ENDAT.
*&------------------------------------
ENDIF.
MODIFY gt_col FROM gs_col.
CLEAR gs_col.
ENDLOOP.
MODIFY (p_name) FROM TABLE <fs_dyntab>.
IF sy-subrc = 0.
MESSAGE '修改成功!' TYPE 'S'.
REFRESH <fs_dyntab>.
ELSE.
MESSAGE '修改失败!' TYPE 'E'.
ENDIF.