テーブル番号と金額フィールド内の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.