1、1广西 XX 公司管理制度SAP 软件开发代码书写规范GZ/LG10.25-2xxx1. 目的和适用范围1.1 目的:加强 XX 公司 SAP 开发工作的管理控制,明确软件开发流程,使开发全过程职责清晰、任务具体。实现代码标准化、提高开发效率和代码可读性、增强软件可维护性。1.2 适用范围:适用于广西 XX 公司机械股份公司所有针对 SAP 的 ABAP 开发工作。2. 引用制度和术语解释2.1 引用制度2.2 术语解释用户:广西 XX 公司机械股份公司所有进行 SAP 二次开发的相关人员3. 代码书写规范代码除了用来实现程序逻辑外,最主要的用处还是给程序员进行阅读。整洁规范,空白错落有致,注
2、释恰到好处,命名和排版遵守统一规范的代码,能给工作带来便捷,同时视觉上也是美感。3.1、规范通用准则1、在命名语法格式中“” (中括号)符号内的为可选项2、在命名语法格式中“” (尖括号)符号内的为必填项。3、所有代码书写完毕后,必须使用代码编辑器里面的格式化功能(也叫规范化打印机) ,对代码进行格式化,使用系统默认的大小写格式。3.2、程序命名规范所有用户自开发程序均以 Z 开头,表示用户自已开发。程序命名字符长度不得超过 30 个字符。处理同一业务的表单、报表和事务码等名称需要一致。其具体命名规则如下。+ + _ _ NN + + _ _ INC+ NN 各部分含义如下:PREFIX: 为
3、程序前缀。必须为 Z 表示自开发的程序XX: 表示模块名,其具体规则如下表:表格 12模块前缀含义描述 模块前缀 含义描述FI 财务会计 HR 人力资源CO 管理会计 MM 物料管理AA 资产会计 SD 销售与分销TR 资金管理 QM 质量管理PS 项目系统 PM 设备维护EC 企业合并 CA 跨模块应用HR 人力资源 BC 基础组件T :表示程序类型,其具体规则如下:表格 2类型前缀含义描述 类型前缀 含义描述R 报表程序 B Batch inputI 接口程序 Q QUERYM 模块池 F 功能类Description: 为有含义的英文单词或汉语拼音,一般用于标识程序的含义。 NN: 为该
4、开发需求的子编号,为两位数字,如无子编号该部分可无。INCXX: 表示包含程序,INC 为前缀 XX 为两位数字示例:ZQMR_QualityNotification 表示该程序为质量模块,质量通知单相关的报表程序.ZQMR_QualityNotification_INC01 表示该程序是一个包含程序,一般其主程序为ZQMR_QualityNotification。当一个开发需要多个程序组成时,一般包含程序名 INCNN前面部分和主程序同名。3.3 函数命名规则格式定义: + + _ + Ex _ Prefix 前缀,必须为 Z XX :表示模块,定义见 3.2 的表 1。Ex: 当该函数可外
5、部调用,则增加 ex 标识。其为英文单词 External 的缩写。Description:表示函数名,要求有具体的语义的单词或者词组,多个单词可以下划线连接。示例:ZPP_SRM_GetAufnr 3.4 函数组命名规则格式定义: + + _ Description 各部分含义和 3.3 函数命名规则相同33.5 数据字典命名规则数据字典命名规范,即 se11 事务码创建的各种对象命名规则。各对象均以 Z 开头表格 3对 象 格式及说明 例 子透明表(Transparent Table) Z+_ ZTMMHT视图(View) Z+H = 视图类型, = 描述视图类型:D - Database
6、 View 数据库视图P - Projection View 射影视图M - Maintenance View 更新视图H - Help View 帮助视图Description 英文或拼音描述ZHMATNR物料号帮助视图索引(Index) Z+ , NN = 连续数字 Z01数据元素(Data Element) Z+;Description 英文或拼音描述 ZHETONG域(Domain) Z+ ;Description 英文或拼音描述ZHETONG结构(Structure ) ZS, Description 英文或拼音描述 ZSHETONGAPPEND STRUCTUREZ, = 表名 Z
7、ZEKKOTable Type Z, Description = 描述 ZXYZType Group ZG, = 描述 ZGXYZ锁对象(Lock Objects) E, 表名,如无特殊需求,一个表定义一个锁对象。EZTMMHT搜索帮助(Search help ) ZSH, Description 描述 ZSHHETONG3.6、程序内数据定义表格 4对 象 格式及说明 例 子变量 _ DATA g_count TYPE i.内表 _IT_ DATA g_it_matnr LIKE .工作区 _wa_ DATA g_wa_matnr LIKE选择表 _ _ RANGES g_rgs_matnr
8、 FOR选择屏元素 _ SELECT-OPTIONS: s_arbpl FOR子程序(Form)Sub+ using FORM sub_bg_co11n .程序内对象分类如上表 4 所示。下面详细介绍格式中的各选项含义。4 3.6.1、规则各项定义Range 定义范围, 种类如下, G(global) 全局范围 L(local) 局部范围 C(Constant ) 常量Prefix 前缀,种类如下S 用于复杂选择标准,即用于 SELECT-OPTIONS 关键字声明语句中选择屏参数的前缀。R 为单选按钮C 复选框D 下拉框Description 描述描述必须为有含义的英文或拼音。其中选择屏定义
9、时,字符串总长度不能操作 8 个字符。如果一个单词无法满足描述,需要多个单词的,可用下划线”_”连接多个单词进行描述。Parameters 参数子程序参数格式定义:P_参数以 P_ 开始,表示参数。Description 和上述相同。例:3.7代码注释规范代码注释分为源程序头注释、子程序注释、数据对象(变量)注释、函数事件注释、程序逻辑注释等。其总体原则为:a) 每个源程序头部必须注释b) INCLUDE 程序时,需要在代码行前或者后注释所引用程序的用途c) 每个子程序必须注释d) 每个函数、事件的开始必须包含说明性信息,描述功能、参数、返回值等信息。e) 循环语句前进行必要的注释。f) 在分
10、支语句前进行必要的注释。g) 在选择语句前进行必要的注释。h) 变量必须进行注释。 3.7.1 程序头注释为每个程序文件开始部分对该程序文件功能信息等的一种注释,包含程序名称、创建者、FORM sub_get_itab_struct USING p_bgjl TYPE STANDARD TABLE.ENDFORM.5创建日期、程序功能、备注等信息。如果是修改程序还需添加修改者、修改日期、修改内容等注释。例: 3.7.2 INCLUDE 程序注释Include 注释分为两种,一是逻辑块注释,即几个包含程序根据功能划分为一个整体进行注释。二是每个包含程序后面进行注释,解释包含程序的功能含义。其中逻
11、辑块注释为可选。例: 3.7.3 子程序注释子程序注释采用系统标准功能自动生成注释框架,当写完一个子程序的结构体后,可以点击格式化功能(有些翻译为规范化打印机) 。系统将自动添加子程序注释框架,生成如下图1 类似注释。包含子程序功能注释和参数注释两部分。我们只需要修改相关 text 为相关含义即可,修改后如图 1。*& Report ZPPR0025*&*&-*&开发:狄颖跃*&功能:工序库存监控表*&日期:2013/5/21*&来源:写 OA地址或者 mantis地址*&*&-*&修改:狄颖跃*&修改日期:2014/6/12*&修改内容:增加物料号字段*&*&-*INCLUDE zbg01g
12、01. “数据声明INCLUDE zbg01g02. “选择屏定义*-报工逻辑相关 -*INCLUDE ZBG01G03. “上线报工INCLUDE ZBG01G04. “中间工序报工 “INCLUDE ZBG01G05. “中间工序按物料无序报工INCLUDE ZBG01G06. “油漆上线INCLUDE ZBG01G07.“油漆下线*-End -*INCLUDE ZBG01GAL.“通用 co11n调用逻辑块注释6图 1 3.7.4 函数注释:充分利用函数编辑器自动注释功能,自动生成注释框架,在此基础上进行修改。下图中汉字部分的注释就是在自动注释框架基础上添加的必要注释。图 2 3.7.5
13、 循环语句和分支语句注释:此两种注释又称为程序逻辑注释,是为了注明某段代码的运行逻辑,能够使程序编写或修改者对代码运行原理一目了然的作用,如图 7 所示。除了在第一行注明循环或分支的逻辑外还可以在循环或分支内部进行必要的注释,使代码更加清晰,如图 6 所示。图 37图 4如果程序复杂,需要大段进行注释程序逻辑的。可以采用*号注释法,进行大段的注释,如下所示. 3.7.6 变量、结构注释代码中的数据对象(变量)必须进行清晰明了的注释。如图 7 所示。一般情况注释跟随在变量后面,特殊情况可在变量前进行多行注释。例: 3.8 对象命名相关规则具体请见下面表格所示,参考 SAP 官方推荐命名规则。表格
14、 1 类定义Class in the class library 格式:Z_CL_.*-*1首先获取通知单基本数据*2加载质量通知单关联的凭证*3根据通知单类型调用不同的数据初始化过程 *-TYPES:BEGIN OF s_pingzlist,“用于创建凭证DOKAR like DRAT-dokar,“凭证类型doknr LIKE draw-doknr, “凭证号dktxt LIKE drat-dktxt, “凭证描述DOKVR type DOKVR, “凭证版本DOKTL type DOKTL_D,“凭证部分END OF s_pingzlist.*-通用类型 -*DATA g_baseinf
15、o TYPE s_baseinfor. “基本信息DATA g_matnrinfor_f2 TYPE s_matnrinfor_f2. “物料信息DATA g_zlheader_f2 TYPE s_zlheader_f2.“质量事故报告头数据8类库中的类(全局类) 例:Z_CL_COMPANY_CODE, Z_CL_GENERAL_LEDGER_ACCOUNTInterfaces in the class library类库中的接口(全局接口)格式:Z_IF_例:Z_IF_STATUS_MANAGEMANT, Z_IF_CHECKERLocal classes in programs程序中的类
16、格式:LCL_例:LCL_TREE_MANAGEMENTLocal interfaces in programs程序中的接口格式:LIF_例:LIF_PRINTER表格 2:类中元素命名规则Method name(方法名) method name方法名以动词开头。例:GET_STATUS, CREATE_ORDER, DETERMINE_PRICEEvents(事件) event name事件名具体形式 noun_participle: 即 名词_分词例:BUTTON_PUSHED, COMPANY_CODE_CHANGED, BUSINESS_PARTNER_PRINTEDLocal typ
17、e definitions within a class (recommendation)(类中类型定义)TY_type name例:TY_INTERNAL_TYPE, TY_TREE_LISTData definitions (variables)变量定义variable name避免使用动词开头的名字 。例:LINE_COUNT, MARK_PRINTED, MARK_CHANGED, STATUSData definitions (constants)(recommendation)CO_constant name Co_开头9常量定义 例:CO_MAX_LINE, CO_DEFAULT
18、_STATUS, CO_DEFAULT_WIDTH, CO_MAX_ROWS4. 程序构造规范程序构造分为简单型和复杂型两种,简单型为整个程序代码都在同一个程序文件中,复杂型为程序代码根据功能划分为不同程序文件保存,命名规则见 3.2 4.1、简单型程序结构规范。程序顺序划分为如下几个区域1) 程序头部声明区域,具体格式见 3.812) 变量类型声明区,该区域用于书写程序中用到所有全局类型和变量。3) 选择屏幕定义区,该区域用于书写程序中选择屏幕定义的代码。4) 程序事件区域,该区域用于书写程序标准事件代码。5) 子程序区域,该区域用于定义子程序。6) ALV 报表代码区域,该区域用于书写,A
19、LV 报表先是代码。以上几个区域虽然语法上容许书写不分先后,但是为了逻辑清晰,方便观看、结构规范,必须严格按规定书写。其中程序事件区域的代码必须按照事件执行先后顺序书写,其顺序如下。表格 3顺序事件名称 代码 说明LOAD-OF-PROGRAM 程序初始化事件,最先执行1 初始化事件INITIALIZATION 程序初始化事件,晚于 LOAD-OF-PROGRAM 执行AT SELECTION-SCREEN 选择屏 PAI 事件2 选择屏幕事件 AT SELECTION-SCREEN OUTPUT 选择屏 PBO 事件3 选择开始事件START-OF-SELECTION.4 逻辑数据库事件GE
20、T spfli. 没有可不写5 选择结束事件END-OF-SELECTION以上事件除了逻辑数据库事件在没有的时候可以省略外,其他事件必须书写。以便程序结构清晰。示例:104.2、复杂型程序结构的构造。如果程序比较复杂,当一个程序文件无法满足开发需求时,可以按照功能划分为不同的程序文件,其划分一般规则如下。1) 主程序文件,该文件是整个程序的主文件,主要用于包含其他程序文件用。2) 全局变量类型声明文件,该文件用于声明所有本程序使用的全局变量和类型。3) 选择屏幕定义以及标准事件文件,该文件用于定义程序中标准程序事件和选择屏幕代码。4) 程序逻辑文件,该文件用于定义程序中用到的子程序,可根据具
21、体情创建多个子程序文件。通常用于书写程序逻辑代码。5) Module 文件,该文件用于书写程序中的 module ,可根据情况创建多个。6) ALV 显示逻辑文件,所有关于 ALV 显示的代码放于同一个文件内。包括 ALV 显示所用到的变量和类型。注:在主程序文件中书写包含各程序文件代码顺序的时候,必须按照“先声明后使用的原则” ,例如“全局变量类型声明文件”的include 代码必须放在第一个,否则有可能造成“未声明”错误提示。5. 程序性能优化参考1. LOOP 循环尽可能使用 where 条件语句实现过滤不相关行项目,以减少循环次数。2. 使用 SORT 语句代替数据库操作语句中的 OR
22、DER BY*&-数据类型定义区 -*&-数据变量定义区 -*DATA g_it_result TYPE STANDARD TABLE OF s_rt WITH HEADER LINE.DATA : wa_certificate LIKE zhgz.DATA : wa_certificate2 LIKE zlg_certificate.*&-*& 选择屏幕定义区*&-*SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.PARAMETERS p_werks LIKE zbgsng-werks OBLIGATORY MEMOR
23、Y ID wrk.SELECT-OPTIONS:s_pgdat FOR zbgsng-pgdat OBLIGATORY DEFAULT sy-datum。SELECTION-SCREEN END OF BLOCK b1.*&-*& 程序事件区*&-*LOAD-OF-PROGRAM.“程序类型为可执行程序 ,该事件最先执行INITIALIZATION.*&选择屏幕事件代码,如果没有可不写AT SELECTION-SCREEN. *& 选择屏 PAI事件 用户在选择屏幕中执行某些功能后出发 ,一般用于消息处理AT SELECTION-SCREEN OUTPUT. & 选择屏 PBO事件 ,显示选择
24、屏幕之前触发 .*& 执行 executeSTART-OF-SELECTION. “选择开始事件PERFORM sub_get_data.GET spfli. *& 逻辑数据库代码,没有可不写。END-OF-SELECTION. “选择结束事件PERFORM layout_build .PERFORM fields_init.PERFORM frmalv_out.113. 使用二分查找法读取内表,READ TABLE 的之前使用 SORT TABLE BY 对内表进行排序, 然后使用 READ TABLE WITH KEY .BINARY SEARCH. 进行查询4. 尽量避免使用 SELEC
25、T.ENDSELECT 语句Select endselect 语句属于重复循环查询数据库,每循环一次从新进行一次数据库读取操作,在大数据量的情况下将耗费大量数据库读取时间。5. 抽取数据时,避免使用 SELECT *尽量使用 SELECT A B INTO TABLE ITAB 这样的语句,明确写出列名将减少字段比较所耗费时间。可以通过 TCODE:ST05 SE30 进行程序和 SQL 语句性能和效率的分析。6. 慎用 FOR ALL ENTRIES IN 语句当不能使用 Join 语句进行数据查询的时候,我们往往会使用 for all entriesin 语句替代,但是该语句在某些特定时候
26、会出现耗时过多的情况。当 for all entriensin 的表为空的时候,很可能造成所查条件范围过广,而查询大量数据,导致查询时间过长。避免方法是在使用 for all entriensin 语句前,先判断相关内表是否为空,如果为空则进行相应处理。当 for all entriensin 内表有大量数据的时候,根据其工作原理会把驱动表里的条件字段的所有值用 OR 连起来,一次对 DB 操作,条件语句过多会减慢数据库运算速度。数据库语句 Where 条件尽可能把有索引的字段放到前面。尽可能把可过滤大量数据的条件放到前面7. SQL 语句合理安排 where 后的条件,顺序先后对查询性能有很大影响,尤其在大数据量的情况。一般原则是尽可能选择有索引,能够去掉大量数据的条件。