彙總內表資料:at end of方法和collect方法
阿新 • • 發佈:2019-01-31
ABAP開發中經常會遇到需要彙總內表中資料的情況,下面介紹兩種方法:at end of和collect。
1、at end of方法
在使用loop迴圈讀取已排序的內表時,可以訪問兩個自動生成的欄位 CNT(<f>) 和SUM(<g>) ,系統在迴圈到不同值之前以及讀取內表最後一個紀錄後填充這兩個欄位。
CNT(<f>) :如果 <f> 是非數字欄位,並且系統是根據 <f> 給內表排序的,則 CNT(<f>)
包含了不同值<f>的序號。
SUM(<g>) :如果 <g> 是內表的數字欄位, SUM(<g>) 將包含 <g> 的值的合計。
注意:a、只能在給內表排序後才能訪問以上兩個欄位,否則會產生執行時錯誤。
b、使用at end of,需要另外定義內表的工作區,否則直接使用表頭,得到的資料會變成一串*。
2、collect方法
collect [<wa> into] <itab>.使用該語句,系統會檢查內表條目的標準關鍵字(所有非數字欄位)是否相同,如果不同,collect語句的作用與append語句相似,將新行添至內表中;如果相同,collect語句不附加新航,但將工作區中的數字欄位內容新增到現有條目中數字欄位的內容中。使用該語句前,同樣需要先對內表進行排序。
以下面的例子來說明具體用法: DATA : BEGIN OF i_data OCCURS 0,
zlabst LIKE mard-labst,"彙總的良品庫存
maktx LIKE makt-maktx,"物料描述
matnr LIKE afpo-matnr,"物料號
zpsmng LIKE afpo-psmng,"總的工單數量
zwemng LIKE afpo-wemng,"總的已交貨數量
zqty LIKE afpo-psmng,"總的欠單數量
END OF i_data.
DATA: w_data LIKE TABLE OF i_data WITH HEADER LINE.
DATA: w_line LIKE LINE OF i_data.
*根據物料號彙總工單總量/總入庫量/總欠工單數 SORT w_data BY matnr. * AT END OF 方法:
LOOP AT w_data INTO w_line.
AT END OF matnr.
SUM.
i_data-matnr = w_line-matnr.
i_data-maktx = w_line-maktx.
i_data-zlabst = w_line-zlabst.
i_data-zpsmng = w_line-zpsmng.
i_data-zwemng = w_line-zwemng.
i_data-zqty = w_line-zqty.
APPEND i_data.
CLEAR i_data.
CLEAR w_line.
ENDAT.
ENDLOOP. *collect 方法 LOOP AT w_data.
MOVE-CORRESPONDING w_data TO i_data.
COLLECT i_data.
CLEAR w_data. CLEAR i_data.
ENDLOOP. 內表w_data中包含matnr/maktx/zlabst/zpsmng/zwemng/zqty六個欄位,其中前兩個為非數字欄位,後四個為數字欄位,需要彙總的欄位為最後三個。 at end of <f>方法,只彙總內表中f欄位之後的欄位,因此定義內表時要把不需要彙總的數字欄位以及非數字欄位(此處為zlabst/maktx)放在f欄位(此處為matnr)前面,需要彙總的欄位放在後面。 collect會把內表中所有數字欄位彙總起來,所以此例中的zlabst欄位也會被彙總,需要另行處理,另外還需注意內表標準關鍵字的問題。
以下面的例子來說明具體用法: DATA
zlabst LIKE mard-labst,"彙總的良品庫存
maktx LIKE makt-maktx,"物料描述
matnr LIKE afpo-matnr,"物料號
zpsmng LIKE afpo-psmng,"總的工單數量
zwemng LIKE afpo-wemng,"總的已交貨數量
zqty LIKE afpo-psmng,"總的欠單數量
END OF i_data.
DATA: w_data LIKE TABLE OF i_data WITH HEADER LINE.
DATA: w_line LIKE
*根據物料號彙總工單總量/總入庫量/總欠工單數 SORT w_data BY matnr. * AT END OF 方法:
LOOP AT w_data INTO w_line.
AT END OF matnr.
SUM.
i_data-matnr = w_line-matnr.
i_data-maktx = w_line-maktx.
i_data-zlabst = w_line-zlabst.
i_data-zpsmng = w_line-zpsmng.
i_data-zwemng = w_line-zwemng.
i_data-zqty = w_line-zqty.
APPEND i_data.
CLEAR i_data.
CLEAR w_line.
ENDAT.
ENDLOOP. *collect 方法 LOOP AT w_data.
MOVE-CORRESPONDING w_data TO i_data.
COLLECT i_data.
CLEAR w_data. CLEAR i_data.
ENDLOOP. 內表w_data中包含matnr/maktx/zlabst/zpsmng/zwemng/zqty六個欄位,其中前兩個為非數字欄位,後四個為數字欄位,需要彙總的欄位為最後三個。 at end of <f>方法,只彙總內表中f欄位之後的欄位,因此定義內表時要把不需要彙總的數字欄位以及非數字欄位(此處為zlabst/maktx)放在f欄位(此處為matnr)前面,需要彙總的欄位放在後面。 collect會把內表中所有數字欄位彙總起來,所以此例中的zlabst欄位也會被彙總,需要另行處理,另外還需注意內表標準關鍵字的問題。