通过下面3个实例代码来理解 LOOP GROUP BY
例子1
测试代码及运行结果如下
REPORT ZENG_T01.
TYPES:
BEGIN OF struct,
key1 TYPE string,
key2 TYPE string,
col TYPE i,
END OF struct,
itab TYPE STANDARD TABLE OF struct WITH EMPTY KEY.
DATA(itab) = VALUE itab(
( key1 = `a` key2 = `a` col = 1 )
( key1 = `a` key2 = `b` col = 2 )
( key1 = `a` key2 = `a` col = 3 )
( key1 = `a` key2 = `a` col = 4 )
( key1 = `a` key2 = `b` col = 5 )
( key1 = `b` key2 = `a` col = 6 )
( key1 = `b` key2 = `a` col = 7 ) ).
LOOP AT itab ASSIGNING FIELD-SYMBOL(<wa>)
GROUP BY ( key1 = <wa>-key1 key2 = <wa>-key2 ).
cl_demo_output=>write( <wa> ).
ENDLOOP.
cl_demo_output=>display( ).
运行输出结果如下
例子2
测试代码及运行结果如下
REPORT ZENG_T02.
TYPES:
BEGIN OF struct,
key1 TYPE string,
key2 TYPE string,
col TYPE i,
END OF struct,
itab TYPE STANDARD TABLE OF struct WITH EMPTY KEY.
DATA(itab) = VALUE itab(
( key1 = `a` key2 = `a` col = 1 )
( key1 = `a` key2 = `b` col = 2 )
( key1 = `a` key2 = `a` col = 3 )
( key1 = `a` key2 = `a` col = 4 )
( key1 = `a` key2 = `b` col = 5 )
( key1 = `b` key2 = `a` col = 6 )
( key1 = `b` key2 = `a` col = 7 ) ).
LOOP AT itab ASSIGNING FIELD-SYMBOL(<wa>)
GROUP BY ( key1 = <wa>-key1 key2 = <wa>-key2 )
WITHOUT MEMBERS
REFERENCE INTO DATA(group_key).
cl_demo_output=>write( group_key->* ).
ENDLOOP.
cl_demo_output=>display( ).
运行输出结果如下:
例子3
测试代码及运行结果如下
REPORT ZENG_T03.
TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.
TYPES: BEGIN OF TY_EMPLOYEE,
NAME TYPE CHAR30,
ROLE TYPE CHAR30,
AGE TYPE I,
END OF TY_EMPLOYEE,
TY_EMPLOYEE_T TYPE STANDARD TABLE OF TY_EMPLOYEE WITH KEY NAME.
DATA(GT_EMPLOYEE) = VALUE TY_EMPLOYEE_T(
( NAME = 'Mao' ROLE = 'ABAP guru' AGE = 29 )
( NAME = 'Zhangjie' ROLE = 'FI Consultant' AGE = 33 )
( NAME = 'Hujianchun' ROLE = 'ABAP guru' AGE = 37 )
( NAME = 'XiaoLiu' ROLE = 'FI Consultant' AGE = 31 )
( NAME = 'Xiuxianhai' ROLE = 'ABAP guru' AGE = 30 )
( NAME = 'Huangping' ROLE = 'SD Consultant' AGE = 42 ) ).
DATA: P_MENGE0 TYPE I.
DATA: P_MENGE2 TYPE I.
"Loop with grouping on Role 1
LOOP AT GT_EMPLOYEE INTO DATA(LS_EMPLOYEE)
GROUP BY ( ROLE = LS_EMPLOYEE-ROLE
SIZE = GROUP SIZE
INDEX = GROUP INDEX )
ASCENDING
ASSIGNING FIELD-SYMBOL(<GROUP>).
CLEAR:P_MENGE0 .
LOOP AT GROUP <GROUP> ASSIGNING FIELD-SYMBOL(<LS_MEMBER>).
P_MENGE0 = P_MENGE0 + <LS_MEMBER>-AGE.
ENDLOOP.
WRITE:/ P_MENGE0.
CLEAR P_MENGE0.
ENDLOOP.
"Loop with grouping on Role 2
LOOP AT GT_EMPLOYEE INTO DATA(LS_EMPLOYEE01)
GROUP BY ( ROLE = LS_EMPLOYEE01-ROLE ) INTO DATA(KEY2).
CLEAR:P_MENGE2 .
LOOP AT GROUP KEY2 INTO DATA(MEMBER2).
P_MENGE2 = P_MENGE2 + MEMBER2-AGE.
ENDLOOP.
WRITE:/ P_MENGE2.
CLEAR P_MENGE2.
ENDLOOP.
运行输出结果如下: