通过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( ).