ABAP_DEMO記事33 SUMとCOLLECT使い方

テーブル番号と金額フィールド内のABAPプログラムは、多くの場合、合計数と金額のフィールドを達成することができ、合計、SUMとCOLLECT構文が必要です。

 

1. SUM構文 
ABAP SUM文では、EXCELとして強力ではありませんでした。
SUMは一般的な、ループサイクルで使用することができ、AT-ENDATを組み合わせて使用しました。
ループに加えて使用して、内部テーブルと互換性の線画領域waのタイプを指定する前提条件文SUM使用を含みます。さらに、場合組立行タイプを含むテーブル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私は= 1まで、私> 5 
                FOR J = 1 jのUNTIL> I 
                (COL1 = iのCOL2 = J))。

LOOP  AT itabのINTOのWA。
  AT  END  OF COL1。
    
    cl_demo_output => 書き込み(WA)。
  ENDAT ENDLOOP 
cl_demo_output =>ディスプレイ(WA)。

ITABにおけるインナーデータライン15

 ディスプレイ:

 

 

2. COLLECT構文 

構文:WA ITAB COLLECT INTO [ 結果]

ワークエリアのこの文の内容単一の行は、内部テーブルitab、またはテーブルの同じ主キーを持つ既存の行に対する成分の値に対応する値の加算値に挿入されます。数値フィールドにする:Iタイプ、QUANタイプ、フィールドタイプCURRの概要、と考え要約文字フィールドの条件を実行し、それは一般的にCOLLECTテーブル内で使用されるがdo 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.

 

おすすめ

転載: www.cnblogs.com/rainysblog/p/12077114.html