需求分析:
1识颊、具體需求
本《物料基本信息及在訂單中的銷售統(tǒng)計》有如下需求:
- 除輸出物料基本信息(物料诚镰、物料名稱、物料類型)外祥款,還需要獲得此物料在多少個訂單中有銷售清笨,在不同訂單中銷售的情況(總計銷售數(shù)量、最大銷售數(shù)量刃跛、最小銷售數(shù)量函筋、平均銷售數(shù)量),因此奠伪,本實踐所需數(shù)據(jù)除了物料表跌帐,還需要用到訂單明細表;
- 物料列表按物料編號升序排序绊率,同時輸出序號谨敛;
- 對于銷售總數(shù)量為0的物料,不需要顯示滤否。
2脸狸、開發(fā)分析
要達成本實踐目標,需要通過Open SQL藐俺,實現(xiàn)對多表的連接和聚合處理炊甲,以對數(shù)據(jù)進行合計、取最小最大值等欲芹。
實踐步驟:
本實踐通過程序編輯器(SE38)即可完成卿啡,編寫的代碼將有如下幾部分組成,按開發(fā)人員風格不同菱父,其組成部分并非強制一致颈娜。
No | 部分 | 說明 |
---|---|---|
1 | 程序聲明 | 聲明本程序執(zhí)行后是否包含標準標題,數(shù)據(jù)輸出寬度和每頁的行數(shù)量為多少浙宜,另需考慮頁腳輸出 |
2 | 對象定義 | 通過定義類型池以在程序中使用相應的圖標官辽,通過定義要使用的以變量或常量或要使用的表結構等,以在程序執(zhí)行過程中計算和存儲臨時值 |
3 | 頁眉頁腳 | 通過代碼設置輸出頁眉頁腳 |
4 | 獲取數(shù)據(jù) | 從表中獲得要輸出的數(shù)據(jù)數(shù)據(jù)并存儲到內(nèi)表中以待后續(xù)輸出 |
5 | 輸出數(shù)據(jù) | 將內(nèi)表中的數(shù)據(jù)按要求輸出粟瞬,本代碼可有2種方式實現(xiàn):條件同仆、AT NEW事件。 |
1裙品、程序聲明
程序聲明部分的代碼如下:
REPORT zu0403_mat_aggregate NO STANDARD PAGE HEADING
LINE-SIZE 100 LINE-COUNT 80.
通過如上代碼定義俗批,程序輸出時俗或,頁面寬度為100(能容納100個數(shù)字或英文字符),每頁輸出區(qū)域為80行扶镀。
2蕴侣、對象定義
對象定義部分的代碼如下:
*****對象定義
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定義了一個含工作區(qū)的標準內(nèi)表臭觉,如此,在輸出時辱志,可以將內(nèi)表數(shù)據(jù)遍歷后放到內(nèi)表自己的工作區(qū)中蝠筑,而不需要另外一個結構存儲。在實際開發(fā)中揩懒,偏向于使用不含工作區(qū)的內(nèi)表什乙,如此增加代碼的可讀性。
3已球、頁眉輸出
頁眉輸出部分的代碼如下:
*&----------------------------------------------------------------------*
*& 輸出頁眉
*&----------------------------------------------------------------------*
TOP-OF-PAGE. "頁眉事件
FORMAT RESET.
WRITE:/5(95) sy-uline,
/5 '序號', 10(5) '物料', 15(20) '物料名稱',
35(12) '物料類型', 48(6) '項目數(shù)',
55(10) '總計' , 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語句智亮,將多個表(ztmaterial忆某、ztorders_i)的數(shù)據(jù)獲取后存儲到內(nèi)表,此select語句需符合Open SQL的語法阔蛉,而其與傳統(tǒng)的SQL類似也有差異弃舒;同時在語句中用到了聚合函數(shù)用來統(tǒng)計物料的銷售數(shù)量;并因為MAT_AG_ITAB不是排序內(nèi)表状原,因此為了在數(shù)據(jù)輸出時按物料編號排序聋呢,通過SORT語句對內(nèi)表的數(shù)據(jù)進行相應排序處理。
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.
因為內(nèi)表含工作區(qū)削锰,因此LOOP AT后不需帶INTO,所遍歷的數(shù)據(jù)將逐行存儲到內(nèi)表MAT_AG_ITAB相同名稱的結構中毕莱,并可按要求進行輸出喂窟。
本實踐小結:
內(nèi)表是我們在數(shù)據(jù)處理中經(jīng)常使用的ABAP對象,其主要用于臨時存儲從表或數(shù)據(jù)中讀取的數(shù)據(jù)并進行后續(xù)的處理央串,本小結將對內(nèi)表的定義和處理進行說明磨澡。
1、內(nèi)表的類型及定義方式
2质和、內(nèi)表的管理和操作
(實踐A3 End)