关于内表数据汇总的一些算法

1.把某个字段相同行的数值型数据字段汇总

如:

初始数据

FLD1

FLD2

FLD3

a

a

1

a

b

2

b

a

3

处理后数据

FLD1

FLD2

FLD3

a

a

3

b

a

3

其中:fld1,fld2为字符型,fld3为数值型。

 

要求

现在我们的要求是:fld1相同的行的FLD3汇总到最前面那行(如果要汇总到最后那行,可以为itab一个字段设fld4赋值123,。。然后sort itab by fld1 descending fld4 discending.再做下面的运算)

并把多余的行删除。

实际情况:(这是相当于FLD1是父结点,FLD2是子结点,FLD3为数值)现在的要求就是求父结点的值(为所有子结点的值之和)

假设数据已经存在内表ITAB(带表头)。

最简单&效率应该也是最快的(个人认为,有更好方法的童鞋欢迎交流)

 

 1 REPORT  ydemo_rick_a.
 2 DATA:BEGIN OF itab OCCURS 0,
 3     fld1,
 4     fld2,
 5     fld3 TYPE i,
 6   END OF itab.
 7 DATA wtab LIKE itab.
 8 DATA outtab LIKE TABLE OF  itab WITH HEADER LINE.
 9 itab-fld1 = 'a'.
10 itab-fld2 = 'a'.
11 itab-fld3 = 1.
12 APPEND itab.
13 
14 itab-fld1 = 'a'.
15 itab-fld2 = 'b'.
16 itab-fld3 = 2.
17 APPEND itab.
18 
19 itab-fld1 = 'b'.
20 itab-fld2 = 'a'.
21 itab-fld3 = 3.
22 APPEND itab.
23 
24 LOOP AT itab.
25   WRITE: itab-fld1,itab-fld2,itab-fld3, / .
26 ENDLOOP.
27 
28 ULINE.
29 
30 LOOP AT itab.
31   ON CHANGE OF itab-fld1.
32     wtab = itab.
33   ELSE.
34 **MOTHOD 1
35     wtab-fld3 = itab-fld3.
36     DELETE itab.
37     COLLECT wtab INTO itab.
38 **MOTHOD 2
39 *    ADD itab-fld3 TO wtab-fld3.
40 *    DELETE itab.
41 *    MODIFY TABLE itab FROM wtab  TRANSPORTING fld3.
42 ***用MODIFY的效率应该更好(可以用transporting限制)不过数据量不大的话就看个人喜好了。
43   ENDON.
44 ENDLOOP.
45 ****下面为一种笨方法
46 *LOOP AT itab.
47 *  ON CHANGE OF itab-fld1.
48 *    APPEND itab TO outtab.
49 *    outtab = itab.            "记下汇总行
50 *  ELSE.
51 *    outtab-fld3 = itab-fld3.
52 *    COLLECT  outtab.
53 *  ENDON.
54 *ENDLOOP.
55 
56 LOOP AT itab.
57   WRITE: itab-fld1,itab-fld2,itab-fld3, / .
58 ENDLOOP.
View Code

MODIFY的效率应该更好(可以用transporting限制),不过数据量不大的话就看个人喜好了。

原文地址:https://www.cnblogs.com/ruingy/p/3521031.html