实践A1-按地区城市排序输出客户列表
需求分析:
1、具体需求
本《按地区城市排序输出客户列表》有如下需求:
- 从客户表中取部分字段而不是所有字段进行输出;
- 输出的客户列表,首先要按照地区排序、然后按城市排序;
- 需要输出标题行以对每一列进行说明;
- 各列的文字颜色和背景色有不同要求,如客户列有背景色,客户名称列为红色……。
整体需求可见图。
2、开发分析
要达成本实践目标,需要综合ABAP的数据输出实现方式:
- ABAP可通过Open SQL从表中获得要输出的数据存储到内表;
- 通过Write语句可以将数据输出到屏幕,而在输出时需要考虑每列数据输出起始位置及所占字符长度;
- 可以通过Format语句控制输出颜色。
实践步骤:
本实践通过程序编辑器(SE38)即可完成,编写的代码将有如下几部分组成,按开发人员风格不同,其组成部分并非强制一致。
No | 部分 | 说明 |
---|---|---|
1 | 程序声明 | 声明本程序执行后是否包含标准标题,数据输出宽度和每页的行数量为多少 |
2 | 对象定义 | 通过定义变量或常量或要使用的表结构等,以在程序执行过程中计算和存储临时值 |
3 | 页眉输出 | 如不指定标准标题,则可以通过代码设置输出的页眉 |
4 | 获取数据 | 从表中获得要输出的数据数据并存储到内表中以待后续输出 |
5 | 输出数据 | 将内表中的数据按要求输出 |
1、程序声明
程序声明部分代码如下:
REPORT zu0401_cust_open_sql NO STANDARD PAGE HEADING
LINE-SIZE 100 LINE-COUNT 80.
REPORT 程序名称:是对程序的定义,表明此程序代码不是FUNCTION MODULE(功能函数),不是CLASS(类),而是可以执行的可以输出数据的此程序;这是对程序最基本的声明,且必须存在的部分。
NO STANDARD PAGE HEADING:标准的标题定义,可在程序编辑器中通过菜单“转到文本元素”中的“列表标题”进行定义;而如果设置为此,则表示此程序不使用标准的“列表标题”。
LINE-SIZE 100 LINE-COUNT 80:对页面的宽度高度进行定义,其中LINE-SIZE为按英文字母长度定义的页面宽度(如此定义为100表示能容纳100个数字或字母,而如果是中文则按一个中文按2个字符算);LINE-COUNT则是页面的高度(如此定义为80,则表示每一页面最多能容纳80行,超过则在下一页显示)。
2、对象定义
对象定义部分代码如下:
*****对象定义
TYPES: BEGIN OF cust_type, " CUST_TYPE-类型名称
customerid TYPE ztcustomer-customerid,
customername TYPE ztcustomer-customername,
region TYPE ztcustomer-region,
city TYPE ztcustomer-city,
address TYPE ztcustomer-address,
contact TYPE ztcustomer-contact,
cphone TYPE ztcustomer-cphone,
END OF cust_type.
DATA:cust_stru TYPE cust_type,
cust_itab TYPE STANDARD TABLE OF cust_type.
如上代码,首先通过TYPES定义了一个名称为CUST_TYPE的类型,此类型包含了要输出的字段:customerid(客户编号)、customername(客户名称)、region(地区)、city(城市)、address(地址)、contact(联系人)、cphone(电话);此类型也可在数据字典中定义好后,由此在不同的程序代码中都可以使用。
然后,通过DATA,使用CUST_TYPE定义了一个结构CUST_STRU,此结构可以在后面的程序中存储要输出的数据;也使用此CUST_TYPE定义了一个内表CUST_ITAB,此内表是一个标准的不含Work Area(工作区)的内表,这个内表用来存储从表中获得的数据。
定义的类型、结构及内表在数据处理过程中的关系如图4-2。
3、输出页眉
输出页眉部分代码如下:
*&----------------------------------------------------------------------*
*& 输出页眉
*&----------------------------------------------------------------------*
TOP-OF-PAGE. "页眉事件
FORMAT RESET.
WRITE:/5(90) sy-uline,
/5 '客户ID', 15 '客户地址', 30 '地区', 35 '城市', 40 '地址' , 60 '联系人', 70 '电话号码',
/5(90) sy-uline.
页眉部分代码,要通过TOP-OF-PAGE定义,在此部分可以定义每一页上方输出的标题行。
在如上代码中首先通过FORMAT RESET,重置输出数据的颜色,因为后面的数据输出时设置了颜色。
然后,通过WRITE进行数据的输出,其中:
/5(90) sy-uline,表示每次执行时换行输出,且前面空4个字符,从第5位开始输出,输出的内容是长度为90的横线(sy-uline)。
/5 '客户ID', 15 '客户地址',……,则是按要求输出标题文字。
输出效果如图4-3。
4、获得数据
获得数据部分代码如下:
*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION. "数据处理事件
*****获得客户信息
SELECT "通过SELECT 语句从表ZTCUSTOMER中获得数据并赋值到内表
customerid customername region city address contact cphone
INTO TABLE cust_itab
FROM ztcustomer
ORDER BY region city. "默认升序:ASCENDING,降序则为:DESCENDING
通过START-OF-SELECTION区分页眉部分的处理,后面的代码则可进行数据的处理,包括获得数据和输出数据。
如上SELECT代码为ABAP的Open SQL,是为了满足SAP系统在不同底层数据库时的使用,其语句规范接近标准的SQL又有所差异;有了Open SQL,ABAPer只需要熟悉和掌握其语法则可从相应表中获得数据,而不用考虑使用的底层数据库是Oracle还是DB2还是MysqlServer。
如上代码执行完成后,则可将数据从ZTCUSTOMER表中,获得所需的各个字段的数据并存储到内表CUST_ITAB中,并按REGION(地区)、CITY(城市)列升序,其中也可增加WHERE条件以筛选数据(本实践中略)。
5、输出数据
输出数据部分代码如下:
*****循环输出客户信息
LOOP AT cust_itab INTO cust_stru .
FORMAT INVERSE OFF COLOR COL_KEY. "设置输出格式为含背景色,且为蓝色
WRITE:
/5 cust_stru-customerid, "按FORMAT语句的设置输出
15 cust_stru-customername INVERSE ON COLOR COL_NEGATIVE, "无背景色,文字为红色
30 cust_stru-region INVERSE ON, "无背景色,文字为蓝色
35 cust_stru-city INVERSE ON COLOR COL_POSITIVE, "无背景色,文字为绿色
40 cust_stru-address INVERSE ON COLOR COL_GROUP, "无背景色,文字为橙色
60 cust_stru-contact,
70 cust_stru-cphone.
ENDLOOP.
如上代码,是将逐条从内表CUST_ITAB中获取数据并赋值给结构CUST_STRU后输出。
同时通过FORMAT语句设置后续数据输出的默认格式,其中INVERSE OFF表示为背景色,COLOR COL_KEY表示为蓝色;同时WRITE语句中也可控制不同内容的格式。
输出效果如图4-4。
如上从上到下各部分代码则是组成实现本实践的全部代码,编写完成后激活,则可进行程序的测试发布。
输出小结:
1、程序的输出声明
项目 | 说明 |
---|---|
NO STANDARD PAGE HEADING | 不使用标准的页眉 |
LINE-SIZE width | 页眉宽度(能容纳的英文字符或数字) |
LINE-COUNT page_lines [(footer_lines)] |
页面高度(一个页面能容纳的行数) 如指定footer_lines,则页面中保留行给页脚以给END-OF-PAGE使用 |
2 、WRITE语句
基本语法 | |
---|---|
/ | 反斜杠为换行显示 |
n | 从第n个字符开始输出 |
(n) | 如不指定(n),则按变量常量或字符的长度输出,按此指定后,则按此指定长度输出,如变量常量或字符的长度超过则被截取 |
WRITE AT | 如使用WRITE AT,则字符起始输出位置n及输出长度(n)都可以为变量常量,否则只能使用数值 |
例子 | WRITE /5(90) sy-uline. 从第5位开始,输出长度为90的横线 |
显示格式 | ||
---|---|---|
对齐 | LEFT-JUSTIFIED | 左对齐(字符类型默认) |
CENTERED | 中对齐 | |
RIGHT-JUSTIFIED | 右对齐(数字类型默认) | |
UNDER <g> | 对齐到另一个输出对象<g> | |
输出 | NO-GAP | 不保留字段间空格 |
NO-ZERO | 不显示前导0 | |
NO-SIGN | 不显示正负号 | |
USING EDIT MASK <m> | 按掩码指定输出 | |
USING NO EDIT MASK | 不按掩码指定输出 | |
CURRENCY <c> | 输出代码c对应的货币 | |
小数 | DECIMALS <d> | 显示d位小数 |
EXPONENT <e> | F(浮点数)exponent的值 | |
ROUND <r> | 四舍五入至r位小数 | |
日期 | DD/MM/YY MM/DD/YY DD/MM/YYYY MM/DD/YYYY DDMMYY MMDDYY YYMMDD |
按不同格式指定日期输出 |
例子 | WRITE / 'C10007' using edit mask _:_____. "输出为C:10007 WRITE / sy-datum mmddyy. "输出当前日期为10/21/17 WRITE / 'Hello', 'World' NO-GAP. "HelloWorld间无空格 |
3、空行输出
项目 | 说明 |
---|---|
SKIP [<n>] | 从当前行开始,空n行后再输出 |
SKIP TO LINE <n> | 跳到第n后输出 |
4、颜色控制
FORMAT语句 | |
---|---|
FORMAT RESET | 颜色重置 |
FORMAT INVERSE OFF | 背景色 |
FORMAT INVERSE ON | 前景色 |
颜色 | |||
---|---|---|---|
数字(COLOR=n) | 代码(COL_代码) | 颜色 | 用途 |
1 | HEADING | 灰蓝色 | 一般用途 |
2 | NORMAL | 浅灰色 | 列表内容 |
3 | TOTAL | 黄色 | 汇总 |
4 | KEY | 蓝色 | 关键字 |
5 | POSITIVE | 绿色 | 正确 |
6 | NEGATIVE | 红色 | 错误 |
7 | GROUP | 橙色 | 控制 |
(实践A1 End)