MIGO BAPI_GOODSMVT_CREATE创建及增强

1、MIGO过账BAPI新增字段

BAPI新增收货行号字段,保存外围系统的数据

1.1、MATDOC表新增收货行号

1.2、MSEG表新增收货行号

创建DDL视图用于扩展NSDM_E_MSEG

1.3、增强实施

BADI:MB_BAPI_GOODSMVT_CREATE

调用方法IF_EX_MB_BAPI_GOODSMVT_CREATE~EXTENSIONIN_TO_MATDOC

IMSEG结构中也要新增增强字段,用于传值

增强代码

"--------------------@斌将军--------------------
METHOD IF_EX_MB_BAPI_GOODSMVT_CREATE~EXTENSIONIN_TO_MATDOC.

  DATA:
    c_lenstruc          TYPE i VALUE 30,
    wa_bapi_mb_header   TYPE bapi_te_xmkpf,
    wa_bapi_mb_item     TYPE bapi_te_xmseg,
    wa_extension_in     TYPE bapiparex.

  FIELD-SYMBOLS:
    <fs_imseg>          TYPE imseg.

  CHECK NOT extension_in[] IS INITIAL.

* Analyze IMSEG for document structure and assign LINE_IDs if necessary
  CALL METHOD cl_mmim_line_id_manager=>analyze_mb_create
    CHANGING
      ct_imseg          = ct_imseg[]
    EXCEPTIONS
      duplicate_line_id = 1
      OTHERS            = 2.

  LOOP AT extension_in INTO wa_extension_in.
    CASE wa_extension_in-structure.
* extension of MKPF
      WHEN 'BAPI_TE_XMKPF'.
        MOVE wa_extension_in+c_lenstruc TO wa_bapi_mb_header.
        MOVE-CORRESPONDING wa_bapi_mb_header TO cs_imkpf.
* extension of MSEG
      WHEN 'BAPI_TE_XMSEG'.
        MOVE wa_extension_in+c_lenstruc TO wa_bapi_mb_item.
        READ TABLE ct_imseg
          WITH KEY line_id = wa_bapi_mb_item-matdoc_itm
          ASSIGNING <fs_imseg>.
        IF sy-subrc EQ 0.
          MOVE-CORRESPONDING wa_bapi_mb_item TO <fs_imseg>.
        ENDIF.
    ENDCASE.
  ENDLOOP.

ENDMETHOD.
"--------------------@斌将军--------------------

2、MIGO各情况代码示例

 对应的gm_code取值:

*    01:采购订单的收货
*    02:生产订单的收货
*    03:发货
*    04:转移发布
*    05:其他收货
*    06:货物移动的逆转
*    07:关于转包订单的后续调整

当遇到移动类型不知道选择GOODSMVT_CODE对应的CODE时,可以通过移动类型查询T158B表和T158G,找到对应的CODE值

2.1、带增强字段的BAPI传值-移动类型531

"--------------------@斌将军--------------------
DATA:ls_imseg TYPE bapi_te_xmseg.
DATA: ls_header                TYPE  bapi2017_gm_head_01,
      ls_mode                  TYPE  bapi2017_gm_code,
      ls_goodsmvt_headret      TYPE  bapi2017_gm_head_ret,
      lt_goodsmvt_item         TYPE STANDARD TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
*      lt_goodsmvt_serialnumber TYPE STANDARD TABLE OF bapi2017_gm_serialnumber WITH HEADER LINE,
      lt_return                TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE.

DATA:lv_message TYPE char200,
   l_line_id TYPE mseg-line_id VALUE '000000'
     lv_check   TYPE char1.
*    01:采购订单的收货
*    02:生产订单的收货
*    03:发货
*    04:转移发布
*    05:其他收货
*    06:货物移动的逆转
*    07:关于转包订单的后续调整

ls_header-pr_uname = sy-uname.  "用户名
ls_header-doc_date = '20220315'."gs_template1-bldat."LV_DATE.  "凭证日期
ls_header-pstng_date = '20220315'."gs_template1-budat."LV_DATE.  "过账日期
ls_header-header_txt = ''."gs_template1-id."LV_DATE.  "抬头文本

ls_mode-gm_code = '05'.

lt_goodsmvt_item-material = '000000000000210103'."
lt_goodsmvt_item-plant = '2000'."
lt_goodsmvt_item-stge_loc = '2021'."存储地点
lt_goodsmvt_item-move_type = '531'."移动类型
lt_goodsmvt_item-entry_qnt = '1'."以录入项单位表示的数量
lt_goodsmvt_item-entry_uom = 'KPC'."单位
lt_goodsmvt_item-orderid = '000100000349'."订单号
* 凭证行的唯一标识
l_line_id = l_line_id + 1.
lt_goodsmvt_item-line_id = l_line_id.
APPEND lt_goodsmvt_item.

CLEAR:ls_imseg.
ls_imseg-matdoc_itm = l_line_id.
ls_imseg-zline = lwa_pcsx-zline.

CLEAR:ls_exte.
ls_exte-structure = 'BAPI_TE_XMSEG'.
ls_exte-valuepart1 = ls_imseg.
APPEND ls_exte TO lt_exte.

CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
  EXPORTING
    goodsmvt_header  = ls_header
    goodsmvt_code    = ls_mode
  IMPORTING
    goodsmvt_headret = ls_goodsmvt_headret
  TABLES
    goodsmvt_item    = lt_goodsmvt_item[]
    extensionin      = lt_exte
*   goodsmvt_serialnumber = lt_goodsmvt_serialnumber[]
    return           = lt_return.

CLEAR:lv_message,lv_check.

LOOP AT lt_return WHERE type CA 'EAX'.
  lv_check = 'E'.
  CONCATENATE lv_message lt_return-message INTO lv_message.
  CLEAR lt_return.
ENDLOOP.
"BAPI调用成功
IF lv_check = 'E'.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF.

"--------------------@斌将军--------------------

2.2、采购退货-移动类型161

退货采购订单,执行101,生成161移动类型行项目

MIGO收货

 代码要按照MIGO传值101移动类型,BAPI会自动产生161移动类型

"--------------------@斌将军--------------------
ls_mode-gm_code = '01'.

CLEAR:ls_goodsmvt_item.
ls_goodsmvt_item-po_number = '4100001418'."采购订单
ls_goodsmvt_item-po_item = '00010'."采购订单行项目
ls_goodsmvt_item-move_type = '101'."移动类型
ls_goodsmvt_item-mvt_ind = 'B'.   "移动标识
ls_goodsmvt_item-material = '000000010000000002'."物料
ls_goodsmvt_item-plant = '1011'."工厂
ls_goodsmvt_item-stge_loc = '1001'."存储地点
ls_goodsmvt_item-entry_qnt = '1'."数量
ls_goodsmvt_item-entry_uom = 'EA'."单位
ls_goodsmvt_item-batch = 'A'."批次
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.
"--------------------@斌将军--------------------

2.3、委外加工-移动类型543

委外加工,物料首层移动类型101,子层级移动类型543

MIGO收货

 代码要按照MIGO传值101移动类型,并将子层级物料也作为行项目,且移动类型543,此处注意不要传入虚拟件的行

"--------------------@斌将军--------------------
ls_mode-gm_code = '01'.

lv_line_id = lv_line_id + 1.

CLEAR:ls_goodsmvt_item.
ls_goodsmvt_item-line_id = lv_line_id."凭证行的唯一标识 0001
ls_goodsmvt_item-move_type = '101'."移动类型
ls_goodsmvt_item-mvt_ind = 'B'.   "移动标识
ls_goodsmvt_item-po_number = '4600000020'."采购订单
ls_goodsmvt_item-po_item = '00010'."采购订单行项目
ls_goodsmvt_item-material = '000000010000000002'."物料
ls_goodsmvt_item-plant = '1011'."工厂
ls_goodsmvt_item-stge_loc = '1001'."存储地点
ls_goodsmvt_item-entry_qnt = '1'."数量
ls_goodsmvt_item-entry_uom = 'EA'."单位
ls_goodsmvt_item-batch = 'A'."批次
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.

CLEAR:ls_goodsmvt_item.
ls_goodsmvt_item-parent_id = lv_line_id."父行标识  0001
lv_line_id = lv_line_id + 1.
ls_goodsmvt_item-line_id = lv_line_id."凭证行的唯一标识 0002
ls_goodsmvt_item-move_type = '543'."移动类型
ls_goodsmvt_item-mvt_ind = 'O'.   "移动标识
ls_goodsmvt_item-material = '000000010000000003'."物料
ls_goodsmvt_item-plant = '1011'."工厂
ls_goodsmvt_item-entry_qnt = '1'."数量
ls_goodsmvt_item-entry_uom = 'EA'."单位
ls_goodsmvt_item-batch = 'A'."批次
APPEND ls_goodsmvt_item TO lt_goodsmvt_item.
"--------------------@斌将军--------------------

2.4、传输过账-移动类型411/413/415

传输过账举例

 前台如图

 在BAPI传值时,注意转出和转入的参数,不要传反

"--------------------@斌将军--------------------
IF p_wa_upload-bwart = '413' AND p_wa_upload-sobkz = 'E'."销售订单到销售订单
    ls_goodsmvt_item-val_sales_ord  = p_wa_upload-vbeln."从销售订单
    ls_goodsmvt_item-val_s_ord_item = p_wa_upload-posnr.
    ls_goodsmvt_item-sales_ord  = p_wa_upload-d_vbeln."到销售订单
    ls_goodsmvt_item-s_ord_item = p_wa_upload-d_posnr.
ELSEIF p_wa_upload-bwart = '415' AND p_wa_upload-sobkz = 'Q'."项目转项目
    ls_goodsmvt_item-val_wbs_elem = p_wa_upload-posid."从WBS
    ls_goodsmvt_item-wbs_elem = p_wa_upload-d_posid."到WBS
ELSEIF p_wa_upload-bwart = '411' AND p_wa_upload-sobkz = 'E'."单转非限制
    ls_goodsmvt_item-val_sales_ord  = p_wa_upload-vbeln.
    ls_goodsmvt_item-val_s_ord_item = p_wa_upload-posnr.
ELSEIF p_wa_upload-bwart = '411' AND p_wa_upload-sobkz = 'Q'."项目转非限制
    ls_goodsmvt_item-val_wbs_elem = p_wa_upload-posid.
ENDIF.
"--------------------@斌将军--------------------

<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、付费专栏及课程。

余额充值