MD82创建客户独立需求避坑指南

张开发
2026/4/3 22:00:13 15 分钟阅读
MD82创建客户独立需求避坑指南
客户独立需求Customer Independent Requirement CIR在SAP中通过销售凭证类型01创建其核心BAPI为SD_SALESDOCUMENT_CREATE。MD82通常指修改事务码但创建操作主要使用MD81对应的BAPI逻辑。以下将通过具体场景如按客户预测创建物料需求演示创建流程、关键配置及常见问题规避。1. 创建流程与核心数据结构创建客户独立需求本质上是创建一个凭证类型为01的销售订单。核心数据结构如下表所示数据结构用途关键字段说明示例值BAPISDHD1(销售凭证抬头)定义订单整体属性DOC_TYPE(凭证类型),DOC_DATE(凭证日期)DOC_TYPE ‘01’BAPISDHD1X(抬头更新标识)指定抬头中哪些字段需要更新DOC_TYPE,DOC_DATEDOC_TYPE ‘X’,DOC_DATE ‘X’BAPISDITM(销售凭证行项目)定义物料、工厂等信息ITM_NUMBER,MATERIAL,PLANT,SALES_UNITITM_NUMBER ‘10’,MATERIAL ‘MAT001’BAPISDITMX(行项目更新标识)指定行项目中哪些字段需要更新ITM_NUMBER,MATERIAL,PLANT,SALES_UNIT对应字段设为‘X’BAPISCHDL(计划行)定义需求数量与日期ITM_NUMBER,REQ_QTYITM_NUMBER ‘10’,REQ_QTY 100BAPISCHDLX(计划行更新标识)指定计划行中哪些字段需要更新ITM_NUMBER,REQ_QTYREQ_QTY ‘X’2. 核心代码示例与避坑点以下ABAP代码演示了完整的创建流程并附有详细的避坑注释。REPORT Z_CREATE_CUSTOMER_INDEP_REQ. DATA: lv_vbeln TYPE BAPIVBELN-VBELN, 返回的销售凭证号 lt_return TYPE STANDARD TABLE OF BAPIRET2, BAPI返回消息表 ls_order_header_in TYPE BAPISDHD1, 销售凭证抬头数据 ls_order_header_inx TYPE BAPISDHD1X, 销售凭证抬头更新标识 lt_order_items_in TYPE TABLE OF BAPISDITM, 销售凭证行项目数据 lt_order_items_inx TYPE TABLE OF BAPISDITMX, 行项目更新标识 lt_order_schedules_in TYPE TABLE OF BAPISCHDL, 计划行数据 lt_order_schedules_inx TYPE TABLE OF BAPISCHDLX. 计划行更新标识 1. 准备抬头数据 CLEAR: ls_order_header_in, ls_order_header_inx. ls_order_header_in-doc_type 01. 【关键】凭证类型必须为01代表客户独立需求 ls_order_header_in-doc_date sy-datum. 凭证日期设为当前日期 ls_order_header_inx-doc_type X. 标识更新此字段 ls_order_header_inx-doc_date X. 标识更新此字段 2. 准备行项目数据 CLEAR: lt_order_items_in, lt_order_items_inx. DATA(ls_oitem) VALUE BAPISDITM( itm_number 10, 行项目号 material MATERIAL_001, 物料号需确保存在 plant 1000, 工厂需确保物料在此工厂下有效 sales_unit EA 销售单位需从物料主数据(MARA-MEINS)获取 ). APPEND ls_oitem TO lt_order_items_in. DATA(ls_oitemx) VALUE BAPISDITMX( itm_number ls_oitem-itm_number, material X, 标识更新此字段 plant X, 标识更新此字段 sales_unit X 标识更新此字段 ). APPEND ls_oitemx TO lt_order_items_inx. 3. 准备计划行数据定义需求数量 CLEAR: lt_order_schedules_in, lt_order_schedules_inx. DATA(ls_schedule) VALUE BAPISCHDL( itm_number 10, 对应行项目号 req_qty 500 需求数量 ). APPEND ls_schedule TO lt_order_schedules_in. DATA(ls_schedulex) VALUE BAPISCHDLX( itm_number ls_schedule-itm_number, req_qty X 标识更新此字段 ). APPEND ls_schedulex TO lt_order_schedules_inx. 4. 调用BAPI创建销售凭证即客户独立需求 CALL FUNCTION SD_SALESDOCUMENT_CREATE EXPORTING salesdocument 传入空值系统自动生成凭证号 sales_header_in ls_order_header_in sales_header_inx ls_order_header_inx IMPORTING salesdocument_ex lv_vbeln 返回生成的销售凭证号 TABLES return lt_return 【关键】必须检查此表 sales_items_in lt_order_items_in sales_items_inx lt_order_items_inx sales_schedules_in lt_order_schedules_in sales_schedules_inx lt_order_schedules_inx. 5. 错误处理与事务提交 DATA(lv_error) abap_false. LOOP AT lt_return INTO DATA(ls_return) WHERE type CA AEX. 检查错误(A)、异常终止(E)、退出(X)消息 lv_error abap_true. WRITE: / 错误, ls_return-message. ENDLOOP. IF lv_error abap_false. 提交数据库更改 CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. WRITE: / 客户独立需求创建成功凭证号, lv_vbeln. ELSE. 回滚所有更改 CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. WRITE: / 创建失败已回滚。. ENDIF.3. 实战避坑指南结合代码和常见问题以下是关键的避坑点物料与单位校验代码中material和sales_unit必须有效。最佳实践是在调用BAPI前先从物料主表MARA查询MEINS作为销售单位避免因单位错误导致创建失败。凭证类型锁定创建客户独立需求时ls_order_header_in-doc_type必须且只能为‘01’。使用其他类型如标准订单TA将创建错误类型的单据。必填字段更新标识在*X结构如ls_order_header_inx中对于所有在*IN结构中赋值的字段其对应的标识必须设置为‘X’否则BAPI将忽略该字段的输入值。返回值检查与事务控制调用BAPI后必须检查RETURN内表。仅当没有A错误、E异常、X退出类型消息时才能调用BAPI_TRANSACTION_COMMIT。一旦有错误必须调用BAPI_TRANSACTION_ROLLBACK回滚避免产生脏数据。修改MD82与删除MD83修改需求应使用SD_SALESDOCUMENT_CHANGE并在ORDER_HEADER_INX-UPDATEFLAG传入‘U’删除整单则传入‘D’。修改特定字段如数量时需在对应*X结构中指定字段和更新标识。4. 应用场景示例集成预测系统假设需要将外部预测系统生成的每周物料需求批量创建为SAP的客户独立需求。流程如下数据准备从接口表读取预测数据物料、工厂、需求周、数量。数据处理将需求周转换为SAP的REQ_DATE并为每一行需求生成唯一的行项目号如10,20...。批量创建在循环中调用上述BAPI代码。为提高性能可先将所有数据填充到内表再统一提交。但需注意每个BAPI调用是独立的事务建议每条需求独立处理并立即检查RETURN表确保单条失败不影响其他。结果反馈记录每条需求创建的凭证号或失败原因返回给预测系统。此方案将外部预测无缝集成到SAP的MRP运行逻辑中确保了需求计划的源头准确性。参考来源SAP MD81/MD82/MD83-BAPI 创建或修改、删除、查看客户独立需求 示例《李斌的笔记》全部文章目录 / 快速导航 / 持续更新截至 2025-01-10

更多文章