ABAP 行表与列表的转换

通过ASSIGN COMPONENT 语句实现行表/列表的互相转换.

ASSIGN COMPONENT 语句是动态编程的核心语句. 灵活掌握可以实现更多的复杂的功能.

*&---------------------------------------------------------------------*
*& Report  ZSU_TEST_2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Report ZTS_COL_TO_LINE
*&---------------------------------------------------------------------*
*&用于演示行表与列表的互相转换方式
*&---------------------------------------------------------------------*
REPORT ZSU_TEST_2.
*行表定义
DATA: BEGIN OF LW_LINE,
        NAME(10),  "姓名
        CAT(10),   "产品
        SL       TYPE I,
      END OF LW_LINE.
DATA: LT_LINE LIKE TABLE OF LW_LINE.
*列表定义
DATA: BEGIN OF LW_COL,
        NAME(10),
        CATSL01  TYPE I,
        CATSL02  TYPE I,
        CATSL03  TYPE I,
      END OF LW_COL.
DATA: LT_COL LIKE HASHED TABLE OF  LW_COL WITH UNIQUE KEY NAME.

START-OF-SELECTION.

*行表赋值
  LT_LINE = VALUE #(
  ( NAME = '张三' CAT = '电视'  SL = 10  )
  ( NAME = '张三' CAT = '手机'  SL = 20  )
  ( NAME = '张三' CAT = '冰箱'  SL = 30  )
  ( NAME = '李四' CAT = '电视'  SL = 40  )
  ( NAME = '李四' CAT = '电视'  SL = 5   )
  ( NAME = '李四' CAT = '手机'  SL = 50  )
  ( NAME = '王五' CAT = '冰箱'  SL = 60  )
  ).
  CALL METHOD CL_DEMO_OUTPUT=>WRITE( LT_LINE ).
*行表转换成列表
**建立产品与列的对应关系,
  DATA: BEGIN OF LW_REL,
          CAT(10),
          FIELDNAME(10),
        END OF LW_REL.
  DATA: LT_REL LIKE HASHED TABLE OF LW_REL WITH UNIQUE KEY CAT.
  DATA: LV_NUMC2 TYPE NUMC2.
  CLEAR LV_NUMC2.
  LOOP AT LT_LINE INTO DATA(LW_GP) GROUP BY ( CAT = LW_GP-CAT ).
    LV_NUMC2 = LV_NUMC2 + 1.
    CLEAR LW_REL.
    LW_REL-CAT = LW_GP-CAT.
    LW_REL-FIELDNAME = 'CATSL' && LV_NUMC2.
    INSERT LW_REL INTO TABLE LT_REL.
  ENDLOOP.

*循环行表,统计并赋值列表内容
  LOOP AT LT_LINE INTO LW_LINE.
    READ TABLE LT_COL ASSIGNING FIELD-SYMBOL(<FS_COL>) WITH TABLE KEY NAME = LW_LINE-NAME.
    IF SY-SUBRC <> 0.
      CLEAR LW_COL.
      LW_COL-NAME = LW_LINE-NAME.
      INSERT LW_COL INTO TABLE LT_COL ASSIGNING <FS_COL>.
    ENDIF.
    IF <FS_COL> IS ASSIGNED.
*定位产品对应的字段名
      READ TABLE LT_REL INTO LW_REL WITH TABLE KEY CAT = LW_LINE-CAT.
      IF SY-SUBRC = 0.
        ASSIGN COMPONENT LW_REL-FIELDNAME OF STRUCTURE <FS_COL> TO FIELD-SYMBOL(<FS_SL>).
        IF SY-SUBRC = 0.
          <FS_SL> = <FS_SL> + LW_LINE-SL.  "统计数量
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

  CALL METHOD CL_DEMO_OUTPUT=>WRITE( LT_COL ).

*列表转行表的方式
  REFRESH LT_LINE.
  LOOP AT LT_COL INTO LW_COL.
    LOOP AT LT_REL INTO LW_REL.
      ASSIGN COMPONENT LW_REL-FIELDNAME OF STRUCTURE LW_COL TO <FS_SL>.
      IF SY-SUBRC = 0.
        IF <FS_SL> IS NOT INITIAL.
          CLEAR LW_LINE.
          LW_LINE-NAME = LW_COL-NAME.
          LW_LINE-CAT = LW_REL-CAT.
          LW_LINE-SL = <FS_SL>.
          APPEND LW_LINE TO LT_LINE.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  CALL METHOD CL_DEMO_OUTPUT=>WRITE( LT_LINE ).
  CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( ).


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值