需求分析:
1、具体需求
本案例有如下需求:
- 初始界面输入员工信息,姓名、身份证号、电话;
- 执行后输出输入的员工信息,同时根据身份证号得到员工性别、出生日期、年龄,以及新中国成立后多少天出生的、出生所在季度、所在月共有多少天等;
- 根据电话号码确定其所属电信供应商。
2、开发分析
要达成本实践目标,需要综合ABAP的数据处理予以实现:
- 性别:根据身份证号第17位判断,除2<>0 (奇数)为男,否则为女;
- 出生日期:根据身份证号,从第7位开始取8位;
- 新中国成立后天数:出生日期与新中国成立日期(19491001)的天数差额;
- 年龄:根据当前系统日期和出生日期,取出年份相减;
- 季度:根据出生日期取出月份进行判断;
- 月份共有多少天:根据出生月得到出生下一个月的首日,用此日期-1得到出生月份的最后一天的日期,由此日期可以得到出生月的天数。
- 电信供应商:根据手机号码前3位判断。
- 通过Write语句可以将数据输出到屏幕,而在输出时需要考虑每列数据输出起始位置及所占字符长度;
实践步骤:
本实践通过程序编辑器(SE38)即可完成,编写的代码将有如下几部分组成,按开发人员风格不同,其组成部分并非强制一致。
No | 部分 | 说明 |
---|---|---|
1 | 程序声明 | 声明本程序执行后是否包含标准标题,数据输出宽度和每页的行数量为多少 |
2 | 对象定义 | 通过定义变量或常量或要使用的表结构等,以在程序执行过程中计算和存储临时值 |
3 | 数值计算 | 按计算公式计算,并赋值给变量 |
4 | 输出数据 | 将计算结果数据按要求输出 |
1、程序声明
程序声明部分代码如下:
REPORT zu0302_char_date.
REPORT 程序名称:是对程序的定义,表明此程序代码不是FUNCTION MODULE(功能函数),不是CLASS(类),而是可以执行的可以输出数据的此程序;这是对程序最基本的声明,且必须存在的部分。
2、对象定义
对象定义部分代码如下:
*****对象定义
DATA: esex(2) TYPE c, "性别
ebirth TYPE d, "出生日期
ebdays TYPE i, "距离天数
eage TYPE i, "年龄
equater TYPE i, "出生所在季度
emonth(2) TYPE n, "出生所在月份
elmonth(2) TYPE n, "出生日期下月
elmday TYPE d, "出生日期下月首日
eblday TYPE d, "出生月份最后一日
emdays TYPE i, "出生月份天数
elphone(3) TYPE n, "号码段截取
esupplier(8) TYPE c. "电话供应商
CONSTANTS new_china_day TYPE d "新中国成立日期
VALUE '19491001'.
PARAMETERS: ename(8) TYPE c, "定义类型为C(字符)的姓名
ecert(18) TYPE c, "定义类型为C(字符)的身份证号
ephone(11) TYPE n. "定义类型为N(数字字符)的电话号码
如上代码,首先通过DATA定义变量字段:esex(性别)、ebirth(出生日期)、ebdays(距离天数)、eage(年龄)equater(出生所在季度)、emonth(出生所在月份)、elmonth(出生日期下月)、elmday(出生日期下月首日)、eblday(出生月份最后一日)、emdays(出生月份天数)、elphone(号码段截取)、esupplier(电话供应商);然后通过CONSTANTS定义在程序中不需要也不能改变的常量new_china_day(新中国成立日期)。
最后通过PARAMETERS定义初始界面中输入的字段ename(姓名)、ecert(身份证号)、ephone(电话)。
3、变量赋值
通过字符处理、计算、得到各变量的值以进行下一步的程序处理:
*****性别信息
esex = ecert+17(1). "获得身份证号第17位
IF esex MOD 2 <> 0 .
esex = '男'.
ELSE.
esex = '女'.
ENDIF.
*****出生日期
ebirth = ecert+6(8). "获得身份证号第7位开始的8位
ebdays = ebirth - new_china_day. "计算得到出生日期距新中国成立间隔天数
eage = sy-datum+0(4) - ebirth+0(4). "获得当前日期所在年,并与出生年相减得到年龄
IF ebirth+4(2) > sy-datum+4(2). "如果出生月份大于当前月份,计算年龄要减1
eage = eage - 1.
ENDIF.
emonth = ebirth+4(2). "获得出生日期所在月
IF emonth <= 3. "根据出生月获得出生季度
equater = 1.
ELSEIF emonth <= 6.
equater = 2.
ELSEIF emonth <= 9.
equater = 3.
ELSE.
equater = 4.
ENDIF.
elmonth = emonth + 1. "根据出生月获得下一月
elmday = ebirth+0(4) && elmonth && '01'. "下月首日
eblday = elmday - 1. "下月首日的上一天则是出生月的最后一天
emdays = eblday+6(2). "根据出生月的最后一天日期得到出生月天数
*****获取电信供应商信息
elphone = ephone+0(3). "根据电话前3位判断电信供应商
CASE elphone.
WHEN '134'OR '136' OR '137' OR '138'OR '139' .
esupplier = '中国移动' .
WHEN '130'OR '131' OR '132' OR '155'OR '156'.
esupplier = '中国联通' .
WHEN '133' OR '153'OR '180' OR '189'OR '177' .
esupplier = '中国电信' .
WHEN OTHERS.
esupplier = '不能识别的手机号码' .
ENDCASE.
对ABAP语言的掌握到一定程序后,会处理一些复杂的内容,而SAP的数据流控制中,更有很多复杂的逻辑操作ABAP的分支结构,这里使用了如下语句:逻辑表达式IF、多重选择CASE:
IF 语句被称为分支结构或选择语句,因为它提供了一个交汇点,可以选择两个分支中的一个;CASE使用条件运算符和if语句可以很快编写从两个选择中进行选择的程序。
如若出现3种或3种以上选择(指定值,不能是范围)时,使用CASE… ENDCASE.语句会更为方便
4、数据输出
根据要求,通过Write进行输出。
*****输入信息显示
WRITE: /5 TEXT-001, "WRITE输出数据,/5 换行从第5位开始输出
/10 '姓 名:', 20 ename, "姓名值从第20位开始输出
/10 '身份证号:', 20 ecert,
/10 '电 话:', 20 ephone.
*****输出信息显示
SKIP 1. "空一行输出
WRITE: /5 TEXT-002.
WRITE: /10 ename,'性别是:', esex ,'出生于:', ebirth,
/10 '是在新中国成立:',ebdays,'天后出生的。',
/10 '截至今天:' ,sy-datum, '其年龄为:',eage,'岁',
/10 '出生所在季度为:',equater,'所在月是:',emonth,'此月共有:',emdays,'天。',
/10 '其电话号码为:',ephone,'所属电信供应商为:',esupplier .
MESSAGE s000(zu03_mclass01) WITH '员工:' && ename DISPLAY LIKE 'I'.
如上4部分代码按顺序组合在一起,则是此实践的完整实现代码,输入后可通过程序美化器自动编排。