SAP CO11N BAPI_PRODORDCONF_CREATE_TT连续报工异步更新导致COGI解决方案

背景:

之前上一个项目上有同事碰到一个问题,外围接口数据进入SAP,可能会对同一工单同一工序进行连续多次报工,并且工序控制码配置的是会自动货物移动的,所以正常来说,调用完BAPI完之后除了报工数量会更新之外,还会自动收货产生一条物料凭证,当时的问题是,按照正常同步提交的方式(COMMIT WORK AND WAIT或者SET UPDATE LOCAL TASK)在接口中连续调用BAPI之后,发现报工的数量正常更新了,但是MIGO物料凭证并没有正常产生,比如报工了5次,每次数量是1000,最终报工数量正常,但是收货只有1000,其他的4000进了COGI,查看报错消息会发现是账号锁定问题,当时项目上同事采用了wait up to xxx seconds的方式进行解决,但这个方式是解决异步提交延迟问题不太建议的一种方式,因为在大批量数据处理中会浪费掉一些不必要的时间,最近刚好有时间回想到这个问题,就研究了一下这个问题的解决方向。

调查过程:

通过一些标准note的解释可以了解到,报工中涉及货物移动的处理是有单独的更新进程(经过debug发现是有单独的background task异步去触发的)去触发的,而且是异步更新,所以即使在调用完BAPI_PRODORDCONF_CREATE_TT之后使用BAPI_TRANSACTION_COMMIT并附加WAIT参数去提交,也可能会出现因为货物移动没有处理完成而导致锁没有释放,从而产生COGI记录。

针对note中提到的将OPK4中的“自动收货”、“反冲”、“实际成本”都设置为“立即联机”,在系统中经过测试也确实并不能解决这个问题。

针对这种异步提交导致锁定,从而产生COGI的问题,官方note给出的解决方案如下,执行程序CORUPROC进行处理,如果要基于订单和工厂去处理,可以实施note:1008686。

场景还原:

初始状态:

模拟针对同一个订单同一道工序连续报工5次,每次报工1000个:

执行结果:

可以看到,虽然报工都成功了,AFRU表也成功更新了报工数量,但是货物移动只成功过账了1000,其余4000都由于锁定问题进了COGI,这种情况可以手工COGI重新执行进行处理,也可以调用程序CORUPROC进行处理:

虽然可以在报工完成后调用CORUPROC去处理COGI的问题,但是异步更新仍然有可能会导致BAPI_PRODORDCONF_CREATE_TT直接报错:

所以除了wait的方式是否有其他方式解决该问题?有。

解决方案:

通过增强解决,通过多次的debug及尝试,发现如下两处地方的参数可以控制货物移动以同步提交的方式完成:

增强点1:

增强点2:

增强方案原理:

改变标准功能的处理逻辑:

增强前标准update task的LUW内容如下,货物移动的处理会在最后一个函数中由tRFC异步进程来单独完成,不受主程序中的COMMIT WORK AND WAIT控制。

增强后标准update task的LUW内容如下,货物移动的处理将会在下面的函数中被同步处理掉,不会出现异步tRFC的调用,故不会出现锁定问题。

测试验证:

以上,问题解决,不会再出现锁定问题导致的COGI。

补充:

绝大部分BAPI异步提交的问题根本原因都是因为内部有COMMIT WORK语句(没有附加 AND WAIT),部分BAPI会有类似NO_COMMIT或者COMMIT_AND_WAIT等类似的参数来控制是否内部提交,或者内部以同步更新方式提交,所以很多时候需要同步提交处理BAPI的时候,不妨查看源码,看是否可以通过这些参数来避免内部以异步方式提交,因为如果在BAPI内部COMMIT WORK之后,外部再次使用BAPI_TRANSACTION_COMMIT(WAIT = 'X')或者COMMIT WORK AND WAIT是没有用的,所以我们只需要通过一些手段(比如增强,或者通过BAPI的控制参数)来避免BAPI内部进行异步提交即可解决这个问题,WAIT的方式并不推荐使用。

残留疑问:

虽然按照上述方式可以解决该问题,但我仍然没能说服自己为什么BAPI之后的COMMIT WORK AND WAIT为什么不起效果,因为更新进程被COMMIT WORK AND WAIT触发将会是以同步方式进行的,主流程中的锁会被带到V1更新进程中,当V1更新进程执行完毕会自动释放锁,虽然报工的BAPI会触发V2更新,但我单步跟踪过,V2的更新进程中并没有上锁的操作,按道理在BAPI之后同步提交应该不会有锁的存在,所以我仍然没能清晰准确的找到note中提到的单独的更新进程是在哪里触发的,可能调试过程中还是漏看了一些过程,等有空再仔细追踪一下。 


2024.07.04更新:这个疑问终于搞明白了,并且可以测试复现出来,可以看下面这篇帖子:

SAP 报工BAPI中的 UPDATA TASK 和 BACKGROUND TASK_sap update task background task-优快云博客icon-default.png?t=N7T8https://blog.youkuaiyun.com/DeveloperMrMeng/article/details/140174352?spm=1001.2014.3001.5501关于BAPI异步提交的问题分析可以看下面这篇:

SAP ABAP调用BAPI时COMMIT WORK AND WAIT未按照预期同步提交问题分析-优快云博客icon-default.png?t=N7T8https://blog.youkuaiyun.com/DeveloperMrMeng/article/details/140377250?spm=1001.2014.3001.5501

参考资料:

Synchronous and Asynchronous Updating | SAP Help Portal

以上。 

### 使用 `BAPI_OUTB_DELIVERY_CREATE_STO` 创建出库交货 #### 函数模块描述 函数模块 `BAPI_OUTB_DELIVERY_CREATE_STO` 用于基于存储订单创建外向交货。此功能允许通过编程方式处理物流流程中的这一重要环节,从而实现自动化和集成化管理。 #### 参数列表 该函数模块接受多个输入参数来定义新创建的交货文档的具体属性: - **I_STORAGE_ORDER** (结构体): 存储订单数据集合,包含要转换成交货的关键信息。 - **I_PARTNER** (表): 定义参与方角色及其对应的客户编号或供应商编号等信息。 - **I_SCHEDULE_LINES** (表): 订单计划行项目详情,指定数量和其他调度细节。 - **I_PICKING_CONTROL** (结构体): 控制拣选过程的行为设置。 - **IMPORTING** 和 **EXPORTING**: 这些部分通常用来传递额外的信息给调用者或者接收返回的结果集。 #### 示例代码 下面是一个简单的ABAP程序片段展示如何调用这个BAPI并传入必要的参数: ```abap DATA: lv_return TYPE bapi2018, lt_storage_order LIKE TABLE OF likp, ls_partner LIKE bapisdelpa, lt_schedule_lines LIKE TABLE OF resb. " 填充 I_STORAGE_ORDER 表格... APPEND INITIAL LINE TO lt_storage_order ASSIGNING FIELD-SYMBOL(<fs_storage>). <fs_storage>-vbeln = 'STORAGE_ORDER_NUMBER'. " 替换为实际存储订单号 " 设置合作伙伴信息... ls_partner-partnertype = 'SP'. ls_partner-partnernumbe = 'PARTNER_ID'. " 添加到伙伴表格中... APPEND ls_partner TO it_partner. " 配置时间安排线路... CREATE DATA gt_resb. FIELD-SYMBOLS <fs_resb> TYPE RESB. ASSIGN gt_resb->* TO <fs_resb>. <fs_resb>-resbk = 'RESBK_VALUE'. " 资源预订键值 APPEND <fs_resb>. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO' EXPORTING i_picking_control = wa_picking_control IMPORTING et_return = lt_return TABLES t_storage_order = lt_storage_order t_partner = it_partner t_schedule_lines = lt_schedule_lines. IF NOT lt_return IS INITIAL. LOOP AT lt_return INTO DATA(ls_return). WRITE:/ ls_return-message, ls_return-type. ENDLOOP. ENDIF. ``` 上述代码展示了基本框架以及一些关键点的操作方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

觉得有用的佛系投币哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值