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

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

DEMO

DATA:
BEGIN OF wa,
col1 TYPE i,
col2 TYPE i,
END OF wa,
itab LIKE TABLE OF wa WITH EMPTY KEY. itab = VALUE #( FOR i = UNTIL i >
FOR j = UNTIL j > i
( col1 = i col2 = j ) ). LOOP AT itab INTO wa.
AT END OF col1.
SUM.
cl_demo_output=>write( wa ).
ENDAT.
ENDLOOP.
cl_demo_output=>display( wa ).

内表ITAB中有15行数据

显示:

2. COLLECT语法

语法:COLLECT wa INTO itab [result].

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

*&---------------------------------------------------------------------*
*& Report YCX_COLLECT1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ycx_collect1. TYPES:
BEGIN OF line,
key TYPE c LENGTH ,
num TYPE i,
END OF line.
DATA
itab TYPE SORTED TABLE OF line
WITH UNIQUE KEY key. DATA(rnd) = cl_abap_random_int=>create( seed = + sy-uzeit
min =
max = ). DO.
COLLECT VALUE line( key = COND #( LET r = rnd->get_next( ) IN
WHEN r = THEN 'X'
WHEN r = THEN 'Y'
WHEN r = THEN 'Z' )
num = ) INTO itab
ASSIGNING FIELD-SYMBOL(<fs>).
IF <fs>-num = .
EXIT.
ENDIF.
ENDDO. cl_demo_output=>display( itab ).

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

DATA: BEGIN OF i_mi OCCURS ,
matnr LIKE zhkmi-matnr,
werks LIKE zhkmi-werks,
menge LIKE zhkmi-menge,
END OF i_mi. START-OF-SELECTION. SELECT matnr werks menge
INTO CORRESPONDING FIELDS OF TABLE i_mi
FROM zhkmi. SORT i_mi BY matnr werks. LOOP AT i_mi.
i_collect-zkind = 'P'.
i_collect-matnr = i_mi-matnr.
i_collect-werks = i_mi-werks.
i_collect-menge = i_mi-menge.
COLLECT i_collect.
CLEAR i_collect.
ENDLOOP.

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

*&---------------------------------------------------------------------*
*& Report YCX_SUM
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ycx_sum. DATA: BEGIN OF line,
col1 TYPE c,
col2 TYPE i,
END OF line.
DATA: itab LIKE line OCCURS ,
lt_collect LIKE line OCCURS WITH HEADER LINE. DO TIMES.
line-col1 = sy-index.
line-col2 = sy-index ** .
APPEND line TO itab.
ENDDO. **显示内表数据
LOOP AT itab INTO line.
WRITE: / line-col1, line-col2.
ENDLOOP. WRITE:/'SUM汇总数据'.
**使用SUM 汇总
LOOP AT itab INTO line.
AT END OF col1.
SUM.
WRITE: / line-col1, line-col2.
ENDAT.
ENDLOOP. WRITE:/'SUM汇(不使用AT END OF)'.
**使用SUM 汇总
LOOP AT itab INTO line.
SUM.
WRITE: / line-col1, line-col2.
ENDLOOP. **使用COLLECT 汇总
LOOP AT itab INTO line.
lt_collect-col1 = line-col1.
lt_collect-col2 = line-col2.
COLLECT lt_collect.
CLEAR: lt_collect.
ENDLOOP.
WRITE:/'COLLECT汇总数据'. LOOP AT lt_collect.
WRITE: / lt_collect-col1, lt_collect-col2.
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. 『7.5 NOIP模拟赛题解』

    T1 Gift Description ​ 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一 ...

  2. 系统压测结果对比:tomcat/thinkphp/swoole/php-fpm/apache

    [测试所用服务器8核,16G内存]压测接口:很简单,从一张表里根据主键随机查询出一条数据[数据库服务器和WEB服务器分开的].表数据量大概:910000+条. 这个测试结果很有趣:tp5.0和3.2性 ...

  3. 关于redis key命名规范的设计

    一.实现目标 简洁,高效,可维护 二.键值设计规约 1 . Redis key命名风格 [推荐]Redis key命名需具有可读性以及可管理性,不该使用含义不清的key以及特别长的key名: [强制] ...

  4. ML学习笔记之LATEX数学公式基本语法

    作者:@houkai本文为作者原创,转载请注明出处:https://www.cnblogs.com/houkai/p/3399646.html 0x00 概述 TEX 是Donald E. Knuth ...

  5. typescript nodejs 依赖注入实现

    依赖注入通常也是我们所说的ioc模式,今天分享的是用typescript语言实现的ioc模式,这边用到的主要组件是 reflect-metadata 这个组件可以获取或者设置元数据信息,它的作用是拿到 ...

  6. Java自学-数字与字符串 数学方法

    Java Math类常用方法 java.lang.Math提供了一些常用的数学运算方法,并且都是以静态方法的形式存在 步骤 1 : 四舍五入, 随机数,开方,次方,π,自然常数 package dig ...

  7. vue动画理解,进入、离开、列表过度和路由切换。

    vue的动画对于很多初学者,甚至对很多老鸟来说也是很费劲,不容易控制的. 这篇文章讲vue动画的理解.其实没那么难. 动画理解 一个元素从A状态变成B状态,如果这个过程通过某种方式反应在视图上了,那么 ...

  8. 36、v-charts一些基本配置修改

    例如柱状图: <ve-histogram :settings="chartSettings" :extend="chartExtend" :grid=&q ...

  9. 英语partschinite芬达石partschinite锰铝榴石

    partschinite指锰铝榴石,属于石榴石的一种,由于它有芬达饮料的诱人颜色,大家也称其为“芬达石”.石榴石宝石族中重要品种之一,化学成分为锰铝硅酸盐,颜色从红到橙红,红到棕红,玫瑰红.浅玫红均有 ...

  10. xenserver增加新硬盘

    1. 查看所有硬盘了的id # ls -l /dev/disk/by-id/ 2. 挂载 # xe sr-create type=lvm content-type=user device-config ...