原文链接:Ten practices to make your ABAP developments optimized, informative, modern and quality robust
发展会催生出新的实践。随着 SAP 从 4.7 到 ECC,再到 S/4 HANA 的发展,迄今已有多项功能发生了变化。随着新的框架、屏幕和指南的到来,一些现代的实践被开发出来,并在许多模块、定制和编程中被采用。我在本博客中的重点是 “ABAP 编程 ”开发。我个人的 ABAP 开发经验表明,一般来说,有三个阶段: 编程、质量检查和测试。而每个阶段都需要投入一定的成熟实践,才能开发出优质稳健的软件。
我试图列出值得采用的十种实践,以便将 ABAP 开发转化为优化、信息丰富、现代和高质量的开发代码。下面介绍的这些做法是在编程过程中不可忽视的检查项。
1 内表的声明
具体说明内表的声明类型。默认情况下并不总是将内表声明为标准类型。事实上,我们必须花一些时间来确定内表属于哪种类型:
- 唯一键的有序内表
- 非唯一键但主键为 X Y 的有序内表
- 非唯一排序主键为 A B 的有序内表
- 带唯一键的哈希表
例如:
DATA: ar_relat TYPE SORTED TABLE OF hrp1001 WITH NON-UNIQUE KEY otjid
WITH NON-UNIQUE SORTED KEY key1 COMPONENTS otype rsign relat sclas sobid
WITH NON-UNIQUE SORTED KEY key2 COMPONENTS otype objid rsign sclas sobid,
at_529t TYPE HASHED TABLE OF t529t WITH UNIQUE KEY massn.
TYPES: tt_loc_data TYPE SORTED TABLE OF ts_los_data WITH NON-UNIQUE KEY locat.
这种做法之所以重要,有两个原因。首先,从性能的角度来看,数据处理的速度更快;其次,读取数据的速度更快。
2 动态 SQL 的使用
第二件事是为 where 子句创建动态 SQL 查询。 这有助于将开发过程从冗长压缩到几行。你不需要多次编写 SQL 查询。相反,只需创建一次动态 SQL 查询,就可以多次使用。建议在需要时使用。
不过,我们不鼓励将源表设置为动态表。因此,不允许从 XYZ 所在的(源选项卡)中选择(字段名)。
例如:
这一条建议在开发当中进行使用,以前的语法没写一个 SELECT 就要获取一下子句,而通常选择屏幕的变量是全局的,不需要每次都写重复的。
3 进度提示器设置
检查在循环处理数据时是否使用了进度指示器。它提供了关于已处理记录数的有用信息,并在运行时显示在屏幕上。这也是使开发过程更加信息丰富的做法之一。
PARAMETERS: p_times1 TYPE i DEFAULT 5. "Immediately
DO p_times1 TIMES.
cl_progress_indicator=>progress_indicate(
EXPORTING
i_text = | Output immediately { sy-index } / { p_times1 } |
* i_msgid = i_msgid " Message Class (If I_TEXT is not transferred)
* i_msgno = i_msgno " Message Number (If I_TEXT is not transferred)
* i_msgv1 = i_msgv1 " Message Variable (Maximum of 50 Characters)
* i_msgv2 = i_msgv2 " Message Variable (Maximum of 50 Characters)
* i_msgv3 = i_msgv3 " Message Variable (Maximum of 50 Characters)
* i_msgv4 = i_msgv4 " Message Variable (Maximum of 50 Characters)
i_processed = sy-index " Number of Objects Already Processed
i_total = p_times1 " Total Number of Objects to Be Processed
i_output_immediately = abap_true " X = Display Progress Immediately
* importing
* e_progress_sent = e_progress_sent " X = Progress Information Was Displayed
).
WAIT UP TO 1 SECONDS.
ENDDO.
事实上,方法 cl_progress_indicator=>progress_indicate 与 FM SAPGUI_PROGRESS_INDICATOR 相比具有一些优势:
- 它还支持后台处理 (将消息写入作业日志)。
- 它还包括一些 “负载均衡”,仅在每个预定义的时间窗口(10 秒)更新进度条,而不是在每次调用时更新它(除非设置了参数
I_OUTPUT_IMMEDIATELY='X')。 - 百分比在内部计算(当您传输
I_PROCESSED和I_TOTAL时)。您必须使用 3 个消息占位符(&1、&2、&3)设置I_TEXT或I_MSGID/I_MSGNO,以便它按预期工作。例如:
i_text = | Processed &1 % ( &2 of { p_times1 } records) |
感觉关于这一点,可能需要好好斟酌一下,如果数据量大,这样的显示会很慢,不一定符合业务要求。
4 处理数据包
正如上文所强调的,在选择框内的另一种做法是让循环仅在处理一定数量的记录后才处理业务逻辑。这样,形成的数据包就能快速执行。这是一种性能优化的好方法。
例如,在循环中应用 “IF lv_tabix MOD 1500 =0 ”这样的语句,只有在形成一个包含 1500 条记录的数据包后,控制才会跟进进一步处理。与处理数据包相比,逐条记录处理需要更长的时间。
5 Using RTTS
使用运行时类型服务(Runtime Type Services)可以节省大量开发定制编码的工作。通过采用这种做法,可以在运行时定义数据对象的类型,并使数据类型通用化。RTTS 是一种动态编程方法,是一种在运行时有效处理具有不同数据类型的多个数据对象的优化技术。
SAP 提供了多个标准类,其中几个重要类如下:
- CL_ABAP_TYPEDESCR: 用于在运行时创建类型属性
- CL_ABAP_DATADESCR: 有助于在运行时处理数据类型
- CL_ABAP_STRUCTDESCR: 有助于在运行时创建和描述结构
- CL_ABAP_TABLEDESCR: 用于在运行时创建和描述表格
声明和使用示例:
6 权限检查对象
另一个习惯是使用权限检查对象。权限检查对象并不完全依赖于角色分配,它可以确保您的开发不会被用户部门执行。示例:
7 使用数据引用操作符
有时,创建只在运行时定义类型的动态表和结构非常重要。在这种情况下,使用数据引用可以节省大量精力。在去引用概念和字段符号的帮助下,我们可以轻松处理动态数据类型。下面给出了一个这样的示例:
8 通过工厂类动态创建类对象
当您需要在报表或任何 ABAP 开发中处理多个自定义类时,最好采用使用工厂类的做法。当所有自定义类作为自定义的一部分保存在某种框架中时,开发人员应创建一个工厂类,以便在运行时根据要求动态地实例化对象。下面的实践展示了在运行时动态创建类实例的示例。
9 使用新语法
从 4.7 到 ECC 的演变引入了新的开发语法。新语法的引入增强了编程的可读性和模块化能力。特别是对于面向对象编程,新语法提供了极大的帮助。作为现代开发人员,应在 ABAP 开发中采用新语法。
下面是一些参考资料:
10 ABAP Test Cockpit(ATC)
这是质量检查的一种做法。开发完成后,ATC 可以确定其稳健性如何。它可以根据性能、授权以及声明为全局和局部变量的使用等标准准则,检查 ABAP 开发的质量。
从选项 程序->检查->ATC,您可以执行 Cockpit 。
需要改进的地方如下:
总结
正如我在开头提到的,每一次演变都会催生新的实践。因此,ABAP 编程也不例外,在 ECC 向 S/4 HANA 迁移的过程中,是时候采用新的实践来开发高质量、稳健的软件了。SDN 中有几篇文章和博客详细介绍了我在上面解释过的几个主题。因此,值得投入一些时间来深入了解每个主题。良好的实践会让事情变得简单并带来质量,ABAP 开发也是如此。
如果这对你有用,请告诉我。