ABAP -- BAPI_GOODSMVT_CREATE -- MIGO生产订单投料接收过账

*      BAPI_GOODSMVT_CREATE
    DATA lt_item   TYPE STANDARD TABLE OF bapi2017_gm_item_create.
    DATA lt_return TYPE STANDARD TABLE OF bapiret2.
    CLEAR : lt_item , lt_return.

*    DATA(ls_code) = VALUE bapi2017_gm_code( GM_CODE = '02' ).
    DATA(ls_code) = COND bapi2017_gm_code( WHEN iv_bwart = '261' AND iv_zjhw = '' THEN '02'
                                           WHEN iv_bwart = '261' AND iv_zjhw = 'X' THEN '05'
                                           WHEN iv_bwart = '101' THEN '03' ).

    DATA(ls_header) = VALUE bapi2017_gm_head_01( doc_date   = iv_cpudt_mkpf " 凭证中的凭证日期
                                                 pstng_date = iv_budat_mkpf " 凭证中的过帐日期
                                                 pr_uname   = sy-uname ).   " 用户名
    lt_item = VALUE #( ( orderid = iv_aufnr
                         material_long = iv_matnr
                         plant      = iv_werks
                         stge_loc   = iv_lgort
                         batch = iv_charg
                         "101-按生产订单计划外过账,不考虑预留;261-按生产订单过账,考虑订单预留
                         move_type  = iv_bwart"移动类型(库存管理)
                         entry_qnt  = iv_menge
*                         mvt_ind = 'F'
                          ) ).

    CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
      EXPORTING
        goodsmvt_header  = ls_header
        goodsmvt_code    = ls_code "T158G
      IMPORTING
        materialdocument = ev_mblnr
      TABLES
        goodsmvt_item    = lt_item
        return           = lt_return.

该案例涉及三种情况:

1. 

2.

3. 

为了区分开三种情况,需要确定goodsmvt_code。在网上查找相关资料如下:

  • T158G MMIM: BAPI 货物移动的可能代码

01 MB01 按采购订单的货物移动

02 MB31 按生产订单的货物移动

03 MB1A 货物提取(工单退料)

04 MB1B 转移过帐

05 MB1C 其他收货

06 MB11 货物移动

07 MB04 "物料供应"消耗的事后调整

  • T158B 检查表: 业务处理码的移动类型

 但是相关T-CODE已经弃用,只能根据描述确定goodsmvt_code。暂时不清楚有没有其它方法可以确定不同移动类型的goodsmvt_code。

<think>好的,我现在需要回答用户关于SAP中BADI MB_MIGO_BADI是否会在BAPI BAPI_GOODSMVT_CREATE中被调用,以及它们的调用关系和实现机制的问题。首先,我需要回顾一下SAP中BADI和BAPI的基本概念。 BADI(Business Add-In)是SAP的一种增强技术,允许用户在不修改标准代码的情况下扩展功能。MB_MIGO_BADI应该与MIGO事务相关,可能在货物移动时触发。而BAPI_GOODSMVT_CREATE是一个用于创建货物移动的BAPI,通常用于后台处理,比如通过外部系统调用。 用户的问题核心是:当使用BAPI_GOODSMVT_CREATE时,是否会触发MB_MIGO_BADI这个BADI。根据经验,BADI的触发通常依赖于特定的事务代码或应用模块。例如,在MIGO事务中执行操作时,相关的BADI会被调用。但BAPI可能不会触发同样的BADI,因为它们可能绕过了某些前端检查或增强点。 接下来需要验证这一点。查阅相关资料,特别是用户提供的引用,其中引用[3]提到使用BAPI_GOODSMVT_CREATE时,可以通过EXTENSIONIN参数传递扩展字段,这可能涉及到BADI增强。但具体到MB_MIGO_BADI是否被调用,可能需要更深入的分析。 考虑到SAP的机制,BADI的实现通常与特定应用程序关联。如果MB_MIGO_BADI是为MIGO事务设计的,可能在BAPI调用时不会自动触发,除非BAPI显式调用了相关增强。需要检查BAPI_GOODSMVT_CREATE的文档或源代码,看是否有调用MB_MIGO_BADI的逻辑。 另外,用户引用[3]提到通过EXTENSIONIN传递扩展字段,这可能涉及到不同的BADI,例如在BAPI层面定义的增强点,而不是MIGO事务中的BADI。因此,MB_MIGO_BADI可能不会被BAPI_GOODSMVT_CREATE直接调用。 总结:MB_MIGO_BADI主要用于MIGO事务的前端处理,而BAPI_GOODSMVT_CREATE作为后台接口,可能不会触发该BADI。但需要注意是否有隐式的调用或配置使两者关联。建议通过实际测试或查看SAP官方文档确认。</think>关于MB_MIGO_BADI增强在BAPI_GOODSMVT_CREATE中的调用关系,需从SAP增强机制和业务逻辑实现两个层面分析: ### 一、调用关系结论 **MB_MIGO_BADI不会在标准BAPI_GOODSMVT_CREATE调用过程中自动触发**。该BADI设计用于MIGO事务界面操作,与BAPI存在以下差异: 1. **执行路径差异** - MIGO事务通过$$TCODE$$驱动前端校验和界面交互,会触发$$MB_MIGO_BADI$$[^3] - BAPI_GOODSMVT_CREATE直接访问物料凭证创建函数模块$$MB_CREATE_GOODS_MOVEMENT$$,绕过了MIGO界面层 2. **增强机制差异** BAPI增强需通过: - 扩展结构$$EXTENSIONIN$$参数传递增强字段[^3] - 特定BAPI增强点(如$$BADI_GOODSMVT$$) - 隐式增强点插入 ### 二、实现机制验证方法 || MIGO事务 | BAPI调用 | |---------|----------|----------| | **BADI触发** | 自动触发MB_MIGO_BADI | 需显式配置增强 | | **表更新** | 通过MKPF/MSEG更新[^2] | 同MKPF/MSEG但跳过部分检查[^1] | | **增强方式** | 标准BADI实现 | 需使用BAPI专用增强点 | ### 三、解决方案建议 若需要在BAPI调用中实现类似MB_MIGO_BADI逻辑: 1. 创建新BADI实现$$MB_CREATE_GOODS_MOVEMENT$$的隐式增强 2. 使用$$USEREXIT_SAVE_DOCUMENT$$等标准出口 3. 通过$$CALL BADI$$语句在自定义增强中显式调用 ```abap METHOD if_ex_goodsmvt_create~save_document_prepare. " 在此处插入自定义逻辑 CALL BADI l_mb_migo_badi->item_check EXPORTING is_mseg = cs_mseg. ENDMETHOD. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值