ABAP-行列转换

举报
Mr_blank 发表于 2025/03/26 13:54:23 2025/03/26
【摘要】 行列转换

*行表定义
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( ).

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。