良好的书写规范有利于自己后期查看,也有助于其他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_ZERODIVIDE | CX_SY_ZERODIVIDE |
COMPUTE_FLOAT_ZERODIVIDE | CX_SY_ZERODIVIDE |
COMPUTE_INT_ZERODIVIDE | CX_SY_ZERODIVIDE |
ADDF_INT_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
BCD_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_BCD_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_COSH_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_EXP_RANGE | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_FLOAT_DIV_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_FLOAT_MINUS_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_FLOAT_PLUS_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_FLOAT_TIMES_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_INT_ABS_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_INT_DIV_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_INT_MINUS_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_INT_PLUS_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_INT_TIMES_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_LOG10_ERROR | CX_SY_ARITHMETIC_OVERFLOW / CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_LOG_ERROR | CX_SY_ARITHMETIC_OVERFLOW / CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_MATH_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_POW_RANGE | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_SINH_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
COMPUTE_ACOS_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_ASIN_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_ATAN_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_COSH_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_COS_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_EXP_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_MATH_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_POW_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_SINH_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_SIN_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_SQRT_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_TANH_DOMAIN | CX_SY_ARG_OUT_OF_DOMAIN |
COMPUTE_COS_LOSS | CX_SY_PRECISION_LOSS |
COMPUTE_MATH_LOSS | CX_SY_PRECISION_LOSS |
COMPUTE_SIN_LOSS | CX_SY_PRECISION_LOSS |
COMPUTE_TAN_LOSS | CX_SY_PRECISION_LOSS |
BCD_FIELD_OVERFLOW | CX_SY_CONVERSION_OVERFLOW |
转换错误 : CX_SY_CONVERSION_ERROR 具体子类如下:
BCD_FIELD_OVERFLOW | CX_SY_CONVERSION_OVERFLOW |
CONVT_OVERFLOW | CX_SY_CONVERSION_OVERFLOW |
CONVT_CODEPAGE | CX_SY_CONVERSION_CODEPAGE |
CONVT_NO_NUMBER | CX_SY_CONVERSION_NO_NUMBER |
BCD_OVERFLOW | CX_SY_ARITHMETIC_OVERFLOW |
创建数据错误: CX_SY_CREATE_ERROR 具体子类如下:
CREATE_DATA_UNKNOWN_TYPE | CX_SY_CREATE_DATA_ERROR |
CREATE_DATA_NOT_ALLOWED_TYPE | CX_SY_CREATE_DATA_ERROR |
CREATE_DATA_LEN_NOT_ALLOWED | CX_SY_CREATE_DATA_ERROR |
CREATE_DATA_ILLEGAL_LENGTH | CX_SY_CREATE_DATA_ERROR |
CREATE_DATA_ILLEGAL_DECIMALS | CX_SY_CREATE_DATA_ERROR |
CREATE_DATA_ILLEGAL_INIT_SIZE | CX_SY_CREATE_DATA_ERROR |
创建对象错误: CX_SY_CREATE_ERROR 具体子类如下:
CREATE_OBJECT_CLASS_NOT_FOUND | CX_SY_CREATE_OBJECT_ERROR |
CREATE_OBJECT_CLASS_ABSTRACT | CX_SY_CREATE_OBJECT_ERROR |
CREATE_OBJECT_CREATE_PRIVATE | CX_SY_CREATE_OBJECT_ERROR |
CREATE_OBJECT_CREATE_PROTECTED | CX_SY_CREATE_OBJECT_ERROR |
数据访问错误:CX_SY_DATA_ACCESS_ERROR 具体子类如下:
DATA_OFFSET_NEGATIVE | CX_SY_RANGE_OUT_OF_BOUNDS |
DATA_LENGTH_NEGATIVE | CX_SY_RANGE_OUT_OF_BOUNDS |
DATA_LENGTH_0 | CX_SY_RANGE_OUT_OF_BOUNDS |
DATA_LENGTH_TOO_LARGE | CX_SY_RANGE_OUT_OF_BOUNDS |
DATA_OFFSET_LENGTH_TOO_LARGE | CX_SY_RANGE_OUT_OF_BOUNDS |
REFI_WRONG_SECTION | CX_SY_RANGE_OUT_OF_BOUNDS |
STRING_OFFSET_NEGATIVE | CX_SY_RANGE_OUT_OF_BOUNDS |
STRING_OFFSET_TOO_LARGE | CX_SY_RANGE_OUT_OF_BOUNDS |
STRING_LENGTH_NEGATIVE | CX_SY_RANGE_OUT_OF_BOUNDS |
STRING_LENGTH_TOO_LARGE | CX_SY_RANGE_OUT_OF_BOUNDS |
STRING_OFFSET_LENGTH_TOO_LARGE | CX_SY_RANGE_OUT_OF_BOUNDS |
DATA_OFFSET_LENGTH_NOT_ALLOWED | CX_SY_OFFSET_NOT_ALLOWED |
动态调用方法错误:CX_SY_DYN_CALL_ERROR 具体子类如下:
DYN_CALL_METH_CLASS_ABSTRACT | CX_SY_DYN_CALL_ILLEGAL_CLASS |
DYN_CALL_METH_CLASS_NOT_FOUND | CX_SY_DYN_CALL_ILLEGAL_CLASS |
DYN_CALL_METH_CLASSCONSTRUCTOR | CX_SY_DYN_CALL_ILLEGAL_METHOD |
DYN_CALL_METH_CONSTRUCTOR | CX_SY_DYN_CALL_ILLEGAL_METHOD |
DYN_CALL_METH_NOT_FOUND | CX_SY_DYN_CALL_ILLEGAL_METHOD |
DYN_CALL_METH_NO_CLASS_METHOD | CX_SY_DYN_CALL_ILLEGAL_METHOD |
DYN_CALL_METH_PRIVATE | CX_SY_DYN_CALL_ILLEGAL_METHOD |
DYN_CALL_METH_PROTECTED | CX_SY_DYN_CALL_ILLEGAL_METHOD |
DYN_CALL_METH_EXCP_NOT_FOUND | CX_SY_DYN_CALL_EXCP_NOT_FOUND |
DYN_CALL_METH_PARAM_KIND | CX_SY_DYN_CALL_ILLEGAL_TYPE |
DYN_CALL_METH_PARAM_LITL_MOVE | CX_SY_DYN_CALL_ILLEGAL_TYPE |
DYN_CALL_METH_PARAM_TAB_TYPE | CX_SY_DYN_CALL_ILLEGAL_TYPE |
DYN_CALL_METH_PARAM_TYPE | CX_SY_DYN_CALL_ILLEGAL_TYPE |
DYN_CALL_METH_PARAM_MISSING | CX_SY_DYN_CALL_PARAM_MISSING |
DYN_CALL_METH_PARREF_INITIAL | CX_SY_DYN_CALL_PARAM_MISSING |
DYN_CALL_METH_PARAM_NOT_FOUND | CX_SY_DYN_CALL_PARAM_NOT_FOUND |
DYN_CALL_METH_REF_IS_INITIAL | CX_SY_REF_IS_INITIAL |
文件访问错误:CX_SY_FILE_ACCESS_ERROR 具体子类如下:
DATASET_CANT_CLOSE | CX_SY_FILE_CLOSE |
DATASET_CANT_OPEN | CX_SY_FILE_CLOSE |
EXPORT_DATASET_CANNOT_OPEN | CX_SY_FILE_CLOSE |
DATASET_WRITE_ERROR | CX_SY_FILE_IO |
DATASET_READ_ERROR | CX_SY_FILE_IO |
EXPORT_DATASET_WRITE_ERROR | CX_SY_FILE_IO |
DATASET_SEEK_ERROR | CX_SY_FILE_POSITION |
DATASET_NO_POSITION | CX_SY_FILE_POSITION |
DATASET_READ_ONLY | CX_SY_FILE_OPEN_MODE |
DATASET_NOT_OPEN | CX_SY_FILE_OPEN_MODE |
OPEN_DATASET_NO_AUTHORITY | CX_SY_FILE_AUTHORITY |
OPEN_PIPE_NO_AUTHORITY | CX_SY_FILE_AUTHORITY |
DATASET_TOO_MANY_FILES | CX_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_INVALID | CX_SY_LOCALIZATION_ERROR |
TEXTENV_KEY_INVALID | CX_SY_LOCALIZATION_ERROR |
远程访问错误:CX_SY_REMOTE_CALL_ERROR 具体子类如下:
RMC_COMMUNICATION_FAILURE | CX_SY_RMC_COMM_FAILURE |
RMC_INVALID_STATUS | CX_SY_RMC_INVALID_STATUS |
RMC_SYSTEM_FAILURE | CX_SY_RMC_SYSTEM_FAILURE |
方法访问错误: 子类如下:
ASSIGN_CASTING_ILLEGAL_CAST | CX_SY_ASSIGN_CAST_ILLEGAL_CAST |
ASSIGN_CASTING_UNKNOWN_TYPE | CX_SY_ASSIGN_CAST_UNKNOWN_TYPE |
ASSIGN_FIELD_NOT_IN_RANGE | CX_SY_ASSIGN_OUT_OF_RANGE |
DATASET_OFFSET_TOO_LARGE | CX_SY_FILE_POSITION |
DYN_CALL_METH_NOT_IMPLEMENTED | CX_SY_DYN_CALL_ILLEGAL_METHOD |
EXPORT_BUFFER_NO_MEMORY | CX_SY_EXPORT_BUFFER_NO_MEMORY |
GENERATE_SUBPOOL_DIR_FULL | CX_SY_GENERATE_SUBPOOL_FULL |
MOVE_CAST_ERROR | CX_SY_MOVE_CAST_ERROR |
PERFORM_PROGRAM_NAME_TOO_LONG | CX_SY_PROGRAM_NOT_FOUND |
REPLACE_INFINITE_LOOP | CX_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小时内删除。
留言与评论(共有 0 条评论) |