除了通过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仅在当前内部会话中删除锁。

-解锁

nice_wp
2楼-- · 2020-09-24 07:33

Sandra-很好的提醒! -在我的两个特定情况下,第一个是CSAP_DOC_BOM_CREATE,它具有自己的提交,然后在BAPI_ROUTING_CREATE之后,我确实调用了BAPI_TRANSACGTION_COMMIT,并且等待时间设置为" X"。

小熊yu生菜
3楼-- · 2020-09-24 07:42
请使用"注释" 这两个"答案"中的"这个答案"。 按钮"提交答案"是提出一种可能的解决方案。 此外,如果您对他们的帖子发表评论,人们很有可能会自动得到通知。
大简至美
4楼-- · 2020-09-24 07:43

谢谢您的更新,布鲁斯! 如果已回答此问题,请关闭它(请参阅此博客 )。

一周热门 更多>