BAPI_BATCH_CHANGE在更新后不自动更新批次特征

1、问题介绍

 在CL03中看到分类特性配置了制造日期字段,并绑定了生产日期字段MCH1~HSDAT

MSC2N修改批次的生产日期字段时,自动修改了对应的批次特性

但是通过BAPI:BAPI_BATCH_CHANGE修改生产日期时,并没有更新到批次特性中

2、BAPI

根据官方提示,需要使用BAPI:BAPI_BATCH_SAVE_REPLICA来同步更新批次特性

在BAPI_BATCH_SAVE_REPLICA中可以传入基本数据视图中的生产日期

"--------------------@斌将军--------------------
CLEAR:ls_batchattributes,ls_batchattributesx.
ls_batchattributes-prod_date = sy-datum."生产日期
ls_batchattributesx-prod_date = 'X' ."生产日期
"--------------------@斌将军--------------------

同时维护批次特性的值

"--------------------@斌将军--------------------
CLEAR:ls_classvaluationschar.
ls_classvaluationschar-class_type = lv_klart.
*ls_classvaluationschar-objectkey = lv_objectkey.
ls_classvaluationschar-objectkey_long = lv_objek.
ls_classvaluationschar-objecttable = lv_obtab.
ls_classvaluationschar-charact = 'ZSC_BATCH_HSDAT'.
ls_classvaluationschar-value_char = sy-datum.
APPEND ls_classvaluationschar TO lt_classvaluationschar.
"--------------------@斌将军--------------------

完整代码参考

"--------------------@斌将军--------------------
REPORT ytest010.

DATA:lv_material TYPE bapibatchkey-material,
     lv_batch    TYPE bapibatchkey-batch,
     lv_plant    TYPE bapibatchkey-plant,
     lv_matnr    TYPE matnr. "40位

DATA:lv_objek TYPE cuobn,
     lv_obtab TYPE tabelle,
     lv_klart TYPE klassenart,
     lv_class TYPE klasse_d.

DATA:ls_batchattributes     TYPE  bapibatchatt,
     ls_batchattributesx    TYPE bapibatchattx,
     lt_classallocations    TYPE TABLE OF bapi3060_allocation,
     ls_classallocations    TYPE bapi3060_allocation,
     lt_classvaluationschar TYPE TABLE OF bapi3060_valuation_char,
     ls_classvaluationschar TYPE bapi3060_valuation_char,
     lt_classvaluationscurr TYPE TABLE OF bapi3060_valuation_curr,
     ls_classvaluationscurr TYPE bapi3060_valuation_curr,
     lt_classvaluationsnum  TYPE TABLE OF bapi3060_valuation_num,
     ls_classvaluationsnum  TYPE bapi3060_valuation_num,
     lt_return              TYPE TABLE OF bapiret2,
     ls_return              TYPE bapiret2.

lv_matnr = '41155126C'."物料
lv_batch = 'P001055009'."批次
lv_plant = 'SC10'."工厂

CLEAR:lv_objek,lv_obtab,lv_klart,lv_class.
*lv_matnr = lv_material.
CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
  EXPORTING
    i_matnr = lv_matnr
    i_charg = lv_batch
    i_werks = lv_plant
  IMPORTING
    e_objek = lv_objek
    e_obtab = lv_obtab
    e_klart = lv_klart
    e_class = lv_class.

*后边可以直接使用lv_objek值,
*不需要用BAPI_OBJCL_CONCATENATEKEY专门生成lv_objectkey
*lt_objectkeytable = VALUE #( ( key_field = 'MATNR' value_int = LV_material )
*                                ( key_field = 'WERKS' value_int = lv_plant )
*                                ( key_field = 'CHARG' value_int = lv_batch )
*                            ).
*
*"获取key值objectkey(物料和批次)
*REFRESH:lt_return.
*CLEAR:lv_objectkey.
*CALL FUNCTION 'BAPI_OBJCL_CONCATENATEKEY'
*  EXPORTING
*    objecttable    = lv_obtab "表名
*  IMPORTING
*    objectkey_conc = lv_objectkey
*  TABLES
*    objectkeytable = lt_objectkeytable
*    return         = lt_return.
*
*LOOP AT lt_return INTO ls_return WHERE type CA 'EAX'.
*  MESSAGE '获取特性失败:未查询到分类密钥' TYPE 'S' DISPLAY LIKE 'E'.
*ENDLOOP.

"修改批次数据
CLEAR:ls_batchattributes,ls_batchattributesx.
ls_batchattributes-prod_date = sy-datum."生产日期
ls_batchattributesx-prod_date = 'X' ."生产日期

"修改分类特性值
CLEAR:ls_classallocations.
ls_classallocations-class_type    = lv_klart.
*ls_classallocations-objectkey     = lv_objectkey.
ls_classallocations-objectkey_long   = lv_objek.
ls_classallocations-objecttable   = lv_obtab.
ls_classallocations-classnum      = lv_class.
ls_classallocations-classtype     = lv_klart.
ls_classallocations-standardclass = 'X'.
APPEND ls_classallocations TO lt_classallocations.

CLEAR:ls_classvaluationschar.
ls_classvaluationschar-class_type = lv_klart.
*ls_classvaluationschar-objectkey = lv_objectkey.
ls_classvaluationschar-objectkey_long = lv_objek.
ls_classvaluationschar-objecttable = lv_obtab.
ls_classvaluationschar-charact = 'ZSC_BATCH_HSDAT'.
ls_classvaluationschar-value_char = sy-datum.
APPEND ls_classvaluationschar TO lt_classvaluationschar.

CALL FUNCTION 'BAPI_BATCH_SAVE_REPLICA'
  EXPORTING
    material_long       = lv_matnr "长物料
*   material            = lv_material
    batch               = lv_batch
    plant               = lv_plant
    batchattributes     = ls_batchattributes
    batchattributesx    = ls_batchattributesx
  TABLES
    return              = lt_return
    classallocations    = lt_classallocations
    classvaluationschar = lt_classvaluationschar
    classvaluationscurr = lt_classvaluationscurr
    classvaluationsnum = lt_classvaluationsnum.

DATA:lv_check   TYPE char1,
     lv_message TYPE char255.

CLEAR:lv_message.
LOOP AT lt_return INTO ls_return WHERE type CA 'EAX'.
  lv_message = lv_message && ls_return-message.
  lv_check = 'E'.
ENDLOOP.
IF lv_check = 'E'.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  WRITE:lv_message.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF.
"--------------------@斌将军--------------------

<think>我们正在讨论的是如何使用BAPI_RESERVATION_CHANGE修改预留。根据引用[1],该BAPI用于更改预留单,对应前台事务码MB22。预留单在SAP中用于计划未来的物料移动,例如生产领料或项目物料提取。 使用BAPI_RESERVATION_CHANGE的步骤和关键点如下: 1. **准备预留单数据**: - 需要提供预留单号(RESERVATION)和项目(ITEM)信息。 - 预留单号是必填项,通常通过预留单创建时获得(由BAPI_RESERVATION_CREATE1返回)或通过预留单查询获得。 2. **设置修改字段**: - 该BAPI通过参数`RESERVATION`传入预留单号,然后通过`RESERVATION_ITEM`表传入要修改的行项目。 - 对于每个要修改的行项目,需要指定项目号(RES_ITEM)以及要修改的字段(如物料号、数量、工厂、库存地点等)。 3. **执行BAPI**: - 调用BAPI后,需要检查返回消息表(RETURN)以确认修改是否成功。 4. **提交更改**: - 如果BAPI执行成功,必须调用`BAPI_TRANSACTION_COMMIT`提交事务,否则更改会保存。 示例代码(ABAP): ```abap DATA: lv_reservation TYPE bapireskey-res_number, " 预留单号 lt_reservation TYPE TABLE OF bapireservation, lt_reservation_itm TYPE TABLE OF bapireservation_item, lt_return TYPE TABLE OF bapiret2. " 假设要修改的预留单号是9000001 lv_reservation = '9000001'. " 填充预留单表头(可选,一般修改行项目即可) APPEND INITIAL LINE TO lt_reservation ASSIGNING FIELD-SYMBOL(<reservation>). <reservation>-reservation = lv_reservation. " 填充要修改的行项目(示例修改项目10的数量) APPEND INITIAL LINE TO lt_reservation_itm ASSIGNING FIELD-SYMBOL(<item>). <item>-reservation = lv_reservation. <item>-res_item = '00010'. " 行项目号 <item>-material = 'MAT_OLD'. " 原物料号(如果修改物料则填新物料号) <item>-quantity = 20. " 新数量 <item>-plant = '1000'. " 工厂 <item>-stge_loc = '0001'. " 库存地点 " 调用BAPI修改预留 CALL FUNCTION 'BAPI_RESERVATION_CHANGE' EXPORTING reservation = lv_reservation TABLES reservation_item = lt_reservation_itm return = lt_return. " 检查返回消息 READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. " 存在错误,调用回滚 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 处理错误(可循环lt_return输出错误信息) ELSE. " 提交更改 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. ENDIF. ``` 注意事项: - **关键字段**:行项目号(RES_ITEM)是必须指定的,用于标识要修改的项目。 - **字段修改规则**:可以修改预留单中的多个字段,但并非所有字段都可修改(例如凭证类型、移动类型通常修改)。 - **数量修改**:如果新数量为0,系统会自动删除该行项目。 - **删除行项目**:如果要删除行项目,设置该行项目的`DELETE_ITEM = 'X'`。 - **新增行项目**:该BAPI支持新增行项目,新增应使用`BAPI_RESERVATION_CREATE1`或预留单的增强修改(如预留单的更改函数组)。 引用说明:上述BAPI使用方法和注意事项参考自SAP预留单管理文档[^1]。 相关问题: 1. 如何通过BAPI创建新的预留单? 2. 修改预留单时如何删除某个行项目? 3. 调用BAPI_RESERVATION_CHANGE后未提交事务会有什么影响? 4. 预留单修改后如何查询修改历史? 5. 修改预留单时出现物料存在的错误如何解决?</think>### SAP BAPI_RESERVATION_CHANGE 修改预留使用指南 #### 一、核心功能概述 `BAPI_RESERVATION_CHANGE` 用于修改SAP系统中的预留单(Reservation),对应前台事务码 **MB22**。主要功能包括: 1. 修改预留单行项目数量 2. 变更物料/批次/序列号 3. 更新需求日期/库存地点 4. 添加/删除预留行项目 5. 修改移动类型/成本中心等凭证字段 #### 二、关键参数说明 | 参数类型 | 名称 | 必填 | 说明 | |---------|------|-----|------| | **输入** | `RESERVATION` | ✓ | 预留单号(RKPF-RESNR) | | **输入** | `RESERVATION_ITEM` | ✓ | 行项目修改数据表 | | **输出** | `RETURN` | ✓ | 消息返回表(BAPIRET2结构) | | **输入** | `TESTRUN` | | 测试模式('X'=仅验证执行) | #### 三、完整使用步骤(ABAP示例) ```abap DATA: lt_res_item TYPE TABLE OF bapireservation_item, " 行项目修改表 lt_return TYPE TABLE OF bapiret2. " 返回消息 " 1. 准备修改数据(示例修改行项目10的数量) APPEND VALUE #( reservation = '10000001' " 预留单号 res_item = '000010' " 行项目号 quantity = 50 " 新数量(原数量30) plant = '1000' " 工厂 stge_loc = '0001' " 库存地点 ) TO lt_res_item. " 2. 调用BAPI修改预留 CALL FUNCTION 'BAPI_RESERVATION_CHANGE' EXPORTING reservation = '10000001' " 预留单号 TABLES reservation_item = lt_res_item " 修改数据 return = lt_return. " 返回消息 " 3. 检查执行结果 READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. " 存在错误 - 回滚事务 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 错误处理(可循环lt_return输出消息) ELSE. " 提交更改 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true. WRITE: '预留单 10000001 修改成功'. ENDIF. ``` #### 四、行项目修改表结构(BAPIRESERVATION_ITEM) | 字段名 | 描述 | 修改规则 | |-------|------|---------| | `RES_ITEM` | 行项目号 | 必填(标识修改行) | | `MATERIAL` | 物料号 | 可修改 | | `QUANTITY` | 数量 | 可修改(设为0将删除行) | | `BATCH` | 批次号 | 可修改 | | `MOVE_TYPE` | 移动类型 | 修改(需删除重建) | | `DELETE_ITEM` | 删除标记 | 'X'=删除此行 | | `ENTRY_QNT` | 输入数量 | 配合UNIT_OF_MEASURE使用 | | `REQ_DATE` | 需求日期 | 可修改 | #### 五、特殊场景处理 1. **删除行项目**: ```abap APPEND VALUE #( reservation = '10000001' res_item = '000020' delete_item = 'X' " 设置删除标记 ) TO lt_res_item. ``` 2. **添加新行项目**: ```abap APPEND VALUE #( reservation = '10000001' material = 'MAT-100' " 新物料 plant = '1000' stge_loc = '0002' quantity = 100 move_type = '261' " 移动类型 cost_center = 'CC-1000' " 成本中心 gl_account = '0000400000' " G/L科目 ) TO lt_res_item. ``` 3. **批次修改**: ```abap APPEND VALUE #( reservation = '10000001' res_item = '000030' batch = 'BATCH-NEW' " 新批次号 ) TO lt_res_item. ``` #### 六、错误处理与注意事项 1. **常见错误**: - `RESERVATION_NOT_FOUND`:预留单存在 - `ITEM_NOT_FOUND`:行项目号错误 - `QUANTITY_INCONSISTENCY`:数量超出可用库存 2. **关键限制**: - 预留单必须处于未清状态(RKPF-DELETED ≠ 'X') - 移动类型(MOVE_TYPE)修改 - 跨工厂修改需保证物料主数据一致 3. **事务控制**: - 必须调用 `BAPI_TRANSACTION_COMMIT` 提交 - 错误时需调用 `BAPI_TRANSACTION_ROLLBACK` > **最佳实践**:修改前先用 `BAPI_RESERVATION_GETDETAIL` 获取当前状态[^1],避免并发修改冲突。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值