SAP--ABAP程序开发规范
1 范围
本标准规定了SAP S/4 系统程序开发过程中术语定义、命名规则、程序结构、测试方法和请求管理。
本标准适用于SAP S/4 系统的ABAP语言开发的程序。
2 规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅所注日期的版本适用于本文件。凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。
GB/T 1.1-2000《标准化工作导则 第1部分:标准的结构和编写规则》
3 术语和定义
3.1 SAP
SAP来自于Systems Applications and Products in Data Processing,它是德国思爱普公司的英文名称。
3.2 SAP S/4
SAP S/4 是一个基于客户/服务机结构的开放、集成的企业资源计划系统(Enterprise Resource Planning,简称:ERP)软件,其功能涵盖企业的财务管理、后勤管理(含采购、库存、生产、销售、设备、项目、质量等模块)和人力资源管理等各个方面。SAP S/4 软件由德国SAP公司所研创,其R 指实时(realtime), 而3表示S/4 系统是三层架构:数据库、应用服务器、展现层。
3.3 ABAP
ABAP是一种高级商务应用编程语言(Advanced Business Application Programming),SAP S/4 系统的应用程序就是用ABAP/4编写的。
3.4 AA
AA表示SAP S/4 应用模块,其模块如下:
AA模块 |
模块名称 |
FI |
财务会计 |
CO |
管理会计 |
SD |
销售分销 |
MM |
物料管理 |
PM |
工厂维护 |
HR |
人力资源 |
PS |
项目管理 |
BW |
数据仓库 |
BC |
系统相关 |
OT |
其他 |
3.5 PT
PT表示程序类型,其类型如下:
PT类型 |
名称 |
RP |
Printing Report 打印输出报表 |
EX |
Enhancement User Exit 功能增强 |
FM |
Function module函数 |
QR |
Query 查询 |
SF |
Smart Forms快速格式报表 |
BI |
Batch Input 批输入 |
3.6 DT
DT表示数据对象类型,其类型如下:
DT类型 |
名称 |
TB |
透明表 |
VW |
视图 |
DE |
数据元素 |
ST |
结构表 |
TT |
表类型 |
CI |
类 |
TG |
类型组 |
DM |
域 |
HP |
帮助 |
LO |
锁对象 |
3.7 符号说明
符号类型 |
名称 |
[XX] |
XX是必要组成部分 |
{XX} |
XX是条件式的必要组成部分 |
<XX> |
XX是可选组成部分 |
4 命名规则
4.1 程序名命名规则
4.1.1 克隆系统标准程序的程序其名称按Y{_}[PROGRAM]格式编写;
4.1.1.1 Y表示该程序是克隆自系统标准程序;
4.1.1.2 克隆的程序是函数时,必须包含“_”;
4.1.1.3 PROGRAM表示被克隆的系统标准程序名称,如果PROGRAM的字符长度达到最大长度,可省略后面多余的字符;
4.1.2 新开发程序名称按Z{_}<AA><PT><SEQ>{FSQ}格式编写;
4.1.2.1 AA表示SAP S/4 应用模块,其定义见3.4;
4.1.2.2 PT表示程序类型,其定义见3.5;
4.1.2.3 SEQ表示流水序号,范围为000-999;
4.1.2.4 FSQ表示包含文件的流水号,范围为F00-F99;
4.1.2.5 创建的程序为函数时,必须包含“_”;
4.1.2.6 创建的程序为INCLUDE程序时,必须包含FSQ;当该程序仅用于一个特定程序时,程序名称由AA、PT、SEQ、FSQ部分组成;当该程序可用于某类程序类型时,程序名称由AA、PT、FSQ部分组成;当该程序可用于所有程序时,程序名称只包含FSQ;
4.2 事务代码命名规则
事务代码是由一组有效字符组成的字符串,在SAP系统中为了方便用户使用系统功能和应用的快捷方式。在ABAP程序开发过程中,为了体现事务代码的有效意义,只针对程序类型为报表类(RP)、函数模块类(FM)、维护表视图以及查询建立事务代码。为了便于事务代码的分类和区别应用,把事务代码分为业务类事务代码和管理类事务代码,其中业务类事务代码作用于报表类应用,管理类事务代码作用于配置类应用。
4.2.1 在克隆系统标准程序的程序开发过程中,当原系统标准程序有事务代码时新建事务代码名称为:Y+原事务代码;当原系统标准程序无事务代码时新建事务代码名称按Y[AA][SEQ]格式编写;其它情况下的事务代码名称按Z[AA][SEQ]{SQ}格式编写;
4.2.2 AA表示SAP S/4 应用模块,其定义见3.4;
4.2.3 SEQ流水号必须与对应报表的流水号相同,相同应用模块下的不同程序类型的流水号不能相同,如果存在相同情况,那么需在后面加上报表类型,如ZMM010QR;
4.2.4 SQ表示流水号,范围为00-99,其只适用于管理类事务代码;
4.3 开发类命名规则
4.3.1 开发类的名称按Z[AA][SQ]格式编写。其中AA表示SAP S/4 应用模块,其定义见3.4;SQ表示流水号,其范围为00-99;
4.3.2 一个开发类只对应一次项目的一个应用模块,非项目期间的开发类流水号使用99,一个应用模块可对应多个开发类,在增加开发类时需按流水号递增编写;
4.4 函数组命名规则
4.4.1 函数组的名称按Z[AA][SQ]格式编写。其中AA表示SAP S/4 应用模块,其定义见3.4; SQ表示流水号,其范围为00-99;
4.4.2 一个函数组只对应一次项目的一个应用模块,非项目期间的函数组流水号使用99,一个应用模块可对应多个函数组,在增加函数组时需按流水号递增编写;
4.4.3 表格维护生成器里的函数组使用该数据字典对象名作为其名称;
4.5 消息类命名规则
消息类是ABAP程序开发中为异常情况而设计的故障信息类别,这样有利于问题的跟踪、诊断和解决。消息类的名称按Z[AA]格式编写,其中AA表示SAP S/4 应用模块,其定义见3.4;
4.6 区域菜单命名规则
4.6.1 区域菜单的名称按Z[AA][SQ]格式编写。其中AA表示SAP S/4 应用模块,其定义见3.4; SQ表示流水号,其范围为00-99;
4.6.2 一个区域菜单对应一个应用模块,一个应用模块对应多个区域菜单,在增加区域菜单时需按流水号递增编写;
4.7 数据字典命名规则
4.7.1 数据字典包含表、视图、数据元素、结构、域、帮助等方面的内容,新建名称按Z[AA][DT][NNN]格式编写;
4.7.1.1 AA表示SAP S/4 应用模块,其定义见3.4;
4.7.1.2 DT表示数据对象类型,其定义见3.6;
4.7.1.3 NNN表示数据对象说明,可以用三位数字或字母来描述;
4.7.2 克隆系统标准数据对象的对象,按Y[DO]格式编写。其中DO表示被克隆的系统标准数据对象,当DO的数据对象名称长度已经达到最大长度时,可省略后面多余的字符;
4.8 文本符号命名规则
4.8.1 在程序中尽可能使用文本符号存储文本信息,避免“硬代码”;
4.8.2 文本符号也可以进行分类,分类如下:
文本号 |
用途 |
E01-E99 |
错误文本 |
I01-I99 |
提示文本 |
W01-W99 |
警告文本 |
S01-S99 |
SELECTION-Screen使用 |
T01-T99 |
一般文本 |
H01-H99 |
报表头或表格标题等 |
4.9 变量命名规则
4.9.1 为了更好的区分变量的作用范围,规范变量的正确引用,把变量分为局部变量和全局变量。全局变量必须定义于程序头,其名称一般增加前缀“g_”,但为简化书写可省略全局变量的前缀;局部变量可根据实际情况灵活定义,其名称必须增加前缀“l_”;
4.9.2 为保证数据的一致性,在变量定义时尽量使用like、type等进行引用已有类型;
4.9.3 定义变量应按照一定的顺序定义,参考顺序如下:
4.9.3.1 Tables (only if required for SELECT-options)
4.9.3.2 Nodes
4.9.3.3 Infotypes
4.9.3.4 Controls (for dialogue processing only)
4.9.3.5 Type-groups
4.9.3.6 Types
4.9.3.7 Constants
4.9.3.8 Data (structures)
4.9.3.9 Data (internal tables and their work areas)
4.9.3.10 Data (objects)
4.9.3.11 Ranges
4.9.3.12 Data (simple fields)
4.9.3.13 Field-symbols
4.9.3.14 Field groups (followed by INSERT into field-groups)
4.9.3.15 SELECTION-Screen data (for list processing only)
4.9.3.16 Parameters
4.9.3.17 SELECT-options
4.9.4 为便于识别变量类型,在变量前需要增加变量类型前缀,如下:
类型 |
说明 |
变量前缀 |
备注 |
C |
字符串 |
c_ |
|
N |
数字 |
n_ |
|
D |
日期 |
d_ |
|
T |
时间 |
t_ |
|
X |
十六进制 |
x_ |
|
I |
整数 |
i_ |
|
P |
压缩号 |
pn_ |
|
F |
浮点数 |
f_ |
|
String |
字符串 |
str_ |
|
Xstring |
X字符串 |
xstr_ |
|
Constants |
常量 |
con_ |
|
Type |
类型 |
ty_ |
|
Internal Table |
内表 |
itb_ |
|
Work Area |
工作区 |
wa_ |
|
Range |
范围 |
s_ |
|
Field-symbols |
字段符号 |
fs_ |
|
SELECT Options |
选择选项 |
s_ |
|
Parameters |
选择参数 |
p_ |
p_名称 |
Radiobutton |
单选 |
rb_ |
|
Checkbox |
复选框 |
cb_ |
|
Select |
下拉框 |
sl_ |
|
Form Name |
子程序名 |
无 |
动词_其它描述 |
Form Parameters |
子程序参数 |
p_ |
p_变量属性_名称 |
Function Name |
函数名 |
z_,y_ |
参考4.1.2 |
Function Parameters |
函数参数 |
变量前缀 |
变量属性_名称 |
4.10 子程序命名规则
4.10.1 在子程序定义时必须有相应的用途和参数说明等,样式如下:
*&---------------------------------------------------------------------*
*& Form 子程序名
*&---------------------------------------------------------------------*
* 用途说明
*----------------------------------------------------------------------*
* -->P_P1 传入参数1
* -->P_P2 传入参数2
* <--P_RP1 返回参数名
* -->P_TB1 表参数
*----------------------------------------------------------------------*
4.10.2 子程序引用参数前缀使用“p_”;
4.11 报表输出
4.11.1 报表输出方式有ALV,EXCEL,直接写屏或其它;
4.11.2 EXCEL输出方式模板文件名称按[AA][SEQ]<OT>格式编写;
4.11.2.1 AA表示SAP S/4 应用模块,其定义见3.4;
4.11.2.2 SEQ为流水号,该流水号必须与对应的程序流水号相同;
4.11.2.3 OT表示其它字符或数字等,当AA和SEQ都无法唯一区别时,可以使用该选项;
4.11.3 当EXCEL输出方式模板文件为EXCEL时,其表格名称必须按文件名称重命名;
5 程序结构
良好的程序结构便于阅读和维护,能大大提高软件开发人员的工作效率。在ABAP代码编写过程中,可根据程序类型不同而顺序包含5.2中的部分结构。
5.1 程序事件
5.1.1 INITIALIZATION
5.1.2 AT SELECTION-SCREEN OUTPUT
5.1.3 AT SELECTION SCREEN ON VALUE-REQUEST
5.1.4 AT SELECTION SCREEN ON HELP-REQUEST
5.1.5 AT SELECTION SCREEN ON <parameter>
5.1.6 AT SELECTION-SCREEN
5.1.7 START-OF-SELECTION
5.1.8 GET <node>
5.1.9 END-OF-SELECTION
5.1.10 TOP-OF-PAGE
5.1.11 TOP-OF-PAGE DURING LINE-SELECTION
5.1.12 END-OF-PAGE
5.1.13 AT LINE-SELECTION
5.1.14 AT USER-COMMAND
5.1.15 FORM
5.1.16 ENDFORM
5.2 代码结构
5.2.1 程序头部
程序头部是记录程序开发过程中的一些控制信息,便于对程序的功能了解和后期维护,样式如下:
************************************************************************
* 程序名:XXXXX
* 程序名称:XXXXX
*-------------------------------------------------
* 创建日期 程序员 SAP版本 程序类型
* YYYYMMDD XXXXXX R4.7 RP/F...
*-------------------------------------------------
* 描述:
* XXXX
*=================================================
* 修改日期 版本 修改人 修改描述
* 1.1
************************************************************************
5.2.2 程序名称部分
程序名称部分记录程序名称及其它属性,样式如下:
REPORT XXXXX MESSAGE-ID XX.
5.2.3 全局定义部分
全局定义部分包含表、信息类型、全局变量的声明,样式如下:
*----------------------------------------------------------------------*
* GLOBLE-DEFINATION *
*----------------------------------------------------------------------*
tables:...
infotypes: ...
include zrpcm001.
data:...
5.2.4 程序取数逻辑部分
程序取数逻辑部分包含屏幕样式、程序初始化、人机交互、取数逻辑等,样式如下:
*----------------------------------------------------------------------*
* SELECTION-SCREEN *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* INITIALIZATION *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
取数语句
*----------------------------------------------------------------------*
* END-OF-SELECTION *
*----------------------------------------------------------------------*
END-OF-SELECTION.
5.2.5 结果输出部分
结果输出部分包含模板下载、结果填充等,样式如下:
PERFORM templetdownload USING 模板名.
输出语句
PERFORM displayexcel."显示EXCEL
5.2.6 子程序部分
*----------------------------------------------------------------------*
* SUBROUTINES(子程序FORM) *
*----------------------------------------------------------------------*
5.3 程序注释
5.3.1 良好的程序注释便于程序的理解,达到“程序文档化”的状态。注释主要用于程序头说明、变量说明、修改备注、包含文件引用说明、FORM程序说明以及其它说明。
5.3.2 程序注释分为行外注释和行内注释。行外注释就是注释单独成行,行首使用星号“*”标识,行内注释就是注释与变量、方法、对象等在同一行,并且放在其后,注释字符前使用英文的双引号“"”标识;
5.3.3 程序头部说明采用行外注释方式,主要包含程序名、程序名称、创建信息、程序用途以及修改原因和情况;
5.3.4 变量说明一般采用行内注释方式;
5.3.5 修改备注、包含文件引用说明采用行外注释方式;
5.3.6 FORM程序说明采用行外注释方式,主要包含FORM名称、功能说明以及参数说明等;
5.3.7 其它说明是指在IF、LOOP、CASE、WHILE等结构的开始和结束处加上注释,便于分解程序运行逻辑;
5.4 其它
5.4.1 在程序编写过程中注意代码段间行宽,在合适处换行来提高代码可读性;
5.4.2 为了保证程序在不同SAP版本间的兼容性,每行ABAP代码不能超过72个字符;
5.4.3 在使用DO语句时,尽量使用DO x TIMES,避免出现死循环;
5.4.4 两个结构体ty_a、ty_b进行赋值,使用ty_b=ty_a,而不使用MOVE-CORRESPONDING ty_a TO ty_b;
5.4.5 两个内表itab1、itab2结构相同,需要赋值,使用itab1[]=itab2[],而不使用循环操作赋值。
6 测试方法
6.1 测试案例编制
6.1.1 测试案例就是设计一个业务运行情况,软件程序在这种情况下,必须能够正常的运行并且达到程序设计的预期执行结果;
6.1.2 测试案例编制方法有等价划分法、边界值分析法、错误推断法、因果图法、判定表驱动法、正交试验法、功能图法等;
6.1.3 测试案例由用例编号、用例目的、操作步骤、输入数据或调用数据、期望结果等组成,格式如下:
用例编号 |
用例目的 |
操作步骤 |
输入数据/调用数据 |
期望结果 |
001 |
测试多个公司时显示顺序是否先按公司排序 |
输入多个公司代码操作 |
输入两个以上公司代码 |
先按公司排序 |
6.2 测试场景的定义
6.2.1 测试场景就是对用户需求内容的不同情况的定义。在场景设计过程中要尽量考虑全面,特别是一些很少发生的业务逻辑,这样才能达到程序与需求间匹配性的全面诊断;
6.2.2 测试场景由用例编号、用例目的、场景编号、场景名称、场景目的、菜单路径/事务代码、所用字段、字段数据、预期结果、实际结果等组成,其格式如下:
用例编号 |
用例目的 |
场景代码 |
场景名称 |
场景目的 |
菜单路径/事务代码 |
所用字段 |
字段数据 |
预期结果 |
实际结果 |
001 |
001.01 |
6.3 测试数据生成
按测试场景要求操作相关业务,以获得测试过程中需要的各种业务数据;
6.4 测试结果的反馈
6.4.1 测试结果填写在场景测试的实际结果栏;
6.4.2 如果实际结果与预期结果一样使用绿色字体进行说明,否则使用红色字体进行说明。在程序员调整完相应的逻辑后,又再次进入程序测试;
7 请求管理
7.1 请求的生成
7.1.1 客户的测试数据,如果不传生产系统,那么尽量使用本地对象,不要产生传输请求;
7.1.2 请求生成过程中,如果不同传输内容需同时传到生产系统,那么尽量使用同一传输请求;
7.1.2 传输请求描述尽量能准确表现请求的用途,在其末尾加上生成请求的年月日时间;
7.2 请求的释放
7.2.1 确认请求任务下的所有子请求已完成,所有包含的对象已激活;
7.2.2 对请求进行检查,确认无错误报告,同时需注意报警信息;
7.2.3 为方便信息跟踪和请求的协调管理,需在文档栏填写带释放人信息的备注;
7.3 请求的上传
7.3.1 在传输请求前,需要明白传输的内容以及影响范围;
7.3.2 传输完成后需在生产系统上进行检查和验证。