写点什么

ABAP 工作进程对数据库表读取操作的检测

作者:Jerry Wang
  • 2022 年 8 月 17 日
    四川
  • 本文字数:2025 字

    阅读完需:约 7 分钟

ABAP工作进程对数据库表读取操作的检测

本文标题的 SM50 事务码,在 SAP 系统里描述信息是“Work Processes of AS Instance”,即应用服务器实例上的工作进程监控器。



在 Jerry 的文章 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害 曾经介绍过工作进程(Work Process)的概念。在基于 ABAP 技术栈的 SAP 产品里,客户无论是从浏览器,SAPGUI,或者 API 的方式向 SAP 系统发起请求,最后的业务处理都是通过这些勤勤恳恳的工作进程完成的。


上述文章还介绍了 SM50 里能够查看到的工作进程的不同类型,这里不再重复。



本文要介绍的,是使用 SM50 检测出工作进程长时间读取一张数据库表这个行为的小技巧。SM50 界面有一列名为"Current Action Info",如果启动 SM50 时,当前工作进程正在持续读取一张数据库表,则该列会显示出数据库表的名称。



比如上图显示了编号为 9743 的工作进程,当前状态为 Running,正在 client 000 以系统用户 SAPSYS 的身份,执行 ABAP 系统程序 SAPMSSY2, 读取数据库表 TBTCO.



我曾经用这个小技巧,完成了实际工作中的一个任务。


在我还在做 SAP CRM 标准开发时,我需要找出监听了 CL_BSP_WD_COLLECTION_WRAPPER 这个类抛出的 NEW_FOCUS 事件的所有 ABAP 类。



于是我使用 ABAP workbench 里的 Where-Used List 功能,等待了 5 分钟过后仍然出结果。我又以后台作业的方式执行了 Where-Used List 操作,或许是待检索的 ABAP 类的总数太过庞大的缘故,十分钟过去了仍无结果。


于是我换了一种方式,打开 SE80 的 Repository Information System,根据如下条件搜索:



然而这个过滤条件只能显示哪些类发布,而非监听了 NEW_FOCUS 事件。



于是我打开 SM50,一眼就看到了当前进程正陷入读取 VSEOCOMPDF 的泥潭之中。



这是一个数据库视图:



ABAP 类和其发布事件的关联关系维护在了数据库表 SEOCOMPODF 中。我在 SE16 里按照如下过滤条件进行检索:



不到一秒钟就得到了我想要的列表:



这个例子如果采用我之前文章 SAP错误消息调试之七种武器:让所有的错误消息都能被定位 里提到的工具之一,即用 ST05 跟踪 Where-Used List 执行时访问到了哪些表,结果一定会出来长长的一串。而使用 SM50 的 Current Action Info,能避开所有干扰信息,迅速准确找出存储 ABAP 类和其监听事件的关联关系的存储表。


ABAP 开发人员手头上可用的工具很多,如何在不同情形下灵活选择最合适的工具去解决问题,是我们需要不断去练习和提高的。


本文介绍的工具原理和 JavaDoc 类似,位于 software component BBPCRM


  1. 在 ABAP 类里新建一个名为 CLASS_DOCU 的私有方法。


然后把所有的注释写在这个方法源代码的前面。



  1. 在每个方法前面,采用和 JavaDoc 语法一样的方式对 ABAP 方法书写注释,比如 @param 修饰输入参数,@return 修饰返回参数等。



  1. 所有方法的文档书写完毕之后,使用事务码 CLASS_DOCUGEN 生成文档。




  1. 接下来在事务码 SE24,SE80 里就可以在 class builder 里查看这些生成的文档了。





1. 这两个 IF ELSE 分支里检测的条件其实逻辑上来说都是同一类,应该合并到一个 IF 分支里进行检查:



这是一个性能问题。使用 ABAP 原生支持的 NOT IN 关键字可以获得更好的性能。性能评测如下:



如果需要用 ABAP OPEN SQL 读取一张包含海量记录的数据库表,那么推荐使用 OPEN CURSOR 进行分块读取。



这种方式和直接用 SELECT 相比,能显著减少内存消耗量。

使用并发编程提高应用程序场景

通过下面这段代码模拟一个费时的 ABAP 程序:


定义一个 ABAP 函数:




这个函数里执行一大堆计算,然后把传入的 product ID 写到一张自定义表 ZJERRY1 里。



调用这个函数的代码:




注意第二种方案使用 STARTING NEW TASK 达到的并发执行效果:



通过比较,第二种解决方案的效率是第一种的四倍。




我们用 SAPGUI 登录某个系统时,除了用户名和密码外,还要指定一个必填字段 client:



这个 client 是什么东东?


看文档:


SAP Client is the highest hierarchical organizational unit within an SAP system that contains master records and tables. The transactions processed at SAP client level is valid and applicable for all company code data and enterprise structures.Client is a three digits numerical key and from a business point of view, client represents as a corporate group. User is required to enter client key while logging on to the SAP system.


SAP client 是 SAP 系统里包含了主数据和业务数据的层级结构最高的组织单元标识符,业务上来说代表一个企业,技术类型是一个三位的正整数。


事务码 SCC4 查看 Netweaver 系统上所有已创建的 client 列表:




ABAP 里客户做二次开发时,当其 business requirement 需要新的字段添加到已有数据类型上时,一般采用 append structure 的方式增强 SAP 标准的数据类型。



之前说到每个 extension 都有其 local 的 object, 比如 extension specific 的 data type 在 resources folder 下面的这个 XML 里定义. XML 的 naming convention 为-items.xml.



对于数据类型的扩展 Hybris 的思路也类似:



这个例子定义了一个新的数据类型 AlipayPaymentTransactionEntry,扩展自 PaymentTransactionEntry 黄色区域内的 field 相当于 ABAP 里 include structure 里的 field.

发布于: 2022 年 08 月 17 日阅读数: 73
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
ABAP工作进程对数据库表读取操作的检测_数据库_Jerry Wang_InfoQ写作社区