ABAP程序内表中的数量和金额字段  经常会需要合计, SUM和COLLECT 语法都能实现对数量和金额字段的合计。

1. SUM语法 
ABAP中SUM语句比不上EXCEL里的强大;
SUM只能在loop循环中使用,一般和AT-ENDAT配合使用。
使用SUM语句的先决条件包含在loop中使用加法INTO,以及指定的工作区域wa与内部表的行类型兼容。此外,当内部表itab的行类型包含表组件时,不能使用SUM。

DEMO

  1. DATA:
  2. BEGIN OF wa,
  3. col1 TYPE i,
  4. col2 TYPE i,
  5. END OF wa,
  6. itab LIKE TABLE OF wa WITH EMPTY KEY.
  7.  
  8. itab = VALUE #( FOR i = UNTIL i >
  9. FOR j = UNTIL j > i
  10. ( col1 = i col2 = j ) ).
  11.  
  12. LOOP AT itab INTO wa.
  13. AT END OF col1.
  14. SUM.
  15. cl_demo_output=>write( wa ).
  16. ENDAT.
  17. ENDLOOP.
  18. cl_demo_output=>display( wa ).

内表ITAB中有15行数据

显示:

2. COLLECT语法

语法:COLLECT wa INTO itab [result].

此语句将工作区域的内容作为内部表itab中的单行插入,或者将其数值组件的值添加到具有相同主表键的现有行的对应值中。会对 数值型字段:I 类型, QUAN 类型,CURR类型的字段做汇总,字符型字段视为汇总条件,所以COLLECT 一般是用内表中的字符型字段作为KEY值 做汇总。

  1. *&---------------------------------------------------------------------*
  2. *& Report YCX_COLLECT1
  3. *&---------------------------------------------------------------------*
  4. *&
  5. *&---------------------------------------------------------------------*
  6. REPORT ycx_collect1.
  7.  
  8. TYPES:
  9. BEGIN OF line,
  10. key TYPE c LENGTH ,
  11. num TYPE i,
  12. END OF line.
  13. DATA
  14. itab TYPE SORTED TABLE OF line
  15. WITH UNIQUE KEY key.
  16.  
  17. DATA(rnd) = cl_abap_random_int=>create( seed = + sy-uzeit
  18. min =
  19. max = ).
  20.  
  21. DO.
  22. COLLECT VALUE line( key = COND #( LET r = rnd->get_next( ) IN
  23. WHEN r = THEN 'X'
  24. WHEN r = THEN 'Y'
  25. WHEN r = THEN 'Z' )
  26. num = ) INTO itab
  27. ASSIGNING FIELD-SYMBOL(<fs>).
  28. IF <fs>-num = .
  29. EXIT.
  30. ENDIF.
  31. ENDDO.
  32.  
  33. cl_demo_output=>display( itab ).

再比如,通过工厂,物料汇总数量

  1. DATA: BEGIN OF i_mi OCCURS ,
  2. matnr LIKE zhkmi-matnr,
  3. werks LIKE zhkmi-werks,
  4. menge LIKE zhkmi-menge,
  5. END OF i_mi.
  6.  
  7. START-OF-SELECTION.
  8.  
  9. SELECT matnr werks menge
  10. INTO CORRESPONDING FIELDS OF TABLE i_mi
  11. FROM zhkmi.
  12.  
  13. SORT i_mi BY matnr werks.
  14.  
  15. LOOP AT i_mi.
  16. i_collect-zkind = 'P'.
  17. i_collect-matnr = i_mi-matnr.
  18. i_collect-werks = i_mi-werks.
  19. i_collect-menge = i_mi-menge.
  20. COLLECT i_collect.
  21. CLEAR i_collect.
  22. ENDLOOP.

做个简单例子展示 sum和collect 实现汇总:

  1. *&---------------------------------------------------------------------*
  2. *& Report YCX_SUM
  3. *&---------------------------------------------------------------------*
  4. *&
  5. *&---------------------------------------------------------------------*
  6. REPORT ycx_sum.
  7.  
  8. DATA: BEGIN OF line,
  9. col1 TYPE c,
  10. col2 TYPE i,
  11. END OF line.
  12. DATA: itab LIKE line OCCURS ,
  13. lt_collect LIKE line OCCURS WITH HEADER LINE.
  14.  
  15. DO TIMES.
  16. line-col1 = sy-index.
  17. line-col2 = sy-index ** .
  18. APPEND line TO itab.
  19. ENDDO.
  20.  
  21. **显示内表数据
  22. LOOP AT itab INTO line.
  23. WRITE: / line-col1, line-col2.
  24. ENDLOOP.
  25.  
  26. WRITE:/'SUM汇总数据'.
  27. **使用SUM 汇总
  28. LOOP AT itab INTO line.
  29. AT END OF col1.
  30. SUM.
  31. WRITE: / line-col1, line-col2.
  32. ENDAT.
  33. ENDLOOP.
  34.  
  35. WRITE:/'SUM汇(不使用AT END OF)'.
  36. **使用SUM 汇总
  37. LOOP AT itab INTO line.
  38. SUM.
  39. WRITE: / line-col1, line-col2.
  40. ENDLOOP.
  41.  
  42. **使用COLLECT 汇总
  43. LOOP AT itab INTO line.
  44. lt_collect-col1 = line-col1.
  45. lt_collect-col2 = line-col2.
  46. COLLECT lt_collect.
  47. CLEAR: lt_collect.
  48. ENDLOOP.
  49. WRITE:/'COLLECT汇总数据'.
  50.  
  51. LOOP AT lt_collect.
  52. WRITE: / lt_collect-col1, lt_collect-col2.
  53. ENDLOOP.

ABAP_DEMO篇33 SUM和COLLECT的用法的更多相关文章

  1. mysql sum() 求和函数的用法

    查询在record表中 name=? 的 money 加起来的值使用聚和函数 sum() 求和select sum(money) from record t where t.name = ?另外:co ...

  2. ORACLE PL/SQL开发--bulk collect的用法 .

    刚刚在inthirties老大的博客里看到这篇文章,写的不错,正好自己最近在学习PL/SQL,转过来学习学习. ============================================ ...

  3. (转载)OC学习篇之---协议的概念和用法

    在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...

  4. Oracle分析函数 — sum, rollup, cube, grouping用法

    本文通过例子展示sum, rollup, cube, grouping的用法. //首先建score表 create table score( class  nvarchar2(20), course ...

  5. ABAP中Collect的用法

    vaule:collect在非数值字段相同的情况下,起到了数值字段汇总作用. 非数值字段不同的情况下,效果和append相同执行插入内表操作,当非数值字段相同的时候,则相当于modify的效果,只不过 ...

  6. oracle中bulk collect into用法

    通过bulk collect减少loop处理的开销 采用bulk collect可以将查询结果一次性地加载到collections中. 而不是通过cursor一条一条地处理. 可以在select in ...

  7. (高级篇)jQuery学习之jQuery Ajax用法详解

    jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍. 我们先从最简单的方法看起 ...

  8. OC学习篇之---协议的概念和用法

    这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...

  9. ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法

    NuGet包"Microsoft.AspNetCore.Diagnostics"中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户 ...

随机推荐

  1. NodeJS安装及部署(Linux系统)

    环境说明:Linux环境,CentOS 7版本. 第一步:下载node地址:https://nodejs.org/en/download/ 下载后,是一个[node-v10.16.0-linux-x6 ...

  2. Java学习:线程池

    线程池 线程池概念:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 线程池:容器-->集合(ArrayList,Hash ...

  3. ES7.3.0配置

    # elasticsearch.yml cluster.name: my-application node.name: node-1 node.master: true node.ingest: tr ...

  4. 7、VUE事件

    1.事件处理 Vue.js使用v-on指令监听DOM事件来触发JS回调函数. V-on: 缩写为 @ 事件回调函数可以传入$event这个事件对象. 2.事件修饰符 在事件处理程序中调用event.p ...

  5. 阿里云RDS数据库sql server 导入数据并添加作业小结

    在阿里云购买ECS服务器和RDS数据库时,要注意网络类型要一致,最好都是VPC,否则ECS不能在内网访问RDS,只能从外网访问:在RDS控制台左侧,数据库安全性的IP白名单中添加ECS外网IP:在数据 ...

  6. [Windows] - Windows/Office纯绿色一键激活工具及方法

    瘟到死网上有很多一件键激活工具(如KMS),但许多带毒或报毒.这里给出一个纯绿色命令行一键激活,及自已搭建激活服务器的方法. KMS现在算法都是公开的了,可以自行在网上找到,这里不详述. 使用命令行一 ...

  7. zynq7020开发板+ Z-turn调试计划

    参加米尔zynq7020开发板试用活动. 收到米尔z-turn板子后,焊接了一个JTAG转接板,以方便调试PL部分,对于后面的调试部分,主要分三个部分走:1.调试FPGA部分,实现逻辑控制外围简单的设 ...

  8. vue与webpack开发环境搭建:从无到有

    一个vue从无到有的搭建过程. 一.不论是webpack还是vue,最初的第一步就是安装node.js.它是基石. 从官网下载你需要的安装包:官网下载链接:http://nodejs.cn/downl ...

  9. JavaWeb第二天--CSS

    CSS CSS简述 CSS是什么?有什么作用? CSS(Cascading Style Sheets):层叠样式表. CSS通常称为CSS样式或层叠样式表.主要用于设置HTML页面中的文本内容(字体. ...

  10. vue前端实战注意事项

    1. vue前端实战注意事项 1.1. 预备 1.1.1. Eslint 这是个语法检查工具,我用webstorm作为开发的ide,这个语法检查还是太严格了,一个空格啥的都会报错,对新手来讲还是建议关 ...