ABAP/4 开发代码效率指南

2021-10-23 23:41发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

ABAP/4(Advanced Business Application Programming 4GL)语言是一种“事件驱动”、“自顶向下”、结构良好且功能强大的编程语言。ABAP/4 处理器控制事件的执行。由于 ABAP/4 语言包含了许多“事件”关键字,而这些关键字在代码中不需要按任何特定顺序排列,因此实施内部 ABAP/4 编码标准是明智之举。


SAP 推荐的特定于客户的 ABAP/4 开发指南可以在 SAP 文档中找到。


此页面包含一些有效的 ABAP/4 程序开发的一般指南,应考虑在以下方面提高系统性能:-


物理 I/O - 数据必须从 I/O 设备读取和写入。这可能是一个潜在的瓶颈。一个配置良好的系统总是运行“I/O-bound”——I/O 的性能决定了整体性能。


数据库资源的内存消耗,例如。缓冲器等


数据库和应用服务器上的 CPU 消耗


网络通信 - 对于小数据量并不重要,但在传输大量数据时会成为瓶颈。


还可以制定政策和程序,以便在将对象提升到 SAP 生产系统之前,对每个 SAP 客户开发对象进行彻底审查(质量 - 程序正确性以及代码效率)。有关 SAP R/3 ABAP/4 Development Workbench 编程工具及其功能的信息可以在 SAP Public Web-Server 上找到。


-------------------------------------------------- ------------------------------


经典的 4GL 编程规范实践指南


避免死代码


去除不必要的代码和冗余处理


花时间记录并采用良好的变更控制实践


花足够的时间分析业务需求、流程、数据结构和数据模型


质量保证是关键:计划和执行良好的测试计划和测试方法


经验很重要


SELECT * FROM <TABLE>

 CHECK:  <CONDITION>

ENDSELECT


  vs.


SELECT * FROM <TABLE>

 WHERE <CONDITION>

ENDSELECT


为了将与查询相关的数据量保持在较小的范围内,请尽可能避免使用 SELECT+CHECK 语句。作为一般经验法则,始终在 WHERE 子句中指定所有已知条件(如果可能)。如果没有 WHERE 子句,DBMS 就没有机会进行优化。始终在 Where-clause 中指定您的条件,而不是使用 check-statements 自己检查它们。数据库系统还可以潜在地使用数据库索引(如果可能)以提高效率,从而减少数据库服务器上的负载并显着减少网络流量上的负载。


此外,尽可能在 WHERE 子句中使用 EQ (=) 并分析 SQL 语句以获得数据库优化器将在必要时通过 SQL 跟踪使用的最佳路径也很重要。


此外,请确保谨慎使用在 Open SQL 语句中使用不当的“OR”、“NOT”和值范围表 (INTTAB)。


-------------------------------------------------- ------------------------------


SELECT *


 vs.


SELECT SINGLE *


如果您只对数据库表或视图的一行感兴趣,请使用 SELECT SINGLE 语句而不是 SELECT * 语句。SELECT SINGLE 需要与数据库系统进行一次通信,而 SELECT * 需要两次。


-------------------------------------------------- ------------------------------


SELECT * FROM <TABLE> INTO <INT-TAB>

 APPEND <INT-TAB>

ENDSELECT


 对比


SELECT * FROM <TABLE> INTO TABLE <INT-TAB>

 


使用 SELECT 语句的 INTO TABLE 版本通常比使用 APPEND 语句更快


-------------------------------------------------- ------------------------------




SELECT ... WHERE + CHECK


 vs.


SELECT using aggregate function 使用聚合函数



如果要查找最大值、最小值、总和和平均值或数据库列的计数,请使用带有聚合函数的选择列表,而不是在程序中计算聚合。RDBMS 负责聚合计算,而不是将大量数据传输到应用程序。整体网络、应用服务器和数据库负载也大大减少。




--------------------------------------------------------------------------------


SELECT INTO TABLE <INT-TAB> + LOOP AT T

  …………

SELECT * FROM <TABLE> INTO TABLE <INT-TAB>.

LOOP AT <INT-TAB>.

ENDLOOP.


 vs.


SELECT * FROM <TABLE>

    ……….

ENDSELECT


如果您只处理一次数据,请使用 SELECT-ENDSELECT 循环而不是使用 SELECT ... INTO TABLE 在内部表中收集数据。内部表处理占用更多空间


--------------------------------------------------------------------------------


Nested SELECT statements:

SELECT * FROM <TABLE-A>

     SELECT * FROM <TABLE-B>

     ……..

     ENDSELECT.

ENDSELECT


 vs.


Select with view

 SELECT * FROM <VIEW>

 ENDSELECT


要处理连接,请尽可能使用视图而不是嵌套的 SELECT 语句。

使用嵌套选择是一种性能低下的技术。内部选择语句被执行多次,这可能是一个开销。此外,如果使用另一种技术,则必须传输的数据更少。join 作为视图在 ABAP/4 存储库中实现。




· SELECT ... FORM ALL ENTRIES

· 显式游标处理(有关更多信息,请转到事务 SE30 – 提示和技巧)



--------------------------------------------------------------------------------


Nested select:

SELECT * FROM pers WHERE condition.

         SELECT * FROM persproj WHERE person = pers-persnr.

               ... process ...

         ENDSELECT.

ENDSELECT.


 vs.


SELECT persnr FROM pers INTO TABLE ipers WHERE cond.  ……….


SELECT * FROM persproj FOR ALL ENTRIES IN ipers

      WHERE person = ipers-persnr

………... process .……………

ENDSELECT.


在较低版本中,使用新的 Open SQL 语句 FOR ALL ENTRIES。在调用之前,所有来自 'pers' 的有趣记录都被读入一个内部表中。第二个 SELECT 语句导致调用如下所示(ipers 包含:P01、P02、P03):




(SELECT * FROM persproj WHERE person = 'P01')

UNION

(SELECT * FROM persproj WHERE person = 'P02')

UNION

(SELECT * FROM persproj WHERE person = 'P03')




在大语句的情况下,R/3 的数据库接口将语句分成几个部分并将结果集重新组合为一个。这里的优点是传输次数最少,并且由于语句大小(与范围表相比)的限制最小。



--------------------------------------------------------------------------------


SELECT * FROM <TABLE>


vs.


SELECT <column(s)> FROM <TABLE>


如果您只对表的特定列感兴趣,请使用选择列表或视图而不是 SELECT *。如果仅需要某些字段,则应仅从数据库中读取这些字段。同样,也可以通过使用 ABAP/4 Dictionary 中定义的视图来限制列数。整体数据库和网络负载要小得多。


-------------------------------------------------- ------------------------------


SELECT without table buffering support


 vs.


SELECT with table buffering support




对于所有经常使用的只读(很少更新)表,请尝试使用 SAP 缓冲来提高性能响应时间。这将减少整体数据库活动和网络流量。


-------------------------------------------------- ------------------------------




Single-line inserts

LOOP AT <INT-TAB>

 INSERT INTO <TABLE> VALUES <INT-TAB>

ENDLOOP


 vs.


Array inserts




尽可能使用数组操作而不是单行操作来修改数据库表。


应用程序和数据库系统之间的频繁通信会产生相当大的开销。


--------------------------------------------------------------------------------


Single-line updates

 SELECT * FROM <TABLE>

  <COLUMN-UPDATE STATEMENT>

  UPDATE <TABLE>

 ENDSELECT


 vs.

 


Column updates

 UPDATE <TABLE> SET <COLUMN-UPDATE STATEMENT>


在可能的情况下,使用列更新而不是单行更新来更新数据库表


-------------------------------------------------- ------------------------------


DO....ENDDO loop with Field-Symbol


 vs.


Using CA operator


使用特殊运算符 CO、CA、CS,而不是自己编写操作

如果在长字符串上按字符执行 ABAP/4 语句,CPU 消耗会大幅增加





--------------------------------------------------------------------------------


Use of a CONCATENATE function module


 vs.


Use of a CONCATENATE statement


一些字符串操作的功能模块已经过时,应该用ABAP语句或函数代替



STRING_CONCATENATE ... ---> CONCATENATE

STRING_SPLIT ... ---> SPLIT

STRING_LENGTH ... ---> strlen()

STRING_CENTER ... ---> WRITE..TO。..CENTERED

STRING_MOVE_RIGHT ---> 写...到...右对齐


-------------------------------------------------- ------------------------------




Moving with offset


 vs.


Use of the CONCATENATE statement




使用 CONCATENATE 语句而不是编写您自己的字符串连接



--------------------------------------------------------------------------------


Use of SEARCH and MOVE with offset


 vs.

 


Use of SPLIT statement



使用 SPLIT 语句而不是自己编写字符串拆分



--------------------------------------------------------------------------------


Shifting by SY-FDPOS places


 vs


Using SHIFT...LEFT DELETING LEADING...




如果您想删除字符串中的前导空格,请使用 ABAP/4 语句 SHIFT...LEFT DELETING LEADING... 其他结构(使用 CN 和 SHIFT... BY SY-FDPOS PLCES,如果可能,使用 CONDENSE,使用 CN和 ASSIGN CLA+SY-FDPOS(LEN) ...) 没有那么快


-------------------------------------------------- ------------------------------


Get a check-sum with field length


 vs


Get a check-sum with strlen ()


使用 strlen() 函数将 DO 循环限制在字段的相关部分,例如。确定校验和时


赞赏支持