关于内表数据汇总的一些算法
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赋值1,2,3,。。然后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.
用MODIFY的效率应该更好(可以用transporting限制),不过数据量不大的话就看个人喜好了。