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.