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 熱愛技術 享受生活


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM