ABAP MIGO保存后增强物料凭证行项目数据的实战方案

1次阅读
没有评论

共计 1854 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点

在 SAP 标准 MIGO 事务中,物料凭证保存后的行项目数据处理存在明显局限性:

ABAP MIGO 保存后增强物料凭证行项目数据的实战方案

  • 标准功能无法自动触发后续业务逻辑(如更新自定义字段、触发工作流等)
  • 业务部门常需要实时更新第三方系统数据或执行复杂校验
  • 直接修改标准程序会导致升级兼容性问题

技术选型对比

  1. USEREXIT
  2. 优点:实现简单,直接嵌入标准程序
  3. 缺点:修改范围有限,升级时需重新适配

  4. Enhancement Spot

  5. 优点:支持显式增强点,结构清晰
  6. 缺点:需标准程序已预置增强点

  7. BADI

  8. 优点:标准接口规范,多实现共存,升级友好
  9. 缺点:需要查找合适的标准 BADI

推荐选择 MB_MIGO_BADI 标准 BADI,它是专为 MIGO 设计的业务插件点。

核心实现步骤

1. BADI 实现类创建

CLASS zcl_migo_badi_impl DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_ex_mb_migo_badi.
ENDCLASS.

CLASS zcl_migo_badi_impl IMPLEMENTATION.
  METHOD if_ex_mb_migo_badi~post_document.
    " 核心增强逻辑
  ENDMETHOD.
ENDCLASS.

2. 获取行项目数据

在 POST_DOCUMENT 方法中:

  1. 通过参数 IS_HEADER 获取凭证抬头数据
  2. 通过参数 IT_ITEMS 获取所有行项目
  3. 关键字段示例:
  4. MATDOC_ITEMS-MATNR(物料编号)
  5. MATDOC_ITEMS-WERKS(工厂)
  6. MATDOC_ITEMS-CHARG(批次)

3. 数据锁机制设计

CALL FUNCTION 'ENQUEUE_EZ_MM_MATDOC'
  EXPORTING
    mandt          = sy-mandt
    mblnr          = is_header-mblnr
    mjahr          = is_header-mjahr.

" 业务逻辑处理

CALL FUNCTION 'DEQUEUE_EZ_MM_MATDOC'.

完整代码示例

METHOD if_ex_mb_migo_badi~post_document.
  DATA: lv_error TYPE abap_bool.

  " 1. 加锁
  CALL FUNCTION 'ENQUEUE_EZ_MM_MATDOC'
    EXPORTING
      mandt = sy-mandt
      mblnr = is_header-mblnr
      mjahr = is_header-mjahr.

  " 2. 处理每行项目
  LOOP AT it_items ASSIGNING FIELD-SYMBOL(<fs_item>).
    " 示例:更新自定义表
    UPDATE zmatdoc_cust SET
      status     = 'P'
      updated_by = sy-uname
      updated_at = sy-datum
    WHERE mblnr = <fs_item>-mblnr
      AND mjahr = <fs_item>-mjahr
      AND zeile = <fs_item>-zeile.

    IF sy-subrc <> 0.
      lv_error = abap_true.
      " 记录错误日志
      MESSAGE e001(zmm) WITH <fs_item>-mblnr INTO DATA(lv_msg).
      zcl_log=>save( ).
    ENDIF.
  ENDLOOP.

  " 3. 错误处理
  IF lv_error = abap_true.
    CALL FUNCTION 'DEQUEUE_EZ_MM_MATDOC'.
    RAISE EXCEPTION TYPE cx_badi_multiply_implemented.
  ENDIF.

  " 4. 释放锁
  CALL FUNCTION 'DEQUEUE_EZ_MM_MATDOC'.
ENDMETHOD.

生产环境注意事项

  1. 并发控制
  2. 建议锁超时时间设置为 120 秒
  3. 使用 SM12 定期检查死锁

  4. 性能优化

  5. 批量操作时禁用 DB 提交(SET UPDATE TASK LOCAL)
  6. 复杂逻辑考虑异步处理

  7. 监控方案

  8. 使用 SAT 进行性能分析
  9. 关键节点添加 SLG1 日志

常见问题解决

  1. 数据不一致
  2. 现象:增强后部分字段未更新
  3. 方案:检查 ITEM 表与 HEADER 的关联关系

  4. 性能下降

  5. 现象:MIGO 执行变慢
  6. 方案:优化 SQL 语句,添加适当索引

  7. 短冲突出错

  8. 现象:报出锁冲突错误
  9. 方案:增加重试机制

扩展建议

可进一步探索:

  1. 使用 MB_DOCUMENT_BADI 增强其他物料凭证操作
  2. 结合 Fiori 应用做前端扩展
  3. 集成 SAP PI/CPI 实现跨系统更新

总结

通过 MB_MIGO_BADI 实现的行项目增强,既满足了业务需求,又保持了系统标准性。实际项目中建议:

  1. 严格测试各种移动类型组合
  2. 准备详细的回退方案
  3. 文档记录所有自定义逻辑
正文完
 0
评论(没有评论)