BAPI_*_DELIVERY_CHANGE BAPI附加字段增强

本文详细描述了如何通过调用BAPI并利用BADI和EXTENSION功能来修改外向交货单的LIKP和LIPS增强字段,包括数据迁移和BADI方法的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述:BAPI修改交货单扩展字段
业务需求:通过调用外向交货单修改的BAPI完成对LIKP&LIPS增强字段的修改
直接上操作:

1、VBKOK&VBPOK添加增强字段

 2、增强点BADI:LE_SHP_DELIVERY_UPDATE创建实施

 

  METHOD if_ex_le_shp_delivery_update~update_header.

    MOVE is_vbkok-zaddress TO cs_likp-zaddress .
    MOVE is_vbkok-zcontact TO cs_likp-zcontact .
    MOVE is_vbkok-ztel     TO cs_likp-ztel .
    MOVE is_vbkok-zord     TO cs_likp-zord .
    MOVE is_vbkok-zwlgs    TO cs_likp-zwlgs .
    MOVE is_vbkok-zfws     TO cs_likp-zfws .
    MOVE is_vbkok-zxsqd    TO cs_likp-zxsqd .
    MOVE is_vbkok-zcrtid   TO cs_likp-zcrtid .

  ENDMETHOD.
  method IF_EX_LE_SHP_DELIVERY_UPDATE~UPDATE_ITEM.
    MOVE IS_VBPOK-ZJQBM TO CS_LIPS-ZJQBM .
  endmethod.

完事激活

3、BADI:SMOD_V50B0001->EXIT_SAPLV50I_010添加增强逻辑

  METHOD if_ex_smod_v50b0001~exit_saplv50i_010.

    READ TABLE extension2 INTO DATA(ls_extension2) WITH KEY param = 'LIKP' field = 'ZADDRESS' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zaddress .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZCONTACT' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zcontact .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZTEL' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-ztel .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZORD' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zord .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZWLGS' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zwlgs .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZFWS' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zfws .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZXSQD' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zxsqd .
      CLEAR : ls_extension2 .
    ENDIF .

    READ TABLE extension2 INTO ls_extension2 WITH KEY param = 'LIKP' field = 'ZCRTID' .
    IF sy-subrc = 0 .
      MOVE ls_extension2-value TO cs_vbkok-zcrtid .
      CLEAR : ls_extension2 .
    ENDIF .

    LOOP AT ct_vbpok ASSIGNING FIELD-SYMBOL(<fs_vbpok>) .
      LOOP AT extension2 INTO ls_extension2 WHERE param = 'LIPS' AND field = 'ZJQBM' AND row = <fs_vbpok>-posnr_vl .
        MOVE ls_extension2-value TO <fs_vbpok>-zjqbm .
        CLEAR ls_extension2 .
      ENDLOOP .
    ENDLOOP .

  ENDMETHOD.

 完事激活

4、BAPI相关代码

    lv_head_data-deliv_numb   = lv_vbeln_in .
    lv_head_cont-deliv_numb   = lv_vbeln_in .
    lv_delivery               = lv_vbeln_in .

    SELECT * FROM lips INTO TABLE @DATA(lt_lips_tab) WHERE vbeln = @lv_vbeln_in .

    LOOP AT import_info-mt_sd002_request-import_item[] INTO ls_item .
      ls_item_data-deliv_numb = lv_vbeln_in .
      ls_item_data-deliv_item = ls_item-posnr .
      ls_item_data-dlv_qty    = ls_item-lfimg .
      READ TABLE lt_lips_tab INTO DATA(ls_lips_con) WITH KEY posnr = ls_item-posnr .
      IF sy-subrc = 0 .
        ls_item_data-fact_unit_nom   = ls_lips_con-umvkz .
        ls_item_data-fact_unit_denom = ls_lips_con-umvkn .
      ENDIF .
      APPEND ls_item_data TO lt_item_data .

      ls_item_cont-deliv_numb = lv_vbeln_in .
      ls_item_cont-deliv_item = ls_item-posnr .
      ls_item_cont-chg_delqty = 'X' .
      APPEND ls_item_cont TO lt_item_cont .

      ls_item_data_spl-deliv_numb = lv_vbeln_in .
      ls_item_data_spl-deliv_item = ls_item-posnr .
      ls_item_data_spl-stge_loc   = ls_item-lgort .
      APPEND ls_item_data_spl TO lt_item_data_spl .

*扩展字段处理.

      IF import_info-mt_sd002_request-import_head-zaddress IS NOT INITIAL .
        ls_extension2-field = 'ZADDRESS' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zaddress .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-zcontact IS NOT INITIAL .
        ls_extension2-field = 'ZCONTACT' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zcontact .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-ztel IS NOT INITIAL .
        ls_extension2-field = 'ZTEL' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-ztel .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-zord IS NOT INITIAL .
        ls_extension2-field = 'ZORD' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zord .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-zwlgs IS NOT INITIAL .
        ls_extension2-field = 'ZWLGS' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zwlgs .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-zfws IS NOT INITIAL .
        ls_extension2-field = 'ZFWS' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zfws .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-zxsqd IS NOT INITIAL .
        ls_extension2-field = 'ZXSQD' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zxsqd .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF import_info-mt_sd002_request-import_head-zcrtid IS NOT INITIAL .
        ls_extension2-field = 'ZCRTID' .
        ls_extension2-param = 'LIKP' .
        ls_extension2-value = import_info-mt_sd002_request-import_head-zcrtid .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      IF ls_item-zjqbm IS NOT INITIAL .
        ls_extension2-field = 'ZJQBM' .
        ls_extension2-param = 'LIPS' .
        ls_extension2-row   = ls_item-posnr .
        ls_extension2-value = ls_item-zjqbm .
        APPEND ls_extension2 TO lt_extension2 .
        CLEAR : ls_extension2 .
      ENDIF .

      CLEAR : ls_item ,ls_item_data ,ls_item_cont ,ls_item_data_spl ,ls_lips.
    ENDLOOP.

    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        header_data    = lv_head_data
        header_control = lv_head_cont
        delivery       = lv_delivery
      TABLES
        item_data      = lt_item_data
        item_control   = lt_item_cont
        extension1     = lt_extension
        extension2     = lt_extension2
        return         = lt_return
        item_data_spl  = lt_item_data_spl.

*增强BUG:做完这俩增强行项目扩展字段可以更新,但是抬头还是不行,最后也没发现问题。

DEBUG找到增强点MV50AFZ1->USEREXIT_SAVE_DOCUMENT_PREPARE

经过测试,可以抛内存将抬头的扩展字段写入这个增强点。

<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
发出的红包

打赏作者

消气伟消消气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值