一、 at end of、at new、at last
1)在寫abap 的過程中可能需要統(tǒng)計(jì)、求和等,那么在loop ... endloop 中間,有個(gè)AT <LEVEL>,<…>,ENDAT循環(huán)。其中的<LEVEL>包括: FRIST,LAST, NEW , END OF。
2)這些可以用來進(jìn)行內(nèi)表中按某個(gè)<u>字段f</u> 進(jìn)行分組統(tǒng)計(jì)。
3)當(dāng)f字段或者f字段左邊的字段內(nèi)容發(fā)生變化時(shí)該事件后面的語句都會(huì)執(zhí)行。
以下以處理工資報(bào)表數(shù)據(jù)為例(簡化例子):
- 工資內(nèi)表結(jié)構(gòu)字段及填充后的數(shù)據(jù)如下表:
- 與loop配合使用匯總(loop不加where條件)
注意要先對(duì)內(nèi)表數(shù)據(jù)進(jìn)行排序
SORT it_data BY werks orgeh pernr.
LOOP AT it_data.
*在內(nèi)表循環(huán)過程中遇到新的人事范圍則執(zhí)行
AT NEW werks.
SKIP.
ULINE.
WRITE :/8(35) '按人事范圍匯總:'.
WRITE:/8(20) '人事范圍編碼',28(12)'部門編碼',40(10)'員工號(hào)',50(8)'姓名',58(12)'基本工資',70(12)'職務(wù)工資',82(8)'稅金',90(8)'實(shí)發(fā)'.
ENDAT.
WRITE :/8(20) it_data-werks,28(12) it_data-orgeh ,40(10) it_data-pernr,50(8) it_data-ename,58(10) it_data-1jbg,68(10) it_data-1zwg,78(10) it_data-x403,90(10) it_data-x559.
接下
*在部門結(jié)束時(shí)(下一個(gè)部門開始前),輸出部門小計(jì)
AT END OF orgeh.
SUM.
SKIP.
WRITE :/8(20) '部門小計(jì):'.
WRITE:
/8(10) '人數(shù)',
18(12) it_data-count,
56(10) it_data-1jbg NO-GROUPING NO-SIGN,
66(10) it_data-1zwg NO-GROUPING NO-SIGN ,
76(10) it_data-x403 NO-GROUPING NO-SIGN,
88(10) it_data-x559 NO-GROUPING NO-SIGN.
SKIP.
ENDAT.
*只執(zhí)行一次最終匯總
AT LAST.
SUM.
ULINE.ULINE.
WRITE:
/8(20) '合計(jì):'.
WRITE:
/8(10) '人數(shù)',
18(12) it_data-count,
56(10) it_data-1jbg NO-GROUPING NO-SIGN,
66(10) it_data-1zwg NO-GROUPING NO-SIGN ,
76(10) it_data-x403 NO-GROUPING NO-SIGN,
88(10) it_data-x559 NO-GROUPING NO-SIGN.
ENDAT.
CLEAR it_data.
ENDLOOP.
- 處理后的數(shù)據(jù)結(jié)果:
以上在loop過程中對(duì)工資單數(shù)據(jù)分別按人事范圍、部門匯總,最后做總的統(tǒng)計(jì)。
二、 COLLECT
ABAP對(duì)內(nèi)表插入數(shù)據(jù)有3種:APPEND,COLLECT,INSERT。
1) 要計(jì)算數(shù)字字段之和或要確保內(nèi)表中沒有出現(xiàn)重復(fù)條目,使用 COLLECT 語句,它根據(jù)標(biāo)準(zhǔn)關(guān)鍵字處理行(將關(guān)鍵字相同的其他數(shù)字字段值匯總)。
2)要在內(nèi)表現(xiàn)有行之前插入新行,請(qǐng)使用 INSERT 語句。
3)要將內(nèi)表?xiàng)l目內(nèi)容復(fù)制到另一個(gè)內(nèi)表中并且覆蓋該目標(biāo)表格,使用 MOVE 語句。
以下舉例說明collect常見用法。
- 定義內(nèi)表:
DATA: BEGIN OF wa_data,
col1 TYPE c,
col2 TYPE i,
col3 TYPE i,
END OF wa_data.
DATA: it_data LIKE TABLE OF wa_data WITH HEADER LINE.
DATA: itab LIKE HASHED TABLE OF wa_data WITH UNIQUE KEY col1 WITH HEADER LINE.
注意:此處itab作為匯總表定義為hashed table 且明確唯一key列(普通內(nèi)表也可),collect要求非KEY列都得是數(shù)據(jù)類型(I,P,F)
- 填充內(nèi)表:
wa_data-col1 = 'A'.
DO 2 TIMES.
wa_data-col2 = 1.
wa_data-col3 = 1 * sy-index.
APPEND wa_data TO it_data.
ENDDO.
wa_data-col1 = 'B'.
DO 2 TIMES.
wa_data-col2 = 2.
wa_data-col3 = 2 * sy-index.
APPEND wa_data TO it_data.
ENDDO.
wa_data-col1 = 'C'.
DO 2 TIMES.
wa_data-col2 = 3.
wa_data-col3 = 3 * sy-index.
APPEND wa_data TO it_data.
ENDDO.
- 使用collect處理內(nèi)表:按關(guān)鍵列(默認(rèn)非數(shù)字列)匯總
LOOP AT it_data .
COLLECT it_data INTO itab.
ENDLOOP.
- 內(nèi)表有多個(gè)關(guān)鍵列
DATA: itab LIKE TABLE OF wa_data with KEY col1 col WITH HEADER LINE .

如上圖(指定兩個(gè)關(guān)鍵列),只有col1和col列都相同才會(huì)被collect;若未指定COL列為關(guān)鍵列,則無法collect。
---