ABAP接口实现VL02N过帐发货

808 阅读3分钟

需求描述

se37编写接口,实现VL02N过帐发货操作。过帐前需要更新批次和拣配数量

一、更新批次的接口:BAPI_OUTB_DELIVERY_CHANGE

item_data 部分字段可以从 lips表 中读取。有些字段是必填的,不填,调用时可能 提示 “缺少 XXX 字段” 或者 “凭证 &1 项目 &2 中的错误 (数量一致性检查) ”

    loop at lt_item into ls_item.
        item_data-deliv_numb         = lin_vbeln.                        "修改DN号
        item_data-deliv_item         = ls_item-posnr.                 "被修改DN号行项目
        item_data-material           = <ls_lips>-matnr.                  "物料
        item_data-dlv_qty            = <ls_lips>-lfimg.                  "交货数量
        item_data-batch              = ls_item-charg.                 "批次
        item_data-sales_unit         = <ls_lips>-vrkme.                  "被拆分DN销售单位
        item_data-sales_unit_iso     = <ls_lips>-meins.                  "被拆分DN基本单位
        item_data-fact_unit_nom      = <ls_lips>-umvkz.                  "销售数量转换成SKU的分子(因子)
        item_data-fact_unit_denom    = <ls_lips>-umvkn.                  "销售数量转换为 SKU 的值(分母)
    endloop.

打上修改标记(不加上,接口返回成功,但修改可能不生效)

    header_control中 DLV_BLOCK_FLG = 'X'
    item_control中 chg_delqty = 'X'

二、更新拣配数量+过账的接口WS_DELIVERY_UPDATE

填充入参

    loop at lt_item into ls_item.
        VBPOK_TAB-VBELN_VL  = lin_vbeln.
        VBPOK_TAB-POSNR_VL  = ls_item-POSNR.
        VBPOK_TAB-VBELN     = lin_vbeln.
        VBPOK_TAB-POSNN     = ls_item-POSNR.
        VBPOK_TAB-PIKMG     = ls_item-PIKMG. "拣配数量
        VBPOK_TAB-ndifm     = 0.
    endloop.

打上修改标记

  VBKOK_WA-KOMUE    = 'X'.      "交货数量 = 捡配数量。此处会将交货数量改为捡配数量。看需求启用
  VBKOK_WA-KZKODAT  = 'X'.      "Picking date
  VBKOK_WA-KODAT    = SY-DATUM. "Picking date  

  "设置自动过账
  VBKOK_WA-wadat_ist = SY-DATUM. "过账日期,此处可由用户传入
  VBKOK_WA-wabuc     = 'X'.

过账日期需要在账期内,否则会报错 “只能在公司代码 XXX 的期间 20xx/0x 和 20xx/0x 中过账”。

PS:可以用MMRV查看账期,参考链接 SAP报错:只能在公司代码xxxx的期间2020/08和2020/07中记账-CSDN博客

三、其他过账接口:

    BAPI_OUTB_DELIVERY_CONFIRM_DEC:对比 WS_DELIVERY_UPDATE,不能通过 wadat_ist 传入过账日期 且 根据网上说法 发货过账(vl02n)bapi 及冲销_修改vl02bapi-CSDN博客,过账后不能冲销 (需要写增强 或者 调用后写likp表字段vlstk,才能冲销)

返回的处理

读取返回信息列表中的错误信息,拼接即可。

LOOP AT lt_return INTO ls_return WHERE type = 'E'. 
      CLEAR: g_msg.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = ls_return-id
          msgnr               = ls_return-number
          msgv1               = ls_return-message_v1
          msgv2               = ls_return-message_v2
          msgv3               = ls_return-message_v3
          msgv4               = ls_return-message_v4
        IMPORTING
          MESSAGE_TEXT_OUTPUT = g_msg.
      return-errormsg = return-errormsg && g_msg && ';'.
      return-flag = 'E'.
ENDLOOP.

测试注意点

测试时,如果过账成功,可以在VL09中冲销。

后记

本次需求是已有交货单,根据传入的交货单号模拟前台 VL02N 的操作。

若只有销售单号,还未创建交货单,则需要调用 BAPI_OUTB_DELIVERY_CREATE_SLS 接口 先创建交货单(模拟VL01N的操作)。调用BAPI_OUTB_DELIVERY_CREATE_SLS时,可以从 vbap表 中获取 销售单的信息。