
需求分析:
1、具體需求
本《物料基本信息及在訂單中的銷售統(tǒng)計(jì)》有如下需求:
- 除輸出物料基本信息(物料、物料名稱、物料類型)外,還需要獲得此物料在多少個(gè)訂單中有銷售,在不同訂單中銷售的情況(總計(jì)銷售數(shù)量、最大銷售數(shù)量、最小銷售數(shù)量、平均銷售數(shù)量),因此,本實(shí)踐所需數(shù)據(jù)除了物料表,還需要用到訂單明細(xì)表;
- 物料列表按物料編號(hào)升序排序,同時(shí)輸出序號(hào);
- 對(duì)于銷售總數(shù)量為0的物料,不需要顯示。
2、開發(fā)分析
要達(dá)成本實(shí)踐目標(biāo),需要通過Open SQL,實(shí)現(xiàn)對(duì)多表的連接和聚合處理,以對(duì)數(shù)據(jù)進(jìn)行合計(jì)、取最小最大值等。
實(shí)踐步驟:
本實(shí)踐通過程序編輯器(SE38)即可完成,編寫的代碼將有如下幾部分組成,按開發(fā)人員風(fēng)格不同,其組成部分并非強(qiáng)制一致。
| No | 部分 | 說明 |
|---|---|---|
| 1 | 程序聲明 | 聲明本程序執(zhí)行后是否包含標(biāo)準(zhǔn)標(biāo)題,數(shù)據(jù)輸出寬度和每頁的行數(shù)量為多少,另需考慮頁腳輸出 |
| 2 | 對(duì)象定義 | 通過定義類型池以在程序中使用相應(yīng)的圖標(biāo),通過定義要使用的以變量或常量或要使用的表結(jié)構(gòu)等,以在程序執(zhí)行過程中計(jì)算和存儲(chǔ)臨時(shí)值 |
| 3 | 頁眉頁腳 | 通過代碼設(shè)置輸出頁眉頁腳 |
| 4 | 獲取數(shù)據(jù) | 從表中獲得要輸出的數(shù)據(jù)數(shù)據(jù)并存儲(chǔ)到內(nèi)表中以待后續(xù)輸出 |
| 5 | 輸出數(shù)據(jù) | 將內(nèi)表中的數(shù)據(jù)按要求輸出,本代碼可有2種方式實(shí)現(xiàn):條件、AT NEW事件。 |
1、程序聲明
程序聲明部分的代碼如下:
REPORT zu0403_mat_aggregate NO STANDARD PAGE HEADING
LINE-SIZE 100 LINE-COUNT 80.
通過如上代碼定義,程序輸出時(shí),頁面寬度為100(能容納100個(gè)數(shù)字或英文字符),每頁輸出區(qū)域?yàn)?0行。
2、對(duì)象定義
對(duì)象定義部分的代碼如下:
*****對(duì)象定義
TYPES: BEGIN OF mat_ag_type, " mat_ag_type-類型名稱
materialid TYPE ztmaterial-materialid,
materialname TYPE ztmaterial-materialname,
materialtype TYPE ztmaterial-materialtype,
count TYPE i,
total TYPE ztorders_i-oquantity,
max TYPE ztorders_i-oquantity,
min TYPE ztorders_i-oquantity,
average TYPE ztorders_i-oquantity,
END OF mat_ag_type.
DATA:mat_ag_itab TYPE STANDARD TABLE OF mat_ag_type " 含工作區(qū)的內(nèi)表
WITH HEADER LINE.
如上代碼,使用類型MAT_AG_TYPE定義了一個(gè)含工作區(qū)的標(biāo)準(zhǔn)內(nèi)表,如此,在輸出時(shí),可以將內(nèi)表數(shù)據(jù)遍歷后放到內(nèi)表自己的工作區(qū)中,而不需要另外一個(gè)結(jié)構(gòu)存儲(chǔ)。在實(shí)際開發(fā)中,偏向于使用不含工作區(qū)的內(nèi)表,如此增加代碼的可讀性。
3、頁眉輸出
頁眉輸出部分的代碼如下:
*&----------------------------------------------------------------------*
*& 輸出頁眉
*&----------------------------------------------------------------------*
TOP-OF-PAGE. "頁眉事件
FORMAT RESET.
WRITE:/5(95) sy-uline,
/5 '序號(hào)', 10(5) '物料', 15(20) '物料名稱',
35(12) '物料類型', 48(6) '項(xiàng)目數(shù)',
55(10) '總計(jì)' , 65(10) '最大',
75(10) '最小', 85(10) '平均值',
/5(95) sy-uline.
如上代碼定義了頁眉的輸出。
4、獲取數(shù)據(jù)
獲取數(shù)據(jù)部分的代碼如下:
*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION. "數(shù)據(jù)處理事件
*****獲得客戶信息
SELECT
mt~materialid mt~materialname mt~materialtype
COUNT( * ) AS count
SUM( oi~oquantity ) AS total
MAX( oi~oquantity ) AS max
MIN( oi~oquantity ) AS min
AVG( oi~oquantity ) AS average
INTO TABLE mat_ag_itab
FROM ( ztmaterial AS mt
INNER JOIN ztorders_i AS oi
ON oi~materialid = mt~materialid )
GROUP BY mt~materialid mt~materialname mt~materialtype
HAVING SUM( oi~oquantity ) <> 0.
SORT mat_ag_itab BY materialid.
如上代碼通過select語句,將多個(gè)表(ztmaterial、ztorders_i)的數(shù)據(jù)獲取后存儲(chǔ)到內(nèi)表,此select語句需符合Open SQL的語法,而其與傳統(tǒng)的SQL類似也有差異;同時(shí)在語句中用到了聚合函數(shù)用來統(tǒng)計(jì)物料的銷售數(shù)量;并因?yàn)镸AT_AG_ITAB不是排序內(nèi)表,因此為了在數(shù)據(jù)輸出時(shí)按物料編號(hào)排序,通過SORT語句對(duì)內(nèi)表的數(shù)據(jù)進(jìn)行相應(yīng)排序處理。
5、輸出數(shù)據(jù)
輸出數(shù)據(jù)部分的代碼如下:
LOOP AT mat_ag_itab.
WRITE:
/5(5) sy-tabix, 10(5) mat_ag_itab-materialid, 15(20) mat_ag_itab-materialname,
35(15) mat_ag_itab-materialtype, 48(6) mat_ag_itab-count,
55(10) mat_ag_itab-total, 65(10) mat_ag_itab-max,
75(10) mat_ag_itab-min,85(10) mat_ag_itab-average.
ENDLOOP.
因?yàn)閮?nèi)表含工作區(qū),因此LOOP AT后不需帶INTO,所遍歷的數(shù)據(jù)將逐行存儲(chǔ)到內(nèi)表MAT_AG_ITAB相同名稱的結(jié)構(gòu)中,并可按要求進(jìn)行輸出。
本實(shí)踐小結(jié):
內(nèi)表是我們?cè)跀?shù)據(jù)處理中經(jīng)常使用的ABAP對(duì)象,其主要用于臨時(shí)存儲(chǔ)從表或數(shù)據(jù)中讀取的數(shù)據(jù)并進(jìn)行后續(xù)的處理,本小結(jié)將對(duì)內(nèi)表的定義和處理進(jìn)行說明。
1、內(nèi)表的類型及定義方式


2、內(nèi)表的管理和操作

(實(shí)踐A3 End)