|
Blogs by

Jerry Wang

如何批量调用BO action 如何批量执行BO Retrieve 如何批量执行BO Create Stefan Hagen在博文SAP Cloud Application Studio Performance Best Practices里介绍了在C4C里使用Cloud Application Studio进行ABSL编程的一些性能方面的最佳实践。 文章里提纲挈领地给出了一些guideline。这里提供一些具体的例子。 如何批量调用BO action 不好的例子: 第一行和第四行有两个循环,然后在第二次循环里调用一个比较耗时的ServiceRequest BO的item 节点上定义的标准action FinishFulfilmentProcessing。代码的时间复杂度为o(n2) 正确的做法: 优化的原理就是,C4C和其他很多基于Netweaver的SAP产品一样,其BO的核心service都支持批量操作。所谓批量操作,技术上就是指这些service的输入参数是一个内表,而非单条数据。如果您做过CRM开发,可以类比CRM_ORDER_MAINTAIN这个function module,其所有输入参数都是内表结构。C4C的BO提供的service的接口定义也完全采用了这种支持批量操作的设计。 上述不好的例子,编译出来的ABAP代码的伪代码如下:(因为C4C的后台代码没有开放给Partner和客户,我只能提供伪代码)。可以看出尽管BO的action是执行批量操作,但是这种写法并没有发挥批量操作的作用,每次在循环内部作为输入参数的内标在第二行被清空,造成每次调用BO action时输入参数只有一条记录。 而正确的例子,编译后生成的伪代码为: 能清楚地看到BO action的执行已经放到循环外部了。 如何批量执行BO Retrieve 当我们在Cloud

JAD JD 通过Maven自动下载依赖包的源代码 有的朋友抱怨他们在使用他们公司的闭源框架时看不到底层的源代码。那么可以尝试使用一些Java反编译工具。 下面我举个例子介绍具体使用这些反编译工具的步骤。 JAD 假设我们想在Eclipse里查看第42行Graphics2D的源代码: 直接ctrl加左键进去是看不见源码的。 我们可以使用一个开源的工具JAD通过反编译来查看其源代码。JAD的wiki介绍: https://en.wikipedia.org/wiki/JAD_(software) Eclipse有一个对应的插件,可以从如下这个链接下载: http://jadclipse.sourceforge.net/wiki/index.php/Main_Page#Download 1. 根据你使用的Eclipse版本到上述链接里下载对应的插件。 2. 根据操作系统的类型下载反编译器的执行文件。在我的windows系统上我下载的是JAD.exe。 3. 把JAD插件放到Eclipse的plugins文件夹。 4. 把JAD.exe放到JRE目录的bin文件夹下面。 5. 重启Eclipse, 在菜单路径Windows->Preference->Java里,能看到一个新的选项JadClipse。在这里我们把第四步放好的JAD.exe的绝对路径维护给字段”Path to decompiler”。 6. 现在选中一个class按F3,即可看到JAD反编译之后的Java源代码。 JD-GUI 使用很方便,window下就是一个可执行文件。 双击jd.exe, 然后把你想反编译的.class文件拖进JD的窗口即可: JD会自动反编译并且把源代码显示出来: 通过Maven自动下载依赖包的源代码 如果你的Java项目是通过Maven管理其依赖的,那么想查看依赖包的源代码是一件非常容易的事情: 通过这个Download

如果是SAPGUI里的事务码,比如MM01,对于开发者来说这个任务非常容易完成。 比如我想知道下图“Sales Unit”这个字段的值到底保存在哪张表的哪个字段里,只需要选中这个字段,按F1,在弹出窗口里即可得知表名是MVKE,字段名是VRKME. 在S/4 Fiori UI里,因为UI是由SAP UI5开发的,所以F1这个功能键无法继续使用。我们需要Chrome Development Tool的帮助。 还是看个具体例子: 我希望知道S/4HANA的Material master data这个Fiori应用里这个标签为”Number of Goods Receipt/Issue Slips”是存在哪张表里的。 详细步骤如下: 1. 搞清楚这个UI字段是绑在哪个模型字段上的。这里的模型指的就是MVC里的Model。 用Chrome打开Fiori 应用,按F12打开Chrome development tool, 然后在下图的UI5 tab里找到这个字段的绑定细节: 得知它绑到了模型字段NmbrOfGROrGISlipsToPrintQty。 如果你的Chrome development tool打开没有看到这个UI5 tab, 是因为没有装一个名叫UI5 Inspector的Chrome扩展程序。 具体怎么安装,可以查看我的博客An useful

There are two variants of SQL statement execution defined in SAP note 2000002 – FAQ: SAP HANA SQL Optimization. The difference is how the where condition is specified in SQL Statement. Sometimes I prefer to

在SAP note 2000002 – FAQ: SAP HANA SQL Optimization里提到了SQL语句的两种执行方式,具体差异体现在where语句里搜索条件的指定方式上。 所谓Literals, 就是我们通常所说的hard code – 硬编码,在下面的例子里已经写得很清楚了。 而Bind variables – 绑定变量, 就是指在出现在SQL语句的where条件是维护在变量里,这些变量的值根据应用程序的逻辑计算出来。一个典型的例子如下: 关于这两种执行方式,SAP note里有这样的提示: It can make a significant difference in terms of execution plan, performance and resource

Approach 1: ETAG mechanism This approach is used in SAP CRM Fiori. Suppose user Jerry has opened a given opportunity with ID = 3456 and clicked the Edit button: A read operation is fired and

Some ABAPers might have already noticed this button “Graphical Explain” in tcode ST05 but do not know how to use it properly. First you can switch on SQL trace via tcode ST05: And execute the

方法1: ETAG机制 SAP CRM Fiori采用了这种机制。 看一个具体的例子来理解。假设我用用户名Jerry选中了这个ID为3456的Opportunity,点击Edit按钮之后: 会触发一个读操作发到后台: 后台响应这个读请求,并且在响应的头部字段ETAG里写入了对应的值。 这个26AE结尾的ETAG的值可以由应用程序采取不同的逻辑计算,可以直接采用请求节点对应的最后修改时间戳(Last Changed Timestamp), 例如下面这段ABAP代码: 也可以基于数据的完整内容计算一个HASH值出来作为ETAG返回给Fiori UI: 现在我用另一个用户,对同一个Opportunity做了修改,成功保存。然后再回到用户Jerry的这个编辑窗口,此时Jerry根本不知道该Opportunity已经被另一个用户修改了。Jerry修改了Opportunity的Name字段,点击保存按钮。 收到这个提示信息。 从Chrome Development Tool里能观察到,当Jerry点击了保存按钮后,发送到后台的请求的头部包含了一个If-Match字段,这个字段的值就是Jerry第一次点击编辑按钮时,后台返回给Jerry的26AE结尾的ETAG字段。 背后发生了什么事请呢?在框架的方法CHECK_BEFORE_MODIFICATION里,框架会把Fiori UI请求传进来的ETAG和当前最新的ETAG做比较: CHECK_BEFORE_MODIFICATION又会调用CHECK_ETAG_MATCH方法。如果check失败,当前的保存操作将不会执行。 所以其实文章标题的“锁”其实并不准确,因为这种方法底层其实并不存在物理的基于数据库表某一行记录的锁。 方法2: 基于BOPF的锁实现 这种方式用于S/4HANA的Fiori应用,比如Material application。这种Fiori应用,消费的OData service是基于CDS view 加上BOPF实现的。 打开一个Material,点击Edit: 此时到ABAP后台使用事务码SM12能观察到Material对应的数据库表被锁住了: 这是怎么实现的呢? 在S/4HANA后台使用事务码BOBX打开BO模型I_PRODUCTWD. 展开模型,双击EDIT,能看到这个Edit实现的类为CL_I_DR_PRODUCTWD.

我发现Google和百度上关于HANA DB Hint的中文介绍比较少,所以就写了这一篇。本文部分内容来自SAP note 2142945 – FAQ: SAP HANA Hints。 什么是SAP HANA Hint HANA Hint是SAP14 HANA数据库服务器执行的一种指令。HANA Hint会影响一个数据库请求的生成和处理的方式,但绝不会改变这些数据库请求的响应结果。通俗的说,如果你不用Hint, 执行某条SQL语句查询到了N条记录。那么用了Hint,查询结果仍然是N条。HANA Hint通常用来进行HANA的性能调优,比如对执行某条SQL语句CPU或者内存占用率的优化。 SAP HANA Hint有下列几种类型: 1. SAP HANA DB Hints 直接用于HANA Studio的SQL语句里。通过select * from hints能够拿到当前版本的HANA支持的所有Hint. 在我用的HANA服务器上总共216个: 用法: 如下图红色下划线所示:

有的朋友可能在ST05里看到这个按钮但是不知道如何使用。 方法如下。 首先使用事务码ST05,使用下面的按钮打开trace开关,指定trace的client,用户名和待trace的程序。 打开trace之后,在另一个SAPGUI里执行您想要trace的程序,完毕之后关掉trace: 执行完毕之后点击这个按钮就可以查看trace文件: 使用这个按钮将某个透明表上的操作的执行计划(execution plan)导出成本地文件: 在HANA studio里导入这个.plv文件即可以图形化方式查看执行计划: 如下图所示: 把SAPGUI里ST05 trace出的这段SQL statement直接粘贴到HANA Studio里的SQL console里也是可以执行的: 打开SQL Console: 您可以关注微信公众号”汪子熙“获得更多Jerry Wang的中文SAP技术文章。 关键字:Graphical_Explain, Execution_Trace, ExecutionTrace