除了通过SAP进行总锁出队编程的代码修改以外,还有其他方法吗?

2020-09-24 06:52发布

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

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


我有一个启用了RFC的大型功能模块,该模块在完成销售过程后为配置的物料创建BOM,工艺路线和文档。 最近,我遇到了一个鸡和鸡蛋的问题,其中包含捕获流程中的错误(这很长),然后我们希望从启动创建RFC的同一流程中获取报告。

因此,我认为创建自定义锁可以解决问题,我创建了它,并且可以正常工作了一段时间,但是随后锁"消失了"。 我调试了RFC,发现有些SAP程序员只是使用DEQUEUE_ALL只是为了删除当前在LUW中当前设置的所有锁,而不是仔细维护代码或遍历锁表并标记已经存在的锁 然后遍历它们中的每一个并分别将它们出队。

有两个地方"咬住了我",如下:

1-在FM CSAP_DOC_BOM_CREATE内部,如果发现某些错误,它将执行此操作,并且他们也在FM CS_DI_HEADER_OBJECT_CHECK中执行此操作。 值得庆幸的是,这里有代码,如果您在调用CSAP_DOC_BOM_CREATE之前将X传递给外部内存ID,它不会执行DEQUEUE_ALL。 让我震惊的是,在这种情况下,它们在创建其他任何锁之前先进行了出队。

2-以一种称为routing_clearbuffer的形式,在我调用BAPI_ROUTING_CREATE之后由BAPI_TRANSACTION_COMMIT调用的提交过程中调用了该表单,除了没有保护代码和注释(它们来自617 SP 8)之外,它们执行的操作相同。 介意您-最近)他们说他们解决了没有清除所有锁的问题,因此他们这样做不是代替清理代码并找到他们创建的所有锁,或者像我说的那样-获取以下内容: 在创建更多锁之前,先使用当前用户ID锁定表,然后逐个处理并逐个取消DEQUEUE,将之前的锁留在进程中。

恐怕对于第二种情况,我将要做的是修改代码以免破坏所有的锁,我将放入相同类型的保护代码,因为我只会在以下情况下执行它: 外部内存ID设置为X,如果这样,我将分别删除这些锁。

所以我要问的是,有没有更好的方法可以做到这一点? 发生的事情是,由于我们的自定义锁已被这些DEQUEUE_ALL删除,因此报告丢失了数据,因为它等待锁,锁早就消失了,因此报告没有得到所有错误。

我也希望BAPI和FM CSAP_DOC_BOM_CREATE的文档会说明这种副作用,但是它们都不是。 我必须用一种很难的方法来调试RFC。

注意-我们使用的是SAP版本617 SP 8(EHP7)-ABAP版本7.4

还请注意,当前流程确实可以正常工作,并且确实创建了我们所需的所有内容,只是将错误捕获到了引起问题的CAPI日志之外。

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

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


我有一个启用了RFC的大型功能模块,该模块在完成销售过程后为配置的物料创建BOM,工艺路线和文档。 最近,我遇到了一个鸡和鸡蛋的问题,其中包含捕获流程中的错误(这很长),然后我们希望从启动创建RFC的同一流程中获取报告。

因此,我认为创建自定义锁可以解决问题,我创建了它,并且可以正常工作了一段时间,但是随后锁"消失了"。 我调试了RFC,发现有些SAP程序员只是使用DEQUEUE_ALL只是为了删除当前在LUW中当前设置的所有锁,而不是仔细维护代码或遍历锁表并标记已经存在的锁 然后遍历它们中的每一个并分别将它们出队。

有两个地方"咬住了我",如下:

1-在FM CSAP_DOC_BOM_CREATE内部,如果发现某些错误,它将执行此操作,并且他们也在FM CS_DI_HEADER_OBJECT_CHECK中执行此操作。 值得庆幸的是,这里有代码,如果您在调用CSAP_DOC_BOM_CREATE之前将X传递给外部内存ID,它不会执行DEQUEUE_ALL。 让我震惊的是,在这种情况下,它们在创建其他任何锁之前先进行了出队。

2-以一种称为routing_clearbuffer的形式,在我调用BAPI_ROUTING_CREATE之后由BAPI_TRANSACTION_COMMIT调用的提交过程中调用了该表单,除了没有保护代码和注释(它们来自617 SP 8)之外,它们执行的操作相同。 介意您-最近)他们说他们解决了没有清除所有锁的问题,因此他们这样做不是代替清理代码并找到他们创建的所有锁,或者像我说的那样-获取以下内容: 在创建更多锁之前,先使用当前用户ID锁定表,然后逐个处理并逐个取消DEQUEUE,将之前的锁留在进程中。

恐怕对于第二种情况,我将要做的是修改代码以免破坏所有的锁,我将放入相同类型的保护代码,因为我只会在以下情况下执行它: 外部内存ID设置为X,如果这样,我将分别删除这些锁。

所以我要问的是,有没有更好的方法可以做到这一点? 发生的事情是,由于我们的自定义锁已被这些DEQUEUE_ALL删除,因此报告丢失了数据,因为它等待锁,锁早就消失了,因此报告没有得到所有错误。

我也希望BAPI和FM CSAP_DOC_BOM_CREATE的文档会说明这种副作用,但是它们都不是。 我必须用一种很难的方法来调试RFC。

注意-我们使用的是SAP版本617 SP 8(EHP7)-ABAP版本7.4

还请注意,当前流程确实可以正常工作,并且确实创建了我们所需的所有内容,只是将错误捕获到了引起问题的CAPI日志之外。

付费偷看设置
发送
10条回答
一只江湖小虾
1楼 · 2020-09-24 07:39.采纳回答

我不知道您的锁是否在启用RFC的功能模块的开头设置,然后在结尾删除,在这种情况下,您可以这样操作:

-锁定

-提交或RFC NONE在另一个内部会话中调用功能模块:DEQUEUE_ALL仅在当前内部会话中删除锁。

-解锁

落灬小鱼
2楼-- · 2020-09-24 07:26

对不起,您是对的,我收到有关_SYNCHRON的DEQUEUE_ALL的虚假信息。 根本与您的问题无关。

wang628962
3楼-- · 2020-09-24 07:34

有趣的问题。 如果从BAPI作为起点可以达到这些目标,则应予以支持,我将在OSS中提出。 询问他们是否愿意实施您建议的更改,有时您是否可以放心地证明这是一个合理的方案,尤其是来自BAPI的情况,他们可能会很宽容。

否则,一种替代方法是实施您自己的"后卫功能",以在将SAP的代码返回给您之后,进行检查并重新锁定。 尽管这确实为其他人打开了一些微秒,然后更改了它,但这是一种解决方法。

土豆飞人
4楼-- · 2020-09-24 07:28

我可能会遗漏一些东西,但是您究竟如何利用锁定机制来"捕获" 错误"?

我们也有一些"流程链",但是使用Z表跟踪状态,并在流程中间出现故障时重新处理错误。

作为旁注-我认为这可能是一个博客,也是米歇尔的倡议。 :)

ZJXianG
5楼-- · 2020-09-24 07:35

迈克和桑德拉-我将首先尝试桑德拉的想法,看看它是如何工作的。 迈克,我确实也应将其报告为错误,因为在我的书中删除所有锁是非常严重的副作用,除非FM文档中有明确说明(否则,我不会-我检查了这两个功能模块,并指出了问题所在 有文档),我认为这是一个严重的问题。

Sandra-您几乎描述了我目前的工作方式-锁确实在RFC中排队,并且DEQUE也如您所说-在RFC中锁定和解锁。

谢谢你们的答复-非常感谢! 我会让你们俩都知道结果是什么

Tong__Ming
6楼-- · 2020-09-24 07:27

Jalena-我不使用锁定机制来捕获它们,而是用它来尝试确保发现所有错误并 在报表运行之前正确存储。 我也将研究该倡议。

nice_wp
7楼-- · 2020-09-24 07:22

谢谢大家的回应-非常感谢! 我确实实现了Sandra关于目的地" NONE"的建议,并且确实起作用了-锁没有消失。 我将不得不执行一些命令来查看功能模块的行为是否仍然起作用,尤其是CSAP_DOC_BOM_CREATE,因为如果要使其同步运行(我这样做了),则必须以这种方式调用它:

在其他开发工作中,我发现如果不将fl_commit_and_wait传递为" X",则您将永远不知道它何时完成,如果您需要将文档BOM用于以下内容,则会陷入严重的时序问题。 后来由于SAP实现该功能模块的方式而导致其他问题。

我将研究Michelle的倡议以及Jelena

一周热门 更多>