ABAP-行列转换
*行表定义
TYPES:BEGIN OF ty001,
name(10), "项目
racct TYPE racct, "科目
dmbtr TYPE wertv12, "金额
END OF ty001,
BEGIN OF ty002,
name(10),
dmbtr01 TYPE wertv12,
dmbtr02 TYPE wertv12,
dmbtr03 TYPE wertv12,
dmbtr04 TYPE wertv12,
dmbtr05 TYPE wertv12,
dmbtr06 TYPE wertv12,
END OF ty002,
BEGIN OF ty003,
racct(10),
fieldname(10),
END OF ty003.
DATA: ls_line TYPE ty001,
lt_line TYPE STANDARD TABLE OF ty001.
DATA: ls_col TYPE ty002,
lt_col TYPE STANDARD TABLE OF ty002.
*行与列的对应关系
DATA: ls_rel TYPE ty003,
lt_rel TYPE HASHED TABLE OF ty003 WITH UNIQUE KEY racct.
DATA: l_num TYPE numc2.
START-OF-SELECTION.
* 行 查询数据
lt_line = VALUE #(
( name = '项目1' racct = '001' dmbtr = 10 )
( name = '项目1' racct = '001' dmbtr = 10 )
( name = '项目5' racct = '005' dmbtr = 50 )
( name = '项目5' racct = '005' dmbtr = 50 )
( name = '项目6' racct = '006' dmbtr = 60 )
( name = '项目2' racct = '002' dmbtr = 20 )
( name = '项目3' racct = '003' dmbtr = 30 )
( name = '项目3' racct = '003' dmbtr = 30 )
( name = '项目4' racct = '004' dmbtr = 40 )
).
SORT lt_line BY name racct.
CALL METHOD cl_demo_output=>write( lt_line ).
*对应关系 去重
CLEAR l_num.
LOOP AT lt_line INTO ls_line GROUP BY ( racct = ls_line-racct ).
l_num = l_num + 1.
CLEAR ls_rel.
ls_rel-racct = ls_line-racct.
ls_rel-fieldname = 'DMBTR' && l_num.
INSERT ls_rel INTO TABLE lt_rel.
ENDLOOP.
*行表转列表 汇总
LOOP AT lt_line INTO ls_line.
READ TABLE lt_col ASSIGNING FIELD-SYMBOL(<fs_col>) WITH TABLE KEY name = ls_line-name.
IF sy-subrc <> 0.
CLEAR ls_col.
ls_col-name = ls_line-name.
INSERT ls_col INTO TABLE lt_col ASSIGNING <fs_col>.
ENDIF.
IF <fs_col> IS ASSIGNED.
*定位对应的字段名
READ TABLE lt_rel INTO ls_rel WITH TABLE KEY racct = ls_line-racct.
IF sy-subrc = 0.
ASSIGN COMPONENT ls_rel-fieldname OF STRUCTURE <fs_col> TO FIELD-SYMBOL(<fs_dmbtr>).
IF sy-subrc = 0.
<fs_dmbtr> = <fs_dmbtr> + ls_line-dmbtr."汇总
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CALL METHOD cl_demo_output=>write( lt_col ).
*列表转行表 汇总
REFRESH lt_line.
LOOP AT lt_col INTO ls_col.
LOOP AT lt_rel INTO ls_rel.
ASSIGN COMPONENT ls_rel-fieldname OF STRUCTURE ls_col TO <fs_dmbtr>.
IF sy-subrc = 0.
IF <fs_dmbtr> IS NOT INITIAL.
CLEAR ls_line.
ls_line-name = ls_col-name.
ls_line-racct = ls_rel-racct.
ls_line-dmbtr = <fs_dmbtr>.
APPEND ls_line TO lt_line.
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
CALL METHOD cl_demo_output=>write( lt_line ).
CALL METHOD cl_demo_output=>display( ).
- 点赞
- 收藏
- 关注作者
评论(0)