SAP开发规范

SAP开发规范
SAP开发规范

录SAP开发规范

1.1 1.2

1-4

内容说明规范目的使用说明使用对象

一般规则代码管理

3.1

3.2

3.3

3.4

3.4.1程序标题................. r程序、模块标题 ........ 编辑器设置............... 代码格式.................

使用规范化打审机査询

SQL语句的写法、

3.5变更记录管埋......

3.6代码注释..........

3.7r程用与函数模块.

3.8

其它注意事项

?????????

3.4.2

数据库査询

4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12不耍在LOOP循坏中使用SELECT涪句 ...................... 取数的时候不能使用SELECT……ENDSELECT语句循环操作

尽量*使用内衣....................................... SELECT 与SELECT*比较....................

外部检査...................................

SELECT SINGLE语句使用注意.....................

SELECT语句中扌II疗与ABAP语句中排序比较

SELECT DISTINCT 语句使用......................

批量更新数据库农...........................

FOR All ENTRIES 语句...........................

OPEN SQL 打NATIVE SQL 比较农连接........................

内表使用注童

5.1

5.2

5.2.1内衣定义.................

内衣使用.................

修改内农中的字段值、

10

10

10

11

11

11

11

11

11

5.22 5.23 524 525 5.2.6 5.2.7 5.28 5.2.9把一个内&附加到另一个内表后面..............

删除内衣中重复彳亍.........................

根据条件删除内衣中的彳亍...................

内衣是否为空的判断.........................

读取内农彳亍...............................

通过LOOP AT it tab ASSIGNING

通过平彳亍光标来连接两个内&................

释放内&....................................

11

12

12

12

12

13

13

14

6 数据字典对象14

6.1 6.2 6.3 6.4

建衣规则....................

创建数据元索/域的城本规则添

加客户化字段到SAP农中■

索引维护

文件处理

SMART FORM

14

14

14

15

15

16

16

10其它注意事项16

10.1 10.2 10.3消息类使用.....................

r-程序参数传递................

局部变量与全局变量的使用比较

16

16

16

11 代码检査18

12 ABAP性能例子18

SAP 开发规范

1说明

1.1内容说明

开发规范总的包含了以下三方而的内容

《SAP 开发规范》,即本文档,主要内容为: > > > >

涉及开发中的命列,统一命名规则,方便程序的沟通、阅读

提高SAP 项目中开发的效率、质量,实现标准化管理

在客户有开发规范的情况下,请按照客户的开发规范进行开发 如客户未有现成的开发规范,请按照公司的开发规范进行开发

请确保在开发的时候遵循了以下规则,如模糊不淸时,请及时重新査阅。如有冲突的地 方,请与项目上的开发负责人进行确认

任何在SAP 系统进行开发的人员 初学ABAP 开发者

一般规则

以下为开发过程必须遵守的一般规则,请遵守。

请严格按照《SAP 开发命名规范》进行相关命名 请遵循《SAP 项目管理流程》来进行开发及开发管理 在开发完成后,在开发系统中淸除不需要的对象 不可随便修改SAP 源代码,除非是客户化字段、用户出口等 若确实需修改SAP 源代码,请与技术负责人确认,并进行严格记录、测试 在程序中不要遗留下没有使用的变量,可以使用''ExtendedProgramCheck-ji 行检查 当有文本输出时,通过维护文本符号来实现。使用文本符号方便翻译 使用常数来代替固左数值或固是字符

常数必须楚义为全局的。优点:可重复使用,只需修改一个地方 请不要在代码中对组织架构(公司代码、工厂、采购组织等)的数据赋予固定值,组织 架构的值可通过参数(Parameter )、选择范用(Select-options 变式等方式来传值 不要使用TABLES 语句崔义的数据结构,使用专门世义的工作区 TABLES 语句只用于Select-options 需要的时候

尽可能不要使用MOVE-CORRESPONDING 语句,因为比较耗时

在SQL 语句执行完成后、内表操作语句执行完成、调用完函数等之后,检查返回码 sy-subrc 的值,并做判断处理

说明开发中要注意的事项 代码编写的规范

开发中要遵循的规则 性能有关的例子

1.2 规范目的

13

使用说明

1.4 使用对象

一般情况下为一个程序创建一个对应的请求,以防传输时混乱

憤用ABAP中的宏,因为宏不易维护且不可调试

所有的开发的程序必须分配对应的事务代码,从而可避免给用户分配SA38或SE38的权限

原则上一个程序的代码不能超过2000行,超过2000行请使用include program确保可读性

代码管理

在创建一般报表时,请拷贝报表模板程序,并在模板程序的基础上进行代码编写。模板程序主要包括了程序标题格式、事件关键字等内容。方便程序编写并统一规范。

3.1程序标题

每个程序标题必须包括了程序名称、程序名、开发日期、开发者、概要、变更记录(日期、变更者、传输请求号、修正内容)。请参考以下例子:

3.2子程序、模块标题

在子程序定义前面必须进行注释说明。说明内容包含:包括子程序名称、子程序功能描 述、参数功能等。模块与子程序类似。

子程序例子

* Form GET_COMPANY_CODE_DESCRIPTION

* __________________________________________________ * 通过传入的公司代码,得到公司代码描述

*

* 传入参数:fu_bukrs 为公司代码

* ___________________________________

FORM get company code description USING fu bukrs CHANGING fu butxi.

模块例子 *_ — *

*

MODULE SET_PFSTATUS OUTPUT

+

*

设置屏幕100的GUI 状态

* *

MODULE SET-PFSTATUS OUTPUT,

*

注意:请将可能详细的维护子程序、模块的标题借息。 另:

原则上一个FORM 的长度不能超过300行,如果超过300行, 确保程序的可读性。

如:要从10个表中取数,我们可以将其拆分为多个FORM, FORM,当从某个表取字段过多(或者取出即有部分处理逻辑)时, 个 FORM 。

为了使原代码更易于解读,规定对编勒*器进行设置。 设置路径为:SE38-A 实用程序(P )-〉设置(E )

编辑器:设置使用新的编辑器、每行最长72个字符长(注:抓图为ECC6.0例子,其它版 本请以实际为主)

请尽量拆分为多个FORM, 其中取文本表的单独一个 我们甚至可以将其单独一

“规范化打印机(prettyprin" 设置:缩进、关键字大写

& User-S pedfic Settings

3.4代码格式 341 使用规范化打印机

SELECT field 1 *xxx

? SELECTJNTO.FROM 等缩进两空格 field2 “XXX

? WHERE 缩进一空格

INTO TABLE it_mara ? 字段fieldtfield2每个都进行换行,并在字段名后注

FROM MARA

释其意义

WERE niatnr =wajab-matnr

要求在代码编写完成后,点應代扌卿」

在编写代码过程中使用该按钮,也有助于发现输入错误的语句。 注意:如果规范化打印机不可用,则手工的调整代码,使代码结构化.

3.4.2 查询SQL 语句的写法

Open SQL 按如下格式对齐,有助于阅读和査看 来格式化代码,使代码自动缩进、关键字大写等,

/ workbench (GeneiaO KuML Settings^ ABAP Editor Class Builder Screen Painter Bl

:reen r Debugging r Patrrn r worklBt

Editor X P

伦try

3.5变更记录管理

当程序传到生产机之后,开始进行变更管理。变更管理开始后,进行程序的修改时要注意以下:> 在程序的开始处的变更记录上记录以下内容

修改标识

意义 Ins 新增 Chg

修改 Del

删除

注意:在IM 除代码时,只是注释,不要实际物理的删除代码.

数据声明和程序的逻辑部分必须要有注释,逻辑部分的注释尽量控制在整个程序代码的 10%~20% 左右 Q 特殊的标记字段要在注释中说明其用法

根据项目语言使用情况选择用中文或英文进代码注释和文档说明 在初次提交的代码中不要保留初注释掉的代码行

3.6 代码注释

日期 修改者 传输请求号 修改内容及原因

> 在修改的程序代码处,要通过类似如下注释包括起修改的内容 ****2012/01/08张三规格变更Chg 修改开始 *修改原因: *

****2012/01/08张三规格变更Chg 修改结束

在涉外的开发项目中,注释和说明要用英文

程序中的代码要尽量实现模块化,即如果程序中多个地方将会用到相同的代码,那么将 这些代码封装在子程序中,以便可以随时调用,同时也增加了程序的可读性和可维护性 当相同的功能的代码可以被多个程序使用时,最好宦义成函数模块 避免调用外部程序中的子程序

在每一个程序行中,最多只有一个语句,避免一条程序行中包含多条语句的写法?

4数据库査询

在使用SELECT 语句中,尽可能把握以下几个原则:

尽可能的在Where 条件中包含多的索引字段作为条件 Where 条件中的索引字段按表中的索引顺序排列

尽可能的在Where 条件中包含多的条件,即使字段不是索引的

在循环中使用Select 语句将会频繁的访问表,尽量减少数据库访问的操作。 以下语句是不建议的。 LOOP AT iljab INTO wajab.

SELECT * FROM MARA

INTO TABLE it_mara WERE matnr =wa_tab-matnr ENDLOOP.

4.2取数的时候不能使用Select .... Endselect 语句循环操作

注意:必须避免嵌套的因为每条记录将连接一次数据库?

4.3尽*多使用内表

为了提高程序的性能,通常先把数据库表中的数据取到内表中,在内表进行数据处理。减少 重复访问相同数据表的情况。 例:

(错误)

3.7 子程序与函数模块

3.8 其它注意事项

4.1 不要在Loop 循环中使用Select 语句

(正确)

4.4 Select 与 Select* 比较

会明显更快. 例:

建议写法

SELECT * FROM dbtab

INTO TABLE iljab WHERE .

SELECT field 1

field2

FROM dblab

INTO TABLE it_iab WHERE .

仅用于某种特殊情况时,如表的字段数很少 或数据记录不多

> 当表中包含的大量字段时

>

使用Select 虽然会增加代码的工 作S,但会减少内存的使用及网络的负 担

4.5外部检査

尽可能避免使用Select COUNT (*)来确认表存在的记录数,因为该语句将会对表进行全扫 描。

Select single 语句使用注意

当使用Select Single 时,要求在where 条件语句中包含所有的关键字

当不能确定所有关键字而能确世只有一条记录匹配时,可使用'Select ...up 10 1 rows ■来査 询

Select 语句中排序 与ABAP 语句中排序比较

对数据排序有两种方式:一种为在数据库服务器中排序:一种为在应用服务器中排序。

建议写法

SELECT field 1

SELECT field 1

field?

field2

FROM dbtab FROM dbtab INTO TABLE iljab INTO TABLE itjab WHERE. WHERE ? ORDER BY field 1.

SORT it jab BY field!.

4.6 4.7 数据库

4.8 Select distinct 语句使用

4.9批量更新数据库表

有助于性能的提高。

在更新数据库数据时,可以一条一条记录的更新,也可批量的更新多条记录。当更新记录数较多时,请采用批量更新的方式,

SY-SUBRC

为0时则所有记录都成功更新。 SY-DBCNT

该值为成功更新的记录数。

4.10 For All Entries 语句

说明:For All Entries后紧跟的内表称为驱动内表。

在使用该语句时,驱动内表不能为空,若为空,则等价于无此条件,可能造成全表的检索。所以,在使用For All Entries时,要先对驱动内表是否为空进行判断

在使用该语句前,尽可能保持少的驱动内表条目数,尽可能使驱动内表中的条目为唯一的(可先进行删除重复行等操作)。这样可避免在数据库中进行了不必要的读取避免使用该语句读取小的数据库表(如配置表),对于小的数据库表使用单独的SELECT 语句将会更好

便用该语句时,尽可能的连接数据库表中的索引,否则将会重复的全表扫描,并注意按数据库表中的索引顺序来写Where语句

驱动内表与INTO后的内表不可以是同一个内表

4.11 Open SQL 与 Native SQL 比较

开发人员不准使用Native SQL,如果非得使用,请与项目组技术负贵人确认。

4.12表连接

vbak 为主表 vbap 为副表

在Where 条件中必须有主表的关键字或索引 在where 条件中尽可能的指立跟主表有关的条件

在某种情况下可以考虑建立对应的视图来代替表连接的使用

内表使用注意

在定义内衣时,建议先定义对应的类型,再定义内衣。

注意:请《免使用带表头的内表.SAP 将会废弃此荐功能,目前在面向对象编程中不支持带表 头的内表?

5.2内表使用 521

修改内表中的字段值

?

使用 MODIFY itjab TRANSPORTING field …WHERE

>

将可加快修改内表记录集的速度。特别是在内表行中有嵌套内表时,该写法将可明 显增加速度。

?

通过

LOOP 处理来修改所有的组件

>

内表iljabOl 和内表itjabO2有相同的行结构且包含一泄的记录集。 522

例:

说明: 5.1 内表定义

内表的大量修改必须通过在LOOP 循环中来实现 把一个内

表附加到另一个内表后面

读取内表行

关键字读取

READ TABLE it Jab INTO wajab WITH KEY field = value. 关键字二分搜索读取

READ TABLE it Jab INTO wajab WITH KEY field = value BINARY SEARCH, 索引读取 R EAD TABLE iljab INTO wajab WITH KEY field = value INDEX Undcx. *注意:在使用二分搜索读取内表时,要先按关键字对内表进行排序 性能比较:

当可以通过指泄索引读取内表时,用指圮索引读取 如若不能,则通过二分搜索进行读取 例:

LOOP AT iljabO 1 INTO waJabO I ?

READ TABLE itJabO2 INTO waJabO2 WITH KEY field = waJabOl-field. CHECK sy-subrc = 0. ENDLOOP,

通过内表关键字来连接两个表

SORT it lab02 BY field. LOOP AT it labOl INTO wa labOL

READ TABLE it labO2 INTO wa labO2 WITH KEY field = wa labOl-field BINARY SEARCH. CHECK sy-subrc = 0. ENDLOOP.

内表是否为空的判断

通过LOOP 循环实现内表的附加

523

删除内表中重复行

先对一个内表按删除时比较的字段进行排序,再通过以下语句删除重复行。 DELETE ADJACENT DUPLIC T VTES FROM iljab COMPARING field...

通过使用关键字二分搜索来连接两个表

要对内表iMab02先按字段field进行排序

5^__通过LOOP AT H_tab ASSIGNING ?5>循环内表

?由于字符变iE<fs>指向内存地址,此种方式比LOOPATilJab INTO wa.iab方式快

?适合于数据量大、需要循环处理的内表

?在READ语句中也可以使用类似的字符变量。

注意:

?使用此种方式请确保对字符变量有充分理解

?在此种方式的内表循环中,不要再使用ASSIGN语句给vfsA指左其它的值

?通过此种方式修改内表行的数据时,不要使用MODIFY语句

5.2.8 通过平行光标来连接两个内表

方法一:

SORT it labOl BY field.

SORT it iabO2 BY field.

1 index = 1.

LOOP AT it tabOl INTO wa tabOl.

READ TABLE it tabO2 INTO wa tabO2 INDEX I index.

CHECK sy-subrc = 0.

IF wa tabO2-field = wa labOJ-field.

I index = 1 index + 1.

ENDIE

ENDLOOP.

要先对内表iljabOl和itjab02按字段field进行排序

当两个内表条目数很大时,如上十万、百万,使用此种方法将会极大的增加程序性能方法二:

SORT it labOl BY field.

SORT it iab02 BY field.

LOOP AT it tabOl INTO wa tabOL

LOOP AT it tabO2 INTO wa tab02 WHERE field = wa labOl-field.

ENDLOOP.

ENDLOOP.

通过loop循环中的Where条件来进行连接,当内表条目数很大时,速度将会很慢,因为第二个loop循环相当于在全表扫描的査找内表iljab02

529 释放内表

当内表的内容不再有用时,使用FREE语句释放,可以减少程序占用系统的内存。

数据字典对象

6.1 建表规则

自;4^义时,在表的描述信息中要描述淸楚表包含的内容

数据库表一般楚义为集团独立的,即第一个字段必须为'MANDT,且是参考数据元素?MANDT'

可配置数据库表必须左义为集团独立的

若创建的数据库表为配置表,数据量少,修改少,经常访问,可在技术设置中对表进行缓存,从而增加

访问速度

若为应用表,不允许在技术设置中对表进行缓存

要求町维护的表必须爼成维护视團,并I L九每一个细护视国创建对咸的一个函数幻I」好避免?在拆期维护时影响,适成出错,也仃利干件能提岛

针对业务独立性高的可维护的单个表,为其创建表格维护程序。

对应的函数组名称为Z<模块A JVIAINTAIN:

对应的屏幕号为9000+10*n (毎个表格维护程序以10递增,一个维护程序有分两步

维护时,屏幕号为9000+10*n.9001+10*n)(n为自然数人

对应的维护tcode为Zv模块简写x900+n>o

针对业务耦合性高的多个表,当需要可维护时,在其之后创建一个维护视图,并针对此维护视图创建表格维护程序。命名方式参照上一步。

表中的字段必须使用数据元素

表中的字段名必须易懂且有一泄的含义,如:CHAR1作为字段务是不符合规则的

6.2 创建数据元素/域的基本规则

当自定义表中使用到SAP中的字段时,使用字段对应的数据元素/域

当自定义表中的字段名吋,使用更有意义的名称(如:用ZZCOMPANY代替ZCHAR4)如果自定义的字段参考一个表或一定值的数据集时,创建一个自定义的威来实现

不要修改SAP存在的数据元素/域

当新建一个结构时,尽可能的使用存在的数据元素/域。如果数据元素/域不存在,再创建对应的符合命需规范的数据元素/域

新建数据元素时,必须维护好数据元素的文本描述,如为多语言系统,需同时进行翻译

6.3 添加客户化字段到SAP表中

当往SAP表中添加客户化字段时,必须使用"Append structures"-

6.4 索引维护

创建、修改、删除索引将会增加数据库的负荷,所以,只有在需要时才进行索引的维护。尽可能的使用

已存在的索引

不建议修改系统原有的索引,而是自行创建索引

创建索引会提高査询性能,但也会降低更新性能,所以为了提高査询性能可创建索引

如果创建索引的表的条目数预计较多,需要进行更新性能测试

在新泄义索引前,需要与项目主技术负责人进行确认

主键必须楚义为唯一的

索引只包含需要的字段

创建索引或使用索引时,请注意字段的顺序,匹配的字段顺序可取得更好效果

在进行索引传输时,注意时间点的选择,一般在系统空闲期进行传输,如中午或下午下班后

文件处理

前台文件处理系统提供了类:cl_gui_frontend_services进行相关的前台文件操作,请尽可能使用该类中的方法进行前台文件相关的操作,如:cLguLfrontcnd_senaces=>gui_upload 用于上载文件cLgui_frontend_services=>gui_download 用于下载文件 cLgui_frontend_services=>file_deleie 用于删除文件cLguLfrontend_services=>file_save_dialog 文件保存对话梔cLguLfrontend_services=>tJirectory_exisi 判断目录存在性 cLguLfronlend_services=>file_exisi 文件存在判断

?Excel文件读取

Excel 文件读取请使用函数:ALSM_EXCEL_TO_INTERNAL_TABLE

该函数最多只能读取9999行和列(由于Table参数INTERN中的行、列均为4位的num类型九所以,如果业务需要,可以拷贝该函数组及函数,扩展相关的数据类型。

?服务器文件处理

服务器文件加载:使用0PEN DATASET语句,如:

OPEN DATASET IJilename FOR INPUT IN TEXT MODE

ENCODING DERWLT.

文件读取,使用:READ DATASET Lfilename INTO Iwjab.

文件写入,使用:TRANSFER Iwjab TO Lfilename LENGTH IJen.

请注意在文件操作完成后用CLOSE DM-ASET Lfilename.结朿操作。

服务器文件删除:DELETE DATASET Lfilename. 获取文件属性函数:EPS_GET_FILE_MTRIBUTES

获取文件名:cl_report_viewer=>split_paih_filename 注意:有前台文件操作的程序不适用于后台作业运行具体例子可参考以下附件:

H

文件处理程序例『 rtf

Smart Form

在程序中调用Smart Form时不能宜接指定Smart Form生成的函数务请注意通过函数

“SSF_FUNCTIO NJvIODULE_NAME'获取生成的函数名

上义Smart Form的表格接口时,如没有可用的参考结构或表,则新建结构来解决,请不要使用内存传输的方式。因为当有调整字段时,新建结构方法可减少错误建议一个Smart Form对应的创建一个样式

权限

所有的报表都要根据实际需要进行权限检査

在程序AT SELECTION-SCREEN事件处编写权限检査的代码

必须在程序的INITIALIZATION事件处对T-Code进行权限检査权限检査对象主要为组织架构的值,如:公司代码、工厂、销售组织…

例:

INITIALIZmON.

AUTHORITY-CHECK OBJECT -S_TCODE^

ID'TCD'FIELD sy-tcode, IF sy-subre o 0.

RAISE A MESSAGE ENDIE

10其它注意事项

10.1消息类使用

在程序中尽可能的进行相关的消息提示。消息提示可通过文本符号或消息类中的消息来显

不0

建议更多的使用消息类。消息类也方便传输参数。

10.2子程序参数传递

传输参数时尽可能指;4^类型,从而有助于语法检査,增加可读性、性能

传输中的参数如果不需要修改尽可能通过“USING“和“BY'ALUE"声明

注意:不要通过By VALUE"传输内表(memory consumption)

所有传输的参数要在子程序标题处写明意义及用法,并标明是属于导入还是导出的参数导出的参数要在子程序开始处进行初始化

尽可能的不要通过全局变量来隐藏的传输参数,如果全局变量被用于传输参数,在标题处进行说明

103局部变*与全局变量的使用比较

11代码检査

SAP 提供了如下列表中的事务代码供代码检査,请务必在开发完成后,请求传输前进行相 关检査。建议在代码编写中也进行检査。

12 ABAP 性能例子

在SE38的如下路径中.有关于ABAP 语句的性能例子,请学习并研究

\s

程序(E)彌佢)關@)实磁序2)严Tonment 系统匕)帮助(也 可 Q SI 隕

MDlicacion Hierarchy

Rgusd Library 艮epository Information System TrBnsport OroariGer [Requests)

Web Took Modification Browser Inactive Objects Data Browsor Test

K ?A 寻

? [

盂P 编辑器:初始屏释

⑥画BW 帀画W 詞

子对桑/ 伽代码

O 变式

OS 性 O 文恺

Controls Btanples

相关主题
相关文档
最新文档