此博客为原创博客,都是个人工作经历所得,转载请注明出处

ABAP_DEMO篇33 SUM和COLLECT的用法

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 = 1 UNTIL i > 5
                FOR j = 1 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 1,
    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  = 1
                                        max  = 3 ).

DO.
  COLLECT VALUE line( key = COND #( LET r = rnd->get_next( ) IN
                                    WHEN r = 1 THEN 'X'
                                    WHEN r = 2 THEN 'Y'
                                    WHEN r = 3 THEN 'Z' )
                      num = 1 ) INTO itab
          ASSIGNING FIELD-SYMBOL(<fs>).
  IF <fs>-num = 100.
    EXIT.
  ENDIF.
ENDDO.

cl_demo_output=>display( itab ).

 

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

DATA: BEGIN OF i_mi OCCURS 0,
      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 10,
      lt_collect LIKE line OCCURS 0 WITH HEADER LINE.


DO 3 TIMES.
  line-col1 = sy-index.
  line-col2 = sy-index ** 3.
  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.

 

posted @ 2019-12-21 15:45  Rainystuday  阅读(4213)  评论(0编辑  收藏  举报