如何通过创新提高执行效率 ABAP编程中提高执行效率的几个技巧
摘要:ABAP语言是专为企业资源计划系统(ERP)内部商业应用程序开发而设计,ABAP程序编写的优劣直接影响企业对ERP系统的应用。本文从程序设计的角度介绍了一些可提高执行效率的小技巧。
关键词:ABAP 优化 效率 技巧
ABAP全称是Advanced Business Application Programming(高级商业应用程序),它是由SAP公司开发的一种编程语言,用于应用程序的交互式开发,是一种十分成熟、应用广泛、而且功能强大的开发工具。ABAP语言结合ABAP工作台工具生成的系统应用程序极为灵活,可以是在SAP Basis系统内部跨平台运行,实现了SAP系统80%以上的二次开发功能。
随着系统的运行,系统中的数据量会越来越大,这就对程序的运行速度产生很大的影响,甚至有些程序运行时会因超时而被数据库踢掉,这时就需要考虑对程序进行优化了。所谓程序优化,就是在程序设计时,通过选择最优数据结构、最优执行语句,设计最优执行流程,达到程序执行速度最快、占用系统资源最少的目的。笔者根据自己的ABAP编程经验,介绍几个可以提升执行效率的技巧。
尽量不要用 Select -End Select 语句。
ABAP支持Select -End Select 语句,就是可以在Select中对取得的每一行数据先放入一个行结构中,再做处理。但这个语句在数据量很大时,会严重影响程序运行速度。Select -End Select 语句在整个运行过程中是保持数据库连接的,相当于在一个Loop中反复访问数据库,加重了数据库的负荷。所以在大数据量处理的程序中,要避免用该语法。可用下面这一语法代替,效率会更高:
DATA: BEGIN OF itab OCCURS 0,
bukrsTYPE bkpf-bukrs,
belnrTYPE bkpf-belnr,
gjahrTYPE bkpf-gjahr,
END OF itab.
SELECT bukrs belnr gjahr INTO TABLE itab FROM bkpf WHEHE .
用Join表连接
如果数据来源为多个表时,可用关联语句将几个表按关键字关联起来。不过要注意:如果涉及到的数据来源表为簇表,则不能用Join连接,如表Bseg(会计核算凭证段);当有多种关联方法时,应尽量使用关联表数量较少的方法。
For All Entries In
对于不能Join关联的表,如Bseg,可使用For All Entries In语句将该表与内表串联。但要注意以下几点:
(1)必须要判断For All Entries In后面的内表是否为空,如果它为空的话,那么在where条件中的与内表中字段进行比较的结果全部为真,也就是全部满足条件,这会导致取出非常多的数据,极大地影响系统的性能。
(2)该语句会自动删除重复行,所以取数时尽量把主键都考虑上。例如:
SELECT bukrs belnr gjahr buzei shkzg wrbtr
FROM bseg
INTO TABLEitab1
FOR ALL ENTRIES IN itab2 WHERE belnr = itab2-belnr AND bukrs = itab2-bukrs AND gjahr = itab2-gjahr AND hkont IN gr_racct.
这里若不取行项目buzei字段,如果有两个行项目公司的代码、会计年度、凭证号、借贷标识、金额完全相同,则只会取出其中一条,另一条丢失。
注意,这里的gr_racct是一个Ranges,可作为选择条件,在取数时会比较方便,不过Ranges是有限制的,数据量太大则不建议使用。
(3)数据量大的时候用FOR ALL ENTRIES IN效率会比较低,因为系统里面的处理就像两个Select语句循环,其原理等同于Where字句后用Or条件,会占用大量内存,不如一次选出,然后用Delete筛选。
多用内表处理数据
减少对数据库的操作,SAP发明了内表并提供了众多的内表操作语句。先将需要的数据放入内表再进行处理,这样在大数量级的处理上就有明显的性能优势。使用内表后,相当于把数据放在一个缓存中,然后在这个缓存空间中再次循环使用,这样就可以减少搜索数据的时间。
尽量避免循环嵌套
在数据量大的情况下,操作内表尽量避免循环嵌套,避免在循环中定义变量或者调用子程序。
可用Loop…Endloop加二分法搜索代替:
先将一内表排序:SORT itab2 BY ….其中 …为内表中字段名
LOOP AT itab1.
READ TABLE itab2 WITH KEY …BINARY SEARCH.
ENDLOOP.
熟悉实际业务流程
开发人员要尽量去熟悉业务流程,根据实际业务流程来挖掘,清楚地了解系统数据表中的数据是从哪一步操作得来的,表之间又都有什么关系。丰富的业务知识将非常有助于我们的开发。
比如说,我们都知道表Bseg是一个簇表,它是由6个表组成的,包括:(1)总帐:Bsis(会计核算:总帐科目的次级索引)、Bsas(会计核算:总帐科目的第二个索引(已结算项目));(2)供应商:Bsik(会计核算:供应商的第二次索引)、Bsak(会计核算:供应商的第二个索引(已结算项目));(3)客户:Bsid(会计核算:供应商的第二次索引)、Bsad(会计核算:客户的第二个索引(已结算项目))
这样,当业务人员提出要开发银行存款日记账时,根据业务知识,这只涉及到总帐科目,那么在取会计凭证明细的时候就可以考虑在表Bsis、Bsas中取数,而不是表Bseg。表Bseg中的数据量是非常庞大的,我们在开发程序时应尽可能避免在该表中取数。
其他需要注意的事项
(1)在对数据库表进行查询的时候,尽可能多地使用表的INDEX(也就是所谓的关键字)项作为判断条件。(2)内表使用完毕后,要及时释放内存,养成用完就清理的好习惯。
8 结语
以上是笔者在实践过程中总结的一些经验,这只是ABAP程序优化的一小部分。ABAP程序的优劣直接影响企业对ERP系统的应用,作为ABAP程序员在设计程序时必须要考虑到程序执行的效率。技巧是能力达到一定程度的升华,只有达到熟练使用技巧,才能转化为更具一般性、普适性的能力,这体现了技巧与能力的结合。
参考文献
[1] 黄佳著.SAP程序设计.机械工业出版社.2005年.
[2] 颜安著.企业ERP应用研究.西南财大.2006年.
