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.
Endif.
*&------------------------------------
AT END OF index. "at end 当index字段及左侧字段的值与下一行不同时触发block,此时右侧视
"为空不比较,debug可以看到。 常用还有 at first 第一行 at last 最后行
"at new 相应字段及左侧字段的值与上一行不同时触发,右侧视为空
APPEND <fs_dynwa> TO <fs_dyntab>.
ENDAT.
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.
————————————————
版权声明:本文为CSDN博主「幕夜三分寒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31799157/article/details/122362751