SD销售订单BAPI增强

本文介绍如何在 SAP BAPI 销售订单创建过程中通过增强方式添加成本中心字段。由于标准 BAPI 不包含成本中心字段,文章详细展示了如何利用增强结构 BAPE_VBAKX 和 BAPE_VBAK 来实现这一需求。

一、需求背景

在销售订单批导时,需要调用BAPI:BAPI_SALESORDER_CREATEFROMDAT2维护成本中心字段,

二、增强实现

 BAPI中没有该字段,需要通过增强的方式导入。通过BAPI的文档,可以看出,抬头部分和行项目字段分别要增强的结构

因为是抬头部分,所以要增强抬头结构,因为VBAK表本身有KOSTL字段,因此不用修改底表

BAPE_VBAK   

BAPE_VBAKX表只用维护KOSTL的更新标识即可

VBAKKOZ  

 VBAKKOZX的KOSTL的组件类型必须用CHAR1或CHAR01

因此在源码中,此处通过组件类型去获取增强字段

BAPI传入参数

   "-----------------------------@斌将军-----------------------------
 DATA:LS_ZVBAK  TYPE BAPE_VBAK,
       LS_ZVBAKX TYPE BAPE_VBAKX.
       LS_EXTEN  TYPE BAPIPAREX,                       "扩展字段
       LT_EXTEN  TYPE STANDARD TABLE OF BAPIPAREX.   "扩展字段      

      CLEAR :LS_ZVBAK,LS_ZVBAKX.
      LS_ZVBAK-VBELN = LS_IN-VBELN.
      LS_ZVBAK-KOSTL = LS_IN-ZRSV04.
      LS_ZVBAKX-VBELN = LS_IN-VBELN.
      LS_ZVBAKX-KOSTL = 'X'.

      CLEAR: LS_EXTEN.
      LS_EXTEN-STRUCTURE = 'BAPE_VBAK'.
      LS_EXTEN-VALUEPART1 = LS_ZVBAK.
      APPEND LS_EXTEN TO LT_EXTEN.

      CLEAR: LS_EXTEN.
      LS_EXTEN-STRUCTURE = 'BAPE_VBAKX'.
      LS_EXTEN-VALUEPART1 = LS_ZVBAKX.
      APPEND LS_EXTEN TO LT_EXTEN.     
"-----------------------------@斌将军-----------------------------

在出口处加入如下代码,将传入的参数进行传递。

根据测试情况,考虑是否需要增强USEREXIT_COBL_RECEIVE_VBAK出口,本例不用增强

<think>我们之前讨论的是生产订单的后继订单,现在用户询问的是销售订单的后继订单。在SAP中,销售订单的后继订单通常指的是基于现有销售订单创建新的销售订单(例如,用于修改、补充或分拆原始订单)。这可以通过BAPI `BAPI_SALESORDER_CREATEFROMDAT2` 实现,该BAPI允许通过引用原始销售订单来创建新订单。 ### 步骤1: 理解销售订单后继订单 - **后继销售订单**:在SAP销售与分销(SD)模块中,创建后继订单通常是为了修改原始销售订单(如更改数量、添加行项目等)而创建的新订单,同时保留与原始订单的关联(通过参考凭证字段)。注意:SAP标准功能中,销售订单的修改通常直接在原订单上进行,但某些业务场景(如合同拆分、订单分拆)需要创建新订单。 - **BAPI选择**:`BAPI_SALESORDER_CREATEFROMDAT2` 是最常用的BAPI,它支持通过输入参数`REFERENCE_SD_DOC`(参考销售凭证)来引用原始销售订单号,从而创建后继订单[^1]。 - **关键点**: - 原始订单必须存在且有效。 - 后继订单订单类型(如`OR`标准订单)需在后台配置允许参考创建。 - 用后需使用`BAPI_TRANSACTION_COMMIT`提交事务。 ### 步骤2: BAPI参数详解 `BAPI_SALESORDER_CREATEFROMDAT2`的主要参数: - **输入参数**: - `SALESDOCUMENTIN`:新订单号(可选,若留空则系统自动生成)。 - `REFERENCE_SD_DOC`:**关键参数**,指定原始销售订单号(如`0000001234`)。 - 其他订单头数据(如`ORDER_HEADER_IN`)通常可继承自原始订单,但也可覆盖(如更改订单类型、销售组织等)。 - **输入表参数**: - `ORDER_ITEMS_IN`:订单行项目数据。若要修改原始订单的行项目,可在此传入新数据(如更改数量、物料等)。若不传,则默认复制原始订单所有行项目。 - `PARTNERS`:合作伙伴数据(如售达方、送达方)。若需修改,可传入新值;否则继承原始订单。 - **输出参数**: - `RETURN`:返回消息表(检查错误)。 - `SALESDOCUMENT`:生成的新销售订单号。 ### 步骤3: 示例代码 以下ABAP代码演示如何创建销售订单的后继订单(基于原始订单`0000001234`创建新订单): ```abap DATA: ls_order_header TYPE bapisdhd1, " 订单头结构 lt_order_items TYPE TABLE OF bapisditm, " 行项目表 lt_partners TYPE TABLE OF bapiparnr, " 合作伙伴表 lt_return TYPE TABLE OF bapiret2, " 返回消息表 lv_new_salesorder TYPE bapivbeln-vbeln. " 新订单号 " 设置参考原始订单号 ls_order_header-ref_doc_no = '0000001234'. " 原始销售订单号 " 可选:覆盖订单头数据(如更改订单类型) ls_order_header-doc_type = 'OR'. " 订单类型(标准订单) " 若需修改行项目,可填充lt_order_items(否则复制所有原始行项目) " 例如:仅复制原始订单的第一个行项目,并修改数量 APPEND INITIAL LINE TO lt_order_items ASSIGNING FIELD-SYMBOL(<fs_item>). <fs_item>-ref_doc = '0000001234'. " 原始订单号 <fs_item>-ref_doc_it = '000010'. " 原始订单行项目号 <fs_item>-material = 'MAT-001'. " 物料号(可修改) <fs_item>-target_qty = '50'. " 新数量(原为100) " BAPI创建后继订单 CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2' EXPORTING order_header_in = ls_order_header IMPORTING salesdocument = lv_new_salesorder TABLES return = lt_return order_items_in = lt_order_items partners = lt_partners. " 检查错误并提交 IF lt_return[] IS INITIAL OR NOT line_exists( lt_return[ type = 'E' ] ). CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. WRITE: / '后继销售订单创建成功,新订单号:', lv_new_salesorder. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT lt_return INTO DATA(ls_error) WHERE type = 'E'. WRITE: / '错误:', ls_error-message. ENDLOOP. ENDIF. ``` ### 注意事项 1. **行项目处理**:若需修改原始行项目,必须在`order_items_in`表中指定要修改的行(通过`ref_doc`和`ref_doc_it`标识原始行),否则BAPI会复制所有原始行项目。若要删除某行,不传入即可。 2. **合作伙伴**:若需更改合作伙伴(如售达方),在`partners`表中传入新值。 3. **配置**:确保在SAP后台(事务代码`VOV8`)配置订单类型允许“参考创建”。 4. **测试**:建议在测试环境验证,使用事务代码`VA01`手动创建后继订单(通过“参考”按钮)以理解业务逻辑。 ### 相关问题 为了帮助您更深入理解SAP销售订单管理,我生成了以下相关问题: 1. 如何通过BAPI修改已存在的销售订单? 2. 在创建后继销售订单时,如何处理定价条件和输出条件? 3. 有哪些BAPI可以用于批量创建销售订单? 如果您有特定业务场景(如分拆订单、退货订单),我可以提供更针对性的代码示例。</think>### SAP BAPI 创建销售订单的后继订单 在 SAP SD销售与分销)模块中,创建销售订单的后继订单(例如:修改订单、退货订单或补充订单)通常使用标准 BAPI **`BAPI_SALESORDER_CREATEFROMDAT2`**。该 BAPI 支持通过引用原始订单(`REFERENCE_SD_DOC`)创建关联的后继订单[^1][^3]。 #### 核心步骤与参数说明 --- ##### 1. **关键输入参数** | 参数名 | 说明 | 示例值 | |--------|------|--------| | `REFERENCE_SD_DOC` | **原始销售订单号**(必填) | `0000001234` | | `ORDER_HEADER_IN` | 新订单头数据(覆盖原始值) | `DOC_TYPE = 'RE'`(退货订单) | | `ORDER_ITEMS_IN` | 新订单行项目数据 | 修改数量、物料等 | | `PARTNERS` | 合作伙伴角色(如售达方) | 可继承或修改 | ##### 2. **输出参数** - `SALESDOCUMENT`:生成的新订单号(系统自动分配) - `RETURN`:错误/成功消息表(需检查) --- #### ABAP 代码示例 ```abap DATA: lt_return TYPE TABLE OF bapiret2, ls_order_head TYPE bapisdhd1, lt_order_items TYPE TABLE OF bapisditm, lv_new_order TYPE bapivbeln-vbeln. " 1. 设置参考原始订单 ls_order_head-ref_doc_no = '0000001234'. " 原始订单号 ls_order_head-doc_type = 'RE'. " 后继订单类型(退货订单) " 2. 定义新行项目(可选:修改原始行项目) APPEND INITIAL LINE TO lt_order_items ASSIGNING FIELD-SYMBOL(<fs_item>). <fs_item>-ref_doc = '0000001234'. " 原始订单号 <fs_item>-ref_doc_it = '000010'. " 原始行项目号 <fs_item>-material = 'MAT-001'. " 物料号 <fs_item>-target_qty = '5'. " 新数量(原为10) " 3. BAPI 创建后继订单 CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2' EXPORTING order_header_in = ls_order_head IMPORTING salesdocument = lv_new_order TABLES return = lt_return order_items_in = lt_order_items. " 4. 检查错误并提交 IF lt_return[] IS INITIAL OR NOT line_exists( lt_return[ type = 'E' ] ). CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. WRITE: / '后继订单创建成功! 新订单号:', lv_new_order. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT lt_return INTO DATA(ls_error) WHERE type = 'E'. WRITE: / '错误:', ls_error-message. ENDLOOP. ENDIF. ``` #### 关键注意事项 1. **订单类型配置** 后继订单类型(如 `RE` 退货订单)需在后台配置(事务代码 `VOV8`)允许参考创建[^1]。 2. **行项目处理** - 若不传入 `ORDER_ITEMS_IN` 表,默认复制原始订单所有行项目 - 需通过 `ref_doc` 和 `ref_doc_it` 指定修改的原始行项目[^3] 3. **关联性维护** 系统自动在原始订单的凭证流(事务代码 `VA03` → 环境 → 凭证流)中记录后继订单关系。 4. **增强场景** 如需批量处理(如批量创建退货订单),可结合 `LSMW` 或 `CEWB` 工具实现[^3]。 --- ### 相关问题 为了帮助您更深入理解 SAP 销售订单管理,我生成了以下相关问题: 1. 如何通过 BAPI 修改已存在的销售订单行项目? 2. 在创建后继销售订单时,如何处理定价条件和输出条件? 3. 有哪些 BAPI 可以用于批量创建销售订单? 4. 如何通过 BAPI 实现销售订单的取消或冻结? 如果需要特定场景(如退货订单、信用凭证)的详细代码示例,请提供更多业务需求细节。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值