具有DBLookups性能问题的SAP BRF +嵌套循环

2020-08-17 11:14发布

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

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


专家们,

我们需要为组织中的某些规则创建BRF +应用程序。

我需要从 Billing标头表(DFKKINVBILL_H)中获取多个记录,然后获取相应的 Billing订单项明细(DFKKINVBILL_I)(使用键BILLDOCNO) ,然后获取相应的提供商合同详细信息(DFKK_VT_I)(使用VTREF键)。 在这个级别上,我需要验证每个账单文档详细信息(账单标题和项目)以及提供者合同详细信息的一些规则。

我使用规则集创建了一个函数,其中使用 DBlookup for DFKKINVBILL_H 获取所有账单文档标题,然后对于每个账单文档标题,我使用 NESTED LOOPs和DBlookup将DFKKINVBILL_I和DFKK_VT_I

因为有3个DBlookups和2个嵌套循环,所以我认为这不是一个好主意,因为DFKKINVBILL_I和DFKK_VT_I的DBlookup将针对每个帐单文档进入数据库。 这肯定会导致性能问题。

它与循环内的SELECT语句相同,但这根本不是一个好方法。


示例:在我的情况下,嵌套循环和多个DBlookup

功能:Zvalidate_data

  • 第一个DBlookup DFKKINVBILL_H

循环1从DFKKINVBILL_H以上开始。

第二个DBlookup DFKKINVBILL_I正在比较billdocno

循环2从上面的DFKKINVBILL_I

开始

第三个​​DBlookup DFKK_VT_I。 比较vtref

=>"此处执行规则验证" <=

循环2结束。

循环1结束。

从性能的角度来看,你们中的任何人都可以提出最佳解决方案吗? 我们是否没有像内部联接/所有条目之类的东西或实现它的任何其他方法?

请注意: 我不想在ABAP层中收集上述表格数据,因为我们希望这些规则应独立于ABAP,并且将来如果 企业希望使用其他WHERE条件获取表数据,那么他们可以直接添加BRF +而不是ABAP。 我们正在寻找独立于编码的规则引擎。 因此,业务人员可以轻松地在BRF +中维护规则。


此致

王子

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

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


专家们,

我们需要为组织中的某些规则创建BRF +应用程序。

我需要从 Billing标头表(DFKKINVBILL_H)中获取多个记录,然后获取相应的 Billing订单项明细(DFKKINVBILL_I)(使用键BILLDOCNO) ,然后获取相应的提供商合同详细信息(DFKK_VT_I)(使用VTREF键)。 在这个级别上,我需要验证每个账单文档详细信息(账单标题和项目)以及提供者合同详细信息的一些规则。

我使用规则集创建了一个函数,其中使用 DBlookup for DFKKINVBILL_H 获取所有账单文档标题,然后对于每个账单文档标题,我使用 NESTED LOOPs和DBlookup将DFKKINVBILL_I和DFKK_VT_I

因为有3个DBlookups和2个嵌套循环,所以我认为这不是一个好主意,因为DFKKINVBILL_I和DFKK_VT_I的DBlookup将针对每个帐单文档进入数据库。 这肯定会导致性能问题。

它与循环内的SELECT语句相同,但这根本不是一个好方法。


示例:在我的情况下,嵌套循环和多个DBlookup

功能:Zvalidate_data

  • 第一个DBlookup DFKKINVBILL_H

循环1从DFKKINVBILL_H以上开始。

第二个DBlookup DFKKINVBILL_I正在比较billdocno

循环2从上面的DFKKINVBILL_I

开始

第三个​​DBlookup DFKK_VT_I。 比较vtref

=>"此处执行规则验证" <=

循环2结束。

循环1结束。

从性能的角度来看,你们中的任何人都可以提出最佳解决方案吗? 我们是否没有像内部联接/所有条目之类的东西或实现它的任何其他方法?

请注意: 我不想在ABAP层中收集上述表格数据,因为我们希望这些规则应独立于ABAP,并且将来如果 企业希望使用其他WHERE条件获取表数据,那么他们可以直接添加BRF +而不是ABAP。 我们正在寻找独立于编码的规则引擎。 因此,业务人员可以轻松地在BRF +中维护规则。


此致

王子

付费偷看设置
发送
5条回答
吹牛啤
1楼-- · 2020-08-17 11:42

嗨,王子

您可以首先使用"对于所有条目输入"模式从3个表中读取所有数据。
这样可以避免在一个循环中进行多个数据库查找。

Github上有一个开源项目 https://github.com/rulerunner/rulerunner4ABAP
它为该模式提供了一个简单的解决方案。 在BRFplus中,您调用一个静态方法,传递"所有条目"查找的所有详细信息。 它将结果直接返回到BRFplus上下文对象中。

关于

Derk

四川大学会员
2楼-- · 2020-08-17 11:46

嗨,Derk,

我没有时间对此作出回应。

是的,规则运行器概念(event-> consumer)在那里。 但是它如何满足我避免嵌套循环的要求?

此外,确实应该在ABAP中而不是在BRF +中编写所有应用程序逻辑,如果是这种情况,我应该编写用于ABAP中所有条目的所有选择查询,然后将值传递给 BRF +执行一些验证?

因为BRF +为DBlookup提供了选项,所以我认为只获取BRF +中的所有数据并也执行验证。 因此,如果他们想更改where子句或想为规则过滤掉一些数据,则无需任何技术人员参与。

请您提出建议。

此致

王子

打一壶酱油
3楼-- · 2020-08-17 11:45

嗨王子,

rulerunner 软件包包含方法zcl_rulerunner => select_for_all_entries_in。
您可以在BRFplus过程调用中直接使用此方法。 它生成一个ABAP SQL语句,该语句对int.table(屏幕快照中的参数3)语句中的所有条目执行Select from table(屏幕快照中的参数4)。 最多可以设置5个条件。
结果表被传输到BRFplus结果数据对象。
请确保db表和BRFplus结果表的结构完全相同( rulerunner 将日期和时间字段自动转换为BRFplus格式)。

您可能还会看到5.3版的runrunner文档。 (在GitHub上)。

希望有帮助。

此致

Derk

Tong__Ming
4楼-- · 2020-08-17 11:47

感谢您的回复:-)

是的,使用"调用过程",我可以调用函数模块/类方法,以便在其中收集数据。 但是将来,如果企业希望为数据选择添加更多的过滤条件,那么他们需要再次更改代码。

我正在考虑仅通过BRF +实现所有这些目标。 因此,不会对开发人员造成任何依赖,并且企业可以从他们的末端添加更多的过滤器。

nice_wp
5楼-- · 2020-08-17 12:05

BRF +能够调用自定义Z函数/静态方法。 如果您编写自己的快速方法,则可以从BRF +调用它,并获得结果以继续执行规则步骤。

在我的一个项目中,由于类似的性能问题,我们不得不停放BRF +并转向自定义Z级。 BRF +工具生成的代码很谦虚。 这是用于规则处理的好工具,但是对于大型数据集,生成的嵌套循环可能真的很慢。

一周热门 更多>