ABAP 书写规范

阅读: 评论:0

ABAP 书写规范

ABAP 书写规范

良好的书写规范有利于自己后期查看,也有助于其他ABAPer阅读,在部分代码检查工具是自动规范检查。

良好的书写规范包括:定义,SQL,逻辑处理,条件判断等等。

记录书写规范,随时对比,自勉。

一、ABAP Editor

1、关键字大写-Pretty Printer

2、输入两个字符,自动带出已定义字段

3、按住Ctrl + Space可以自动带出字段,function,class,及函数方法的出入参--注:需在英文键盘环境下

二、新建修改日志

1、程序开篇记录更新版本日志

2、修改位置插入标识,方便查找

三、声明规范

1)、前缀

1、全局,局部 ,定义类型 ,选择屏幕元素,出入参

L -- Local    G -- Global     T -- Type   P -- Parameters  S -- Select-Options  RD--Rediobutton  E -- Exporting  I -- Importing

2、变量类型

V -- Value     S -- Structure     T -- Table      R -- Range     O -- Object 

2)、后缀

1、描述性名称   eg. lv_matnr,gt_lips,gs_alv

2、功能选词 每个概念选择一个词 eg.  perform get_price ,method set_amount  , update_log 

3、去除多余干扰词  account instand of account data

4、 缩写  尽量避免缩写,写出全称

5、保证全局定义的名称后缀基本相同,当使用关键字搜索代码,避免遗漏

3)、常量

1、Constants代替 常量的直接判断。

四、布尔值的使用

1、用 ABAP_TRUE 代替 'X',用ABAP_FALSE 代替 ' '或Space

用 EQ、NE、GT、LT 代替 =、<>、>、<

2、使用XSDBOOL设置布尔变量  --  代替某些没有分支的 if 判断

DATA(lv_a) = 1.
DATA(lv_b) = 2.IF lv_a <> lv_b.WRITE: 'Everything is all right.'.
ELSE.WRITE: 'The sun rises in the west!'.
ENDIF.
************new**************
IF xsdbool( lv_a = lv_b ) = abap_false.WRITE: 'Everything is all right.'.
ELSE.WRITE: 'The sun rises in the west!'.
ENDIF.

五、条件语句

1)、判断单个变量

1、判断单个变量并赋值 -- SWITCH

 DATA(day2) = SWITCH char10( indicatorWHEN 1 THEN 'Monday'WHEN 2 THEN 'Tuesday'WHEN 3 THEN 'Wednesday'WHEN 4 THEN 'Thursday'WHEN 5 THEN 'Friday'WHEN 6 THEN 'Saturday'WHEN 7 THEN 'Sunday'ELSE THROW zcx_monster_exceptions( ) ).

2、判断单个变量,执行逻辑

CASE lv_week.WHEN '1'.perform form1.WHEN '2'.perform form2.WHEN OTHERS.
ENDCASE.

2)、判断多个变量

cs_monster_header-sanity_description =COND text30(WHEN cs_monster_header-sanity = 5 THEN 'VERY SANE'WHEN cs_monster_header-sanity = 4 THEN 'SANE'WHEN cs_monster_header-sanity = 3 THEN 'SLIGHTLY MAD'WHEN cs_monster_header-sanity = 2 THEN 'VERY MAD'WHEN cs_monster_header-sanity = 1 ANDday = 'Tuesday'              THEN 'HAVING AN OFF DAY'WHEN cs_monster_header-sanity = 1 THEN 'BONKERS'ELSE 'RENAMES SAP PRODUCTS' ).

3)、if 条件句

1、尽量是正向条件  -- 避免not 

2、 is not 优于 not is

3、避免空的分支

六、ABAP语句

1)、表:

1、适当的表类型: standard , sorted , hash。

2、insert to table 优于append to 

3、 line_exists 优于read table 或loop at 

eg:DATA(ls_vbak2) = lt_vbak[ VBELN = '0020000430' ].

如果判断是否存在: if  line_exists( lt_vbak[ VBELN = '0020000430' ] )

七、错误处理

1)、消息  -- SE91创建消息在复杂程序中更容易寻找到

2)、返回代码 -- Return Code ,在函数中使用固定返回代码( S / E / W )

3)  、异常 -- Exceptions 只能针对错误 ,不能对正常情况抛出,最好是基于类的异常--如:CX_ROOT等,优于函数出入参中的exceptions

所有的类异常的基类都在 Package :S_ABAP_EXCEPTIONS中,最基本的异常类:CX_ROOT,他有3个子类:CX_NO_CHECK;CX_DYNAMIC_CHECK;CX_STATIC_CHECK

4)、抛出 --Raise  

1、使用各自的超类、-

CX_NO_CHECK类似于Java中的Error,CX_DYNAMIC_CHECK类似于Java中的RuntimeException,CX_STATIC_CHECK类似于Java检测性异常;

CX_STATIC_CHECK是一个抽象类,一般自己定的异常都要求继承于它。在程序中使用RAISE EXCEPTION 手动抛出这类异常时,方法或过程接口上一定要显示的通过RAISING 来向上层抛出异常(或者直接在方法或过程中进行处理也可以),否则静态编译时就会出现警告。

CX_NO_CHECK类型的异常一般表示系统资源不足引起的,不能在方法或过程接口后面抛出CX_NO_CHECK类型的异常,它会被隐含的抛出与传递。系统中已有预定义这类异常。

如果程序逻辑能够排除可能性的潜在性错,相应的异常就可能不用处理或继续抛出,此类情况下可以使用CX_DYNAMIC_CHECK类型的异常,这与Java中的运行时异常相似,一旦发生也该类异常,表示问题出现在程序的本身设计上,程序设计不严谨(如没有判断空指针问题)。ABAP大多数的系统预定义的异类都是属于该类型异常,这就意味着不需要处理或抛出ABAP语句可能出现的每一种异常,但一旦发生了该类异常,则表示程序的逻辑出现了问题,程序执行的结果将不会在正确。

2、 raise exception new 优于  raise exception new

3、异常类

SQL异常: CX_SY_SQL_ERROR

算术异常: 超类--  CX_SY_ARITHMETIC_ERROR; 具体子类如下:

BCD_ZERODIVIDECX_SY_ZERODIVIDE  
COMPUTE_FLOAT_ZERODIVIDECX_SY_ZERODIVIDE
COMPUTE_INT_ZERODIVIDECX_SY_ZERODIVIDE
ADDF_INT_OVERFLOW CX_SY_ARITHMETIC_OVERFLOW
BCD_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_BCD_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_COSH_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW 
COMPUTE_EXP_RANGECX_SY_ARITHMETIC_OVERFLOW
COMPUTE_FLOAT_DIV_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW
COMPUTE_FLOAT_MINUS_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_FLOAT_PLUS_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_FLOAT_TIMES_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW 
COMPUTE_INT_ABS_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_DIV_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_MINUS_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_INT_PLUS_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW
COMPUTE_INT_TIMES_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_LOG10_ERROR CX_SY_ARITHMETIC_OVERFLOW /  CX_SY_ARG_OUT_OF_DOMAIN 
COMPUTE_LOG_ERRORCX_SY_ARITHMETIC_OVERFLOW /  CX_SY_ARG_OUT_OF_DOMAIN 
COMPUTE_MATH_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW
COMPUTE_POW_RANGECX_SY_ARITHMETIC_OVERFLOW
COMPUTE_SINH_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW  
COMPUTE_ACOS_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_ASIN_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_ATAN_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_COSH_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_COS_DOMAIN CX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_EXP_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_MATH_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_POW_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_SINH_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_SIN_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_SQRT_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_TANH_DOMAINCX_SY_ARG_OUT_OF_DOMAIN
COMPUTE_COS_LOSSCX_SY_PRECISION_LOSS
COMPUTE_MATH_LOSSCX_SY_PRECISION_LOSS
COMPUTE_SIN_LOSSCX_SY_PRECISION_LOSS
COMPUTE_TAN_LOSSCX_SY_PRECISION_LOSS
BCD_FIELD_OVERFLOWCX_SY_CONVERSION_OVERFLOW

 转换错误 :  CX_SY_CONVERSION_ERROR  具体子类如下:

BCD_FIELD_OVERFLOWCX_SY_CONVERSION_OVERFLOW
CONVT_OVERFLOWCX_SY_CONVERSION_OVERFLOW
CONVT_CODEPAGECX_SY_CONVERSION_CODEPAGE
CONVT_NO_NUMBERCX_SY_CONVERSION_NO_NUMBER
BCD_OVERFLOWCX_SY_ARITHMETIC_OVERFLOW

创建数据错误: CX_SY_CREATE_ERROR   具体子类如下:

CREATE_DATA_UNKNOWN_TYPECX_SY_CREATE_DATA_ERROR
CREATE_DATA_NOT_ALLOWED_TYPECX_SY_CREATE_DATA_ERROR
CREATE_DATA_LEN_NOT_ALLOWEDCX_SY_CREATE_DATA_ERROR
CREATE_DATA_ILLEGAL_LENGTHCX_SY_CREATE_DATA_ERROR
CREATE_DATA_ILLEGAL_DECIMALSCX_SY_CREATE_DATA_ERROR
CREATE_DATA_ILLEGAL_INIT_SIZECX_SY_CREATE_DATA_ERROR

创建对象错误: CX_SY_CREATE_ERROR   具体子类如下:

CREATE_OBJECT_CLASS_NOT_FOUNDCX_SY_CREATE_OBJECT_ERROR
CREATE_OBJECT_CLASS_ABSTRACTCX_SY_CREATE_OBJECT_ERROR
CREATE_OBJECT_CREATE_PRIVATE CX_SY_CREATE_OBJECT_ERROR
CREATE_OBJECT_CREATE_PROTECTEDCX_SY_CREATE_OBJECT_ERROR

数据访问错误:CX_SY_DATA_ACCESS_ERROR  具体子类如下:

DATA_OFFSET_NEGATIVECX_SY_RANGE_OUT_OF_BOUNDS
DATA_LENGTH_NEGATIVECX_SY_RANGE_OUT_OF_BOUNDS
DATA_LENGTH_0CX_SY_RANGE_OUT_OF_BOUNDS
DATA_LENGTH_TOO_LARGECX_SY_RANGE_OUT_OF_BOUNDS
DATA_OFFSET_LENGTH_TOO_LARGECX_SY_RANGE_OUT_OF_BOUNDS
REFI_WRONG_SECTIONCX_SY_RANGE_OUT_OF_BOUNDS
STRING_OFFSET_NEGATIVECX_SY_RANGE_OUT_OF_BOUNDS
STRING_OFFSET_TOO_LARGECX_SY_RANGE_OUT_OF_BOUNDS
STRING_LENGTH_NEGATIVECX_SY_RANGE_OUT_OF_BOUNDS
STRING_LENGTH_TOO_LARGECX_SY_RANGE_OUT_OF_BOUNDS
STRING_OFFSET_LENGTH_TOO_LARGECX_SY_RANGE_OUT_OF_BOUNDS
DATA_OFFSET_LENGTH_NOT_ALLOWEDCX_SY_OFFSET_NOT_ALLOWED

动态调用方法错误:CX_SY_DYN_CALL_ERROR   具体子类如下:

DYN_CALL_METH_CLASS_ABSTRACTCX_SY_DYN_CALL_ILLEGAL_CLASS
DYN_CALL_METH_CLASS_NOT_FOUNDCX_SY_DYN_CALL_ILLEGAL_CLASS
DYN_CALL_METH_CLASSCONSTRUCTORCX_SY_DYN_CALL_ILLEGAL_METHOD
DYN_CALL_METH_CONSTRUCTOR CX_SY_DYN_CALL_ILLEGAL_METHOD
DYN_CALL_METH_NOT_FOUNDCX_SY_DYN_CALL_ILLEGAL_METHOD
DYN_CALL_METH_NO_CLASS_METHODCX_SY_DYN_CALL_ILLEGAL_METHOD
DYN_CALL_METH_PRIVATE CX_SY_DYN_CALL_ILLEGAL_METHOD
DYN_CALL_METH_PROTECTEDCX_SY_DYN_CALL_ILLEGAL_METHOD
DYN_CALL_METH_EXCP_NOT_FOUNDCX_SY_DYN_CALL_EXCP_NOT_FOUND
DYN_CALL_METH_PARAM_KINDCX_SY_DYN_CALL_ILLEGAL_TYPE
DYN_CALL_METH_PARAM_LITL_MOVECX_SY_DYN_CALL_ILLEGAL_TYPE
DYN_CALL_METH_PARAM_TAB_TYPE CX_SY_DYN_CALL_ILLEGAL_TYPE
DYN_CALL_METH_PARAM_TYPECX_SY_DYN_CALL_ILLEGAL_TYPE
DYN_CALL_METH_PARAM_MISSINGCX_SY_DYN_CALL_PARAM_MISSING
DYN_CALL_METH_PARREF_INITIALCX_SY_DYN_CALL_PARAM_MISSING
DYN_CALL_METH_PARAM_NOT_FOUND CX_SY_DYN_CALL_PARAM_NOT_FOUND
DYN_CALL_METH_REF_IS_INITIALCX_SY_REF_IS_INITIAL

文件访问错误:CX_SY_FILE_ACCESS_ERROR   具体子类如下:

DATASET_CANT_CLOSECX_SY_FILE_CLOSE
DATASET_CANT_OPENCX_SY_FILE_CLOSE
EXPORT_DATASET_CANNOT_OPENCX_SY_FILE_CLOSE
DATASET_WRITE_ERRORCX_SY_FILE_IO
DATASET_READ_ERRORCX_SY_FILE_IO
EXPORT_DATASET_WRITE_ERRORCX_SY_FILE_IO
DATASET_SEEK_ERRORCX_SY_FILE_POSITION
DATASET_NO_POSITIONCX_SY_FILE_POSITION
DATASET_READ_ONLYCX_SY_FILE_OPEN_MODE
DATASET_NOT_OPENCX_SY_FILE_OPEN_MODE
OPEN_DATASET_NO_AUTHORITYCX_SY_FILE_AUTHORITY
OPEN_PIPE_NO_AUTHORITYCX_SY_FILE_AUTHORITY
DATASET_TOO_MANY_FILESCX_SY_TOO_MANY_FILES
DATASET_NO_PIPE CX_SY_PIPES_NOT_SUPPORTED

定位错误 :  CX_SY_LOCALIZATION_ERROR  具体如下:

TEXTENV_CODEPAGE_NOT_ALLOWED CX_SY_LOCALIZATION_ERROR
TEXTENV_INVALIDCX_SY_LOCALIZATION_ERROR
TEXTENV_KEY_INVALIDCX_SY_LOCALIZATION_ERROR

远程访问错误:CX_SY_REMOTE_CALL_ERROR   具体子类如下:

RMC_COMMUNICATION_FAILURECX_SY_RMC_COMM_FAILURE
RMC_INVALID_STATUSCX_SY_RMC_INVALID_STATUS
RMC_SYSTEM_FAILURECX_SY_RMC_SYSTEM_FAILURE

方法访问错误: 子类如下:

ASSIGN_CASTING_ILLEGAL_CASTCX_SY_ASSIGN_CAST_ILLEGAL_CAST
ASSIGN_CASTING_UNKNOWN_TYPECX_SY_ASSIGN_CAST_UNKNOWN_TYPE
ASSIGN_FIELD_NOT_IN_RANGECX_SY_ASSIGN_OUT_OF_RANGE
DATASET_OFFSET_TOO_LARGECX_SY_FILE_POSITION 
DYN_CALL_METH_NOT_IMPLEMENTEDCX_SY_DYN_CALL_ILLEGAL_METHOD
EXPORT_BUFFER_NO_MEMORYCX_SY_EXPORT_BUFFER_NO_MEMORY
GENERATE_SUBPOOL_DIR_FULLCX_SY_GENERATE_SUBPOOL_FULL
MOVE_CAST_ERRORCX_SY_MOVE_CAST_ERROR
PERFORM_PROGRAM_NAME_TOO_LONG CX_SY_PROGRAM_NOT_FOUND 
REPLACE_INFINITE_LOOPCX_SY_REPLACE_INFINITE_LOOP

八、方法method调用

1)、调用

1、method 调用优于 function 优于  form

2、receiving可省略,省略 可选关键字 ,单参数调用省略参数名称  l_menu ?= view->get_element( `MENU` ).  (View type ref to IF_WD_VIEW  )

3、调用实例方法省略自我引用 me 

2)、参数类型

1、returning 优于exporting

2、单独的使用returning/exporting/changing,不要组合使用

3、最保守的时候使用changing

4、拆分方法,而非使用布尔输入值

 

本文发布于:2024-02-01 01:02:30,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170672055132695.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:样本统计梳理
下一篇:C++ 实用指南
标签:ABAP
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23