SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题

SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题

引言: 调用 MIGO 的BAPI(BAPI_GOODSMVT_CREATE)实现特定业务的物料移动是每位开发都绕不开的的活。最近我用 BAPI 实现公司间调拨批量收货时遇到了一个奇怪问题:未发货过账的公司间调拨直接成功收货,没有任何提示!

关键字:SAP ABAP BAPI_GOODSMVT_CREATE MIGO MB0A

文章目录

  • SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题
    • 1. 原因分析
      • 1.1 业务层面的分析
      • 1.2 ABAP层面的分析
    • 2. 进一步验证
    • 3. 如何解决
    • 4. 思维发散
    • 其他


1. 原因分析

  • 根据从业经验,这要么是我的问题,要么是 SAP 的问题。
    经过一番思考和请教,我发现这个问题很有趣,这既有我的问题,SAP 也脱不了干系,为什么这么说,请看我以下的两点分析。

1.1 业务层面的分析

  • 调拨业务,一般的业务流程是发货过账(GI)在先,收货过账(GR)在后。但这不是绝对的,以公司间调拨和工厂间调拨为例。
  • 公司间调拨,从记账的角度,这是两个不同公司代码下的账,记账原则上只追求物料移动借贷相等,并产生两张物料凭证,因此 GR 是可以在 GI 之前的。
  • 工厂间调拨,从记账的角度,这是同一个公司代码下的账,记账使用“一步法”,只产生一张物料凭证,没有操作上的先后。

1.2 ABAP层面的分析

  • MIGO 收货:我们在实际操作时,提示“交货 8000153752 的收货不可能:错误码 3”,下图。
    SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题_第1张图片
  • BAPI_GOODSMVT_CREATE 收货:成功!
  • 分析小结:虽然从业务层面可以解释公司间调拨的GR可以在GI之前,但是,我们在实际操作 MIGO 收货时,却提示收货不可能。此时男人的第六感告诉我:前台 MIGO 和 BAPI 的执行不一致。

2. 进一步验证

除了实践,没什么比 Note 更有公信力:356665
SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题_第2张图片
这个 Note 其实不是主讲这件事,不过也明确提及了 BAPI 不会执行与 MIGO 一样的检查

3. 如何解决

执行 Note 建议,使用函数 SD_DELIVERY_ITEMS_RECEIVE 进行收货的前置检查,直接上代码,下图。
SAP ABAP 调用 BAPI_GOODSMVT_CREATE 没有执行 MIGO/MB0A 相同检查的问题_第3张图片
两点说明:
1)非常值得注意的是,我这里进行的是交货订单级别的检查,如果你需要行项目级别的检查,请务必填写行项目号。
2)为什么详细处理了函数的Exceptions参数?这里可以参考我的另一篇文章:

SAP ABAP 如何处理函数抛出的例外参数消息文本(Function Exceptions)

实现效果,下图。
在这里插入图片描述

4. 思维发散

  • MIGO 是 SAP 业务抽象的大动作之一(此外还有如 BP ),从 SAP 版本时间线上看,MIGO 的功能整合 SAP 一直在进行,在 S4 的体现中尤为突出,在1610版本中会直接报错强制采用 MIGO 进行处理。
  • 对已有的功能进行整合是一项大工程,要考虑的问题非常多,小心翼翼、步步为营又举步维艰, BP 和 MIGO 就是其中两个很典型的例子。可能也因为这样,难免会有一些遗漏或新的想法,如文章中的这个问题。
  • 对 BAPI_GOODSMVT_CREATE 这个 BAPI 我相信还有更多的问题,这一点从我们经常重新启用 MB 事务码就可以佐证,而在 SUPPORT 和 SCN 中,我也看到了巨量 MIGO 相关帖子。

注意:

  • 可能不同版本的ERP组件此BAPI的实现版本不同,以Note声明为准
  • MB0A是已过时的事务码

其他

我的微信群、QQ群和其他发布平台。

  • 关于微信群、QQ群和其他发布平台

长期提供开发和运维服务。

  • 关于提供开发和运维服务的详情

你可能感兴趣的:(SAP,ABAP,李斌的分享笔记本,SAP,ABAP)