需求描述
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表 中获取 销售单的信息。