您的位置:首页 > 其它

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

2014-01-15 16:13 316 查看
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(带表头)。

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

REPORT  ydemo_rick_a.
DATA:BEGIN OF itab OCCURS 0,
fld1,
fld2,
fld3 TYPE i,
END OF itab.
DATA wtab LIKE itab.
DATA outtab LIKE TABLE OF  itab WITH HEADER LINE.
itab-fld1 = 'a'.
itab-fld2 = 'a'.
itab-fld3 = 1.
APPEND itab.

itab-fld1 = 'a'.
itab-fld2 = 'b'.
itab-fld3 = 2.
APPEND itab.

itab-fld1 = 'b'.
itab-fld2 = 'a'.
itab-fld3 = 3.
APPEND itab.

LOOP AT itab.
WRITE: itab-fld1,itab-fld2,itab-fld3, / .
ENDLOOP.

ULINE.

LOOP AT itab.
ON CHANGE OF itab-fld1.
wtab = itab.
ELSE.
**MOTHOD 1
wtab-fld3 = itab-fld3.
DELETE itab.
COLLECT wtab INTO itab.
**MOTHOD 2
*    ADD itab-fld3 TO wtab-fld3.
*    DELETE itab.
*    MODIFY TABLE itab FROM wtab  TRANSPORTING fld3.
***用MODIFY的效率应该更好(可以用transporting限制)不过数据量不大的话就看个人喜好了。
ENDON.
ENDLOOP.
****下面为一种笨方法
*LOOP AT itab.
*  ON CHANGE OF itab-fld1.
*    APPEND itab TO outtab.
*    outtab = itab.            "记下汇总行
*  ELSE.
*    outtab-fld3 = itab-fld3.
*    COLLECT  outtab.
*  ENDON.
*ENDLOOP.

LOOP AT itab.
WRITE: itab-fld1,itab-fld2,itab-fld3, / .
ENDLOOP.


View Code

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: