需求分析:
1、具体需求
本《物料基本信息及在订单中的销售统计》有如下需求:
- 除输出物料基本信息(物料、物料名称、物料类型)外,还需要获得此物料在多少个订单中有销售,在不同订单中销售的情况(总计销售数量、最大销售数量、最小销售数量、平均销售数量),因此,本实践所需数据除了物料表,还需要用到订单明细表;
- 物料列表按物料编号升序排序,同时输出序号;
- 对于销售总数量为0的物料,不需要显示。
2、开发分析
要达成本实践目标,需要通过Open SQL,实现对多表的连接和聚合处理,以对数据进行合计、取最小最大值等。
实践步骤:
本实践通过程序编辑器(SE38)即可完成,编写的代码将有如下几部分组成,按开发人员风格不同,其组成部分并非强制一致。
No | 部分 | 说明 |
---|---|---|
1 | 程序声明 | 声明本程序执行后是否包含标准标题,数据输出宽度和每页的行数量为多少,另需考虑页脚输出 |
2 | 对象定义 | 通过定义类型池以在程序中使用相应的图标,通过定义要使用的以变量或常量或要使用的表结构等,以在程序执行过程中计算和存储临时值 |
3 | 页眉页脚 | 通过代码设置输出页眉页脚 |
4 | 获取数据 | 从表中获得要输出的数据数据并存储到内表中以待后续输出 |
5 | 输出数据 | 将内表中的数据按要求输出,本代码可有2种方式实现:条件、AT NEW事件。 |
1、程序声明
程序声明部分的代码如下:
REPORT zu0403_mat_aggregate NO STANDARD PAGE HEADING
LINE-SIZE 100 LINE-COUNT 80.
通过如上代码定义,程序输出时,页面宽度为100(能容纳100个数字或英文字符),每页输出区域为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 " 含工作区的内表
WITH HEADER LINE.
如上代码,使用类型MAT_AG_TYPE定义了一个含工作区的标准内表,如此,在输出时,可以将内表数据遍历后放到内表自己的工作区中,而不需要另外一个结构存储。在实际开发中,偏向于使用不含工作区的内表,如此增加代码的可读性。
3、页眉输出
页眉输出部分的代码如下:
*&----------------------------------------------------------------------*
*& 输出页眉
*&----------------------------------------------------------------------*
TOP-OF-PAGE. "页眉事件
FORMAT RESET.
WRITE:/5(95) sy-uline,
/5 '序号', 10(5) '物料', 15(20) '物料名称',
35(12) '物料类型', 48(6) '项目数',
55(10) '总计' , 65(10) '最大',
75(10) '最小', 85(10) '平均值',
/5(95) sy-uline.
如上代码定义了页眉的输出。
4、获取数据
获取数据部分的代码如下:
*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION. "数据处理事件
*****获得客户信息
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)的数据获取后存储到内表,此select语句需符合Open SQL的语法,而其与传统的SQL类似也有差异;同时在语句中用到了聚合函数用来统计物料的销售数量;并因为MAT_AG_ITAB不是排序内表,因此为了在数据输出时按物料编号排序,通过SORT语句对内表的数据进行相应排序处理。
5、输出数据
输出数据部分的代码如下:
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.
因为内表含工作区,因此LOOP AT后不需带INTO,所遍历的数据将逐行存储到内表MAT_AG_ITAB相同名称的结构中,并可按要求进行输出。
本实践小结:
内表是我们在数据处理中经常使用的ABAP对象,其主要用于临时存储从表或数据中读取的数据并进行后续的处理,本小结将对内表的定义和处理进行说明。
1、内表的类型及定义方式
内表类型及定义 不同类型内表的差异2、内表的管理和操作
(实践A3 End)
网友评论