ABAP 新语法 LOOP AT Group 和 REDUCE 分组循环


 

*LOOP AT itab result [cond] GROUP BY key ( key1 = dobj1 key2 = dobj2 …
*      [gs = GROUP SIZE] [gi = GROUP INDEX] )
*      [ASCENDING|DESCENDING [AS TEXT]]
*      [WITHOUT MEMBERS]
*      [{INTO group}|{ASSIGNING <group>}]
*      …
*      [LOOP AT GROUP group|<group>
*      …
*      ENDLOOP.]
*      …
*ENDLOOP.
*
*… REDUCE type(
*INIT result = start_value
*           …
*FOR for_exp1
*FOR for_exp2
*…
*NEXT …
*           result = iterated_value
*… )


"首先创建一个内表
TYPES:BEGIN OF ty_data,
        id       TYPE i, "人员ID
        name     TYPE char10, "人员名称
        country  TYPE char10, "国家
        language TYPE char2, "语言
        age      TYPE i,
      END OF ty_data,
      ty_t_data TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY.

"数据
DATA(gt_data) = VALUE ty_t_data(
( id = 1 name = 'Jerry' country = 'China' language = 'ZH' age = 18 )
( id = 2 name = 'Jack' country = 'China' language = 'ZH' age = 19 )
( id = 3 name = 'Nick' country = 'Korea' language = 'EN' age = 20 )
( id = 4 name = 'Rossi' country = 'Korea' language = 'EN' age = 25 )
( id = 5 name = 'Randy' country = 'Korea' language = 'EN' age = 23 )
( id = 6 name = 'Tab' country = 'China' language = 'ZH' age = 22 )
( id = 7 name = 'Lily' country = 'Korea' language = 'EN' age = 21 )
( id = 8 name = 'Lucy' country = 'China' language = 'EN' age = 24 )
( id = 9 name = 'Zera' country = 'China' language = 'EN' age = 28 )
( id = 10 name = 'Grace' country = 'China' language = 'EN' age = 19 )
)
.

"REDUCE
"1计算年龄最大
DATA(lv_age_max_zh) = REDUCE i( INIT x = 0 FOR lw_data IN gt_data
                      WHERE ( language = 'ZH' ) NEXT x = nmax( val1 = x
                                                               val2 = lw_data-age )
                                                               ) .
WRITE:/ |说中文的人中年龄最大的是:{ lv_age_max_zh  } |.

"2.输出的reduce
TYPES:outref TYPE REF TO if_demo_output.
DATA(output) = REDUCE outref( INIT out = cl_demo_output=>new( )
                              text = 'Count up:'
                              FOR n = 1 UNTIL n > 11
                              NEXT out = out->write( text )
                              text = | { n } | ).
output->display( ).

"分组循环
"1.ls_data这个工作区里面是没有内容的
"2.<group>里面只有size index 和分组参数
LOOP AT gt_data INTO DATA(ls_data) GROUP BY ( country = ls_data-country language = ls_data-language
  size = GROUP SIZE index = GROUP INDEX ) ASCENDING ASSIGNING FIELD-SYMBOL(<group>).

  WRITE:/ |Group:{ <group>-index } Country :{ <group>-country } language : { <group>-language }| &
  | Number lines :{ <group>-size } |.

  "3.按照<group>中的分组参数循环 GT_data中的数据
  LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).

    WRITE:/ | Name:{ <ls_member>-name } |.

  ENDLOOP.

  DATA(lv_age_max) = REDUCE i( INIT max = 0 FOR lw_member IN GROUP <group>
                             NEXT max = nmax( val1 = max val2 = lw_member-age ) ).

  DATA(lv_age_min) = REDUCE i( INIT min = 100 FOR lw_member IN GROUP <group>
                               NEXT min = nmin( val1 = min val2 = lw_member-age ) ).

  DATA(lv_age_sum) = REDUCE i( INIT sum = 0 FOR lw_member IN GROUP <group>
                               NEXT sum = sum + lw_member-age ).
  DATA(lv_age_avg) = lv_age_sum / <group>-size.

  WRITE:/ | 该组最大年龄,最小年龄和平均年龄分别为:{ lv_age_max } { lv_age_min } { lv_age_avg } |.
ENDLOOP.
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值