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_OUTB_DELIVERY_CHANGE的使用方法和示例代码。让我先回忆一下相关的引用内容。引用[2]提到这个BAPI用于过账接口,但和冲销接口一起使用时可能出现问题,需要处理并发和变量冲突。引用[4]给出了数据结构,比如BAPIDLVPARTNERCHG和BAPIOBDLVITEMCHG,这些可能在示例代码中用到。引用[3]和[5]提到另一个BAPI_OUTB_DELIVERY_CONFIRM_DEC,但用户明确问的是BAPI_OUTB_DELIVERY_CHANGE,所以需要专注于这个函数。 用户可能需要详细的步骤和代码示例,说明如何调用这个BAPI修改交货单的信息,比如数量、库位等。引用[4]中的DATA部分展示了可能需要定义的结构体,比如LWA_ITEM_DATA和LWA_ITEM_CONTROL,这些结构用于传递项目级别的更改数据。 另外,引用[1]提到SD_DELIVERY_UPDATE_PICKING和这个BAPI结合使用,可能需要在调用前先更新拣配信息。所以在步骤中可能需要先调用其他函数,再使用BAPI_OUTB_DELIVERY_CHANGE进行修改。 需要注意的是,用户可能在之前的测试中遇到E VL 216错误,引用[2]分析是因为并发或公共变量的问题,所以在示例代码中应该提醒用户注意提交和变量作用域,可能建议使用COMMIT WORK或BAPI_TRANSACTION_COMMIT。 总结步骤应该是:初始化参数、填充数据结构、调用BAPI、处理返回消息、提交事务。代码部分需要展示如何设置交货单号、项目数据、控制参数等。同时,要提到可能的错误处理,比如检查RETURN表是否有错误。 最后,相关问题的生成需要围绕常见的使用场景、错误处理、优化方法等,帮助用户进一步了解可能遇到的问题和解决方案。</think>### BAPI_OUTB_DELIVERY_CHANGE 使用方法及示例代码 BAPI_OUTB_DELIVERY_CHANGE 是 SAP 中用于修改外向交货单的常用函数,支持更新拣配数量、库位、批次等字段[^1][^4]。以下是使用步骤及示例代码: --- #### **核心步骤** 1. **数据准备** - 定义 BAPI 输入参数的数据结构(如交货单号、项目数据、控制参数等)。 - 初始化必填字段,例如交货单号(`DELIVERY`)、项目编号(`DELIV_ITEM`)。 2. **调用前逻辑** - 若需更新拣配数量,需先调用函数 `SD_DELIVERY_UPDATE_PICKING` 进行拣配操作[^1]。 - 对于批次或库位更新,需填充 `ITEM_DATA` 和 `ITEM_CONTROL` 结构。 3. **调用 BAPI** - 通过 `CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'` 执行修改。 - 检查返回表 `RETURN` 中的错误消息。 4. **提交事务** - 使用 `BAPI_TRANSACTION_COMMIT` 提交变更,确保数据持久化。 --- #### **示例代码** ```abap DATA: lt_item_data TYPE TABLE OF bapiobdlvitemchg, "项目数据 lt_item_control TYPE TABLE OF bapiobdlvitemctrlchg, "项目控制 lt_return TYPE TABLE OF bapiret2. "返回消息 "1. 设置交货单号及项目数据 DATA(lv_delivery) = '80000001'. "交货单号 APPEND INITIAL LINE TO lt_item_data ASSIGNING FIELD-SYMBOL(<fs_item>). <fs_item>-deliv_numb = lv_delivery. "交货单号 <fs_item>-deliv_item = '000010'. "项目编号 <fs_item>-material = 'MAT001'. "物料号 <fs_item>-plant = '1000'. "工厂 <fs_item>-stge_loc = 'FG01'. "目标库位 <fs_item>-batch = 'BATCH001'. "批次号 "2. 设置控制参数(标记修改字段) APPEND INITIAL LINE TO lt_item_control ASSIGNING FIELD-SYMBOL(<fs_control>). <fs_control>-deliv_numb = lv_delivery. <fs_control>-deliv_item = '000010'. <fs_control>-stge_loc_flg = 'X'. "标记库位需更新 "3. 调用 BAPI CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE' EXPORTING delivery = lv_delivery TABLES item_data = lt_item_data item_control = lt_item_control return = lt_return. "4. 检查错误 READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. MESSAGE '更新失败' TYPE 'E'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. MESSAGE '更新成功' TYPE 'S'. ENDIF. ``` --- #### **关键注意事项** 1. **并发控制** - 若同时调用冲销接口(如 `WS_REVERSE_GOODS_ISSUE`),需确保冲销操作完全提交后再调用此 BAPI,避免状态冲突[^2]。 2. **字段标记** - 在 `ITEM_CONTROL` 中需通过标志位(如 `stge_loc_flg = 'X'`)明确指定修改字段[^4]。 3. **增强处理** - 若遇到无法冲销的问题,可通过 BAdI `LE_SHP_DELIVERY_PROC` 清空分配状态字段 `CS_LIKP-VLSTK`[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值