ABAP_DEMO articles 33 SUM and COLLECT usage

ABAP programs within the table number and amount fields often require total, SUM and COLLECT syntax can achieve total number and amount fields.

 

1. SUM syntax 
in ABAP SUM statement was not as EXCEL powerful;
SUM can only be used in a loop cycle, general and AT-ENDAT used in conjunction.
Prerequisites statement SUM use comprises using in addition INTO the loop and specify the type of line work area wa compatible with the internal table. Further, when the internal table itab table assembly comprising a row type can not be used 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 ).

Inner data line 15 in ITAB

 display:

 

 

2. COLLECT syntax 

Syntax: COLLECT the INTO itab WA [ Result ] .

This statement content of the work area as the single row is inserted in the internal table itab, or added value of a value corresponding to the value of the component to existing lines with the same primary key of the table. Be a numeric field: I type, QUAN type, field types do CURR summary, summary character field conditions considered, it is generally used within the COLLECT table summarizes character field as do KEY value.

*&---------------------------------------------------------------------*
*& 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.

 

Guess you like

Origin www.cnblogs.com/rainysblog/p/12077114.html