zoukankan      html  css  js  c++  java
  • 2019.12.05【ABAP随笔】 分组循环(LOOP AT Group) / REDUCE

    ABAP 7.40新语法 LOOP AT Group 和 REDUCE

     1 *LOOP AT itab result [cond] GROUP BY key ( key1 = dobj1 key2 = dobj2 …
     2 *      [gs = GROUP SIZE] [gi = GROUP INDEX] )
     3 *      [ASCENDING|DESCENDING [AS TEXT]]
     4 *      [WITHOUT MEMBERS]
     5 *      [{INTO group}|{ASSIGNING <group>}]
     6 *
     7 *      [LOOP AT GROUP group|<group>
     8 *
     9 *      ENDLOOP.]
    10 *
    11 *ENDLOOP.
    12 *
    13 *… REDUCE type(
    14 *INIT result = start_value
    15 *
    16 *FOR for_exp1
    17 *FOR for_exp2
    18 *
    19 *NEXT …
    20 *           result = iterated_value
    21 *… )
    22 
    23 
    24 "首先创建一个内表
    25 TYPES:BEGIN OF ty_data,
    26         id       TYPE i, "人员ID
    27         name     TYPE char10, "人员名称
    28         country  TYPE char10, "国家
    29         language TYPE char2, "语言
    30         age      TYPE i,
    31       END OF ty_data,
    32       ty_t_data TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY.
    33 
    34 "数据
    35 DATA(gt_data) = VALUE ty_t_data(
    36 ( id = 1 name = 'Jerry' country = 'China' language = 'ZH' age = 18 )
    37 ( id = 2 name = 'Jack' country = 'China' language = 'ZH' age = 19 )
    38 ( id = 3 name = 'Nick' country = 'Korea' language = 'EN' age = 20 )
    39 ( id = 4 name = 'Rossi' country = 'Korea' language = 'EN' age = 25 )
    40 ( id = 5 name = 'Randy' country = 'Korea' language = 'EN' age = 23 )
    41 ( id = 6 name = 'Tab' country = 'China' language = 'ZH' age = 22 )
    42 ( id = 7 name = 'Lily' country = 'Korea' language = 'EN' age = 21 )
    43 ( id = 8 name = 'Lucy' country = 'China' language = 'EN' age = 24 )
    44 ( id = 9 name = 'Zera' country = 'China' language = 'EN' age = 28 )
    45 ( id = 10 name = 'Grace' country = 'China' language = 'EN' age = 19 )
    46 )
    47 .
    48 
    49 "REDUCE
    50 "1计算年龄最大
    51 DATA(lv_age_max_zh) = REDUCE i( INIT x = 0 FOR lw_data IN gt_data
    52                       WHERE ( language = 'ZH' ) NEXT x = nmax( val1 = x
    53                                                                val2 = lw_data-age )
    54                                                                ) .
    55 WRITE:/ |说中文的人中年龄最大的是:{ lv_age_max_zh  } |.
    56 
    57 "2.输出的reduce
    58 TYPES:outref TYPE REF TO if_demo_output.
    59 DATA(output) = REDUCE outref( INIT out = cl_demo_output=>new( )
    60                               text = 'Count up:'
    61                               FOR n = 1 UNTIL n > 11
    62                               NEXT out = out->write( text )
    63                               text = | { n } | ).
    64 output->display( ).
    65 
    66 "分组循环
    67 "1.ls_data这个工作区里面是没有内容的
    68 "2.<group>里面只有size index 和分组参数
    69 LOOP AT gt_data INTO DATA(ls_data) GROUP BY ( country = ls_data-country language = ls_data-language
    70   size = GROUP SIZE index = GROUP INDEX ) ASCENDING ASSIGNING FIELD-SYMBOL(<group>).
    71 
    72   WRITE:/ |Group:{ <group>-index } Country :{ <group>-country } language : { <group>-language }| &
    73   | Number lines :{ <group>-size } |.
    74 
    75   "3.按照<group>中的分组参数循环 GT_data中的数据
    76   LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).
    77 
    78     WRITE:/ | Name:{ <ls_member>-name } |.
    79 
    80   ENDLOOP.
    81 
    82   DATA(lv_age_max) = REDUCE i( INIT max = 0 FOR lw_member IN GROUP <group>
    83                              NEXT max = nmax( val1 = max val2 = lw_member-age ) ).
    84 
    85   DATA(lv_age_min) = REDUCE i( INIT min = 100 FOR lw_member IN GROUP <group>
    86                                NEXT min = nmin( val1 = min val2 = lw_member-age ) ).
    87 
    88   DATA(lv_age_sum) = REDUCE i( INIT sum = 0 FOR lw_member IN GROUP <group>
    89                                NEXT sum = sum + lw_member-age ).
    90   DATA(lv_age_avg) = lv_age_sum / <group>-size.
    91 
    92   WRITE:/ | 该组最大年龄,最小年龄和平均年龄分别为:{ lv_age_max } { lv_age_min } { lv_age_avg } |.
    93 ENDLOOP.

    结果为:

    个人感觉LOOP AT GROUP 和 REDUCE可以很好的代替 LOOP 中使用 AT END OF field 和 AT NEW field ( 这个是需要调整内表结构字段顺序的)。

    平时用在分组求和,分组操作的时候还是很好用的。

    -TAB 热爱技术 享受生活

  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/jxzhu/p/11989764.html
Copyright © 2011-2022 走看看