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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM