SAP ABAP LOOP GROUP BY 分组循环的使用方法
1.3.19 关键字GROUP BY用法
LOOP GROUP BY 分组循环的使用方法
1.格式:
LOOP AT 内表 INTO DATA(工作区) GROUP BY ( 字段 = 工作区-字段
size = GROUP SIZE "分组组数--
index = GROUP INDEX ) "分组的组序号
ASCENDING ASSIGNING FIELD-SYMBOL(<组>).
LOOP AT GROUP <组> ASSIGNING FIELD-SYMBOL(<指针>).
"对指针进行操作,和普通的loop循环相似
ENDLOOP
2.简而言之:就是第一个loop循环是把内表进行分组,第二loop循环是把组里的数据循环读出来进行修改判断等操作。
3.可以替代AT END OF /AT NEW OF。
4. 具体实例
TYPES: BEGIN OF ty_employee,
name TYPE char30,
role TYPE char30,
age TYPE i,
sex TYPE char10,
END OF ty_employee,
ty_employee_t TYPE STANDARD TABLE OF ty_employee WITH KEY name.
"对内表进行赋值"
DATA(gt_employee) = VALUE ty_employee_t(
( name = 'John' role = 'ABAP' age = 34 sex = 'MAN' )
( name = 'Alice' role = 'FI Consultant' age = 42 sex = 'WOMAN' )
( name = 'Barry' role = 'ABAP' age = 54 sex = 'WOMAN' )
( name = 'Mary' role = 'FI Consultant' age = 37 sex = 'WOMAN' )
( name = 'Arthur' role = 'ABAP' age = 34 sex = 'MAN' )
( name = 'Mandy' role = 'SD Consultant' age = 64 sex = 'MAN' ) ).
DATA: gv_tot_age TYPE i,
gv_avg_age TYPE decfloat34.
"通过角色进行分组"
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: gv_tot_age.
WRITE: / | 组序号: { <group>-index } 角色: { <group>-role WIDTH = 15 }|
& | 这个组有几条数据: { <group>-size } |.
"loop循环组,将组里的数据读出来"
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).
gv_tot_age = gv_tot_age + <ls_member>-age.
WRITE: /13 <ls_member>-name .
ENDLOOP.
gv_avg_age = gv_tot_age / <group>-size.
WRITE: / |组平均年龄: { gv_avg_age }|.
SKIP.
ENDLOOP.
执行效果:
具体实例2:
“按照楼栋编码+产品类型+经营属性汇总
READ TABLE lt_zspl0016_1 TRANSPORTING NO FIELDS WITH KEY posid = ls_itab_ld-posid BINARY SEARCH.
IF sy-subrc IS INITIAL.
LOOP AT lt_zspl0016_1 INTO DATA(ls_zspl0016_1) FROM sy-tabix WHERE posid = ls_itab_ld-posid
GROUP BY ( posid = ls_zspl0016_1-posid
cp_num = ls_zspl0016_1-cp_num
jysx_id = ls_zspl0016_1-jysx_id ).
实例3:
" 权限组织和员工子组数据整合
CLEAR: lt_auth_aa.
LOOP AT lt_auth_a INTO ls_auth_s GROUP BY ( otype = ls_auth_s-otype
objid = ls_auth_s-objid
index = GROUP INDEX
size = GROUP SIZE
) INTO DATA(lt_grp_auth_z).
CLEAR: ls_auth_aa,lt_auth_s_zz.
ls_auth_aa-otype = lt_grp_auth_z-otype.
ls_auth_aa-objid = lt_grp_auth_z-objid.
LOOP AT GROUP lt_grp_auth_z INTO DATA(ls_grp_auth_z).
DELETE ls_grp_auth_z-auth_s WHERE rtype IS INITIAL.
IF ls_grp_auth_z-auth_s IS INITIAL.
CLEAR lt_auth_s_zz.
EXIT.
ENDIF.
LOOP AT ls_grp_auth_z-auth_s INTO DATA(ls_auth_ss).
COLLECT ls_auth_ss INTO lt_auth_s_zz.
ENDLOOP.
ENDLOOP.
ls_auth_aa-auth_s = lt_auth_s_zz.
APPEND ls_auth_aa TO lt_auth_aa.
ENDLOOP.