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)