ABAP 拆批拣货交货bapi以及实例
使用函数
BAPI_OUTB_DELIVERY_CHANGE:拆批bapi
WS_DELIVERY_UPDATE:拣货函数
BAPI_OUTB_DELIVERY_CONFIRM_DEC:过账函数
样例
先做一个测试交货单
事务码:va01 创建销售订单
事务码:vl01n 生成交货单
交货单如下

盘盈两个批次
用于拆分上一个交货单的10个物料,这里简单分一下,
用migo盘盈 两个批次,分别为4个物料和6个物料

代码样例
这里的代码根据我造的数据写死的,只能作为样例参考
而且我将几个函数分开来写了,要用到线上,赋值基本都在一起,最后再连续调用三个函数
下面的代码可以直接用于测试
"批次拆分相关变量
DATA:
lit_header_partner LIKE TABLE OF bapidlvpartnerchg , "交货:合作伙伴更改
lit_header_deadlines LIKE TABLE OF bapidlvdeadln , "交货截止日期
lit_item_data LIKE TABLE OF bapiobdlvitemchg , "更改外向交货拣配数据项目等级
lit_item_control LIKE TABLE OF bapiobdlvitemctrlchg , "外向交货项目级别控制数据
lit_ret LIKE TABLE OF bapiret2 WITH HEADER LINE , "返回参数
lit_item_data_spl LIKE TABLE OF /spe/bapiobdlvitemchg , "更改向外交货拣配数据项目等级(SPE)
is_header_data LIKE bapiobdlvhdrchg , "更改外向交货拣配数据表头等级
is_header_control LIKE bapiobdlvhdrctrlchg , "外向交货标题级别控制数据
iv_delivery LIKE bapiobdlvhdrchg-deliv_numb . "交货
DATA:
lwa_header_partner LIKE bapidlvpartnerchg , "交货:合作伙伴更改
lwa_header_deadlines LIKE bapidlvdeadln , "交货截止日期
lwa_item_data LIKE bapiobdlvitemchg , "更改外向交货拣配数据项目等级
lwa_item_control LIKE bapiobdlvitemctrlchg , "外向交货项目级别控制数据
lwa_item_data_spl LIKE /spe/bapiobdlvitemchg,
lwa_cwm_item_data LIKE /cwm/bapiobdlvitem,
lwa_return LIKE bapiret2 . "返回参数
DATA: l_msg TYPE string.
PARAMETERS p_vbeln TYPE vbeln_vl DEFAULT '80000284'.
iv_delivery = p_vbeln. "交货单号
SELECT * FROM lips INTO TABLE @DATA(lt_lips) WHERE vbeln = @p_vbeln.
READ TABLE lt_lips INTO DATA(ls_lips) INDEX 1.
"头信息
is_header_data-deliv_numb = p_vbeln. "交货单号
is_header_control-deliv_numb = p_vbeln.
"修改原10行项目数量
CLEAR lwa_item_data.
lwa_item_data-deliv_numb = p_vbeln.
lwa_item_data-deliv_item = '10'. "原行项目
lwa_item_data-dlv_qty = '0'.
lwa_item_data-dlv_qty_imunit = '1'.
lwa_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(除数)
lwa_item_data-base_uom = ls_lips-meins. "基本单位
lwa_item_data-sales_unit = ls_lips-vrkme. "销售单位
APPEND lwa_item_data TO lit_item_data .
CLEAR lwa_item_control.
lwa_item_control-deliv_numb = p_vbeln.
lwa_item_control-deliv_item = '10'. "原行项目
lwa_item_control-chg_delqty = 'X'. "数量修改标志
APPEND lwa_item_control TO lit_item_control.
"新拆分的批次
CLEAR lwa_item_data.
lwa_item_data-deliv_numb = p_vbeln.
lwa_item_data-deliv_item = '900001'. "拆分后的新行项目
lwa_item_data-hieraritem = '10'. "上级行项目
lwa_item_data-batch = '2300000001'. "新批次
lwa_item_data-dlv_qty = '4'. "自己重新计算拆分后的数量,
lwa_item_data-dlv_qty_imunit = '4'.
lwa_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(除数)
lwa_item_data-base_uom = ls_lips-meins. "基本单位
lwa_item_data-sales_unit = ls_lips-vrkme. "销售单位
lwa_item_data-usehieritm = '1'.
APPEND lwa_item_data TO lit_item_data.
CLEAR lwa_item_data.
lwa_item_data-deliv_numb = p_vbeln.
lwa_item_data-deliv_item = '900002'. "拆分后的新行项目
lwa_item_data-hieraritem = '10'. "上级行项目
lwa_item_data-batch = '2300000002'."新批次
lwa_item_data-dlv_qty = '6'.
lwa_item_data-dlv_qty_imunit = '6'.
lwa_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(除数)
lwa_item_data-base_uom = ls_lips-meins. "基本单位
lwa_item_data-sales_unit = ls_lips-vrkme. "销售单位
lwa_item_data-usehieritm = '1'.
APPEND lwa_item_data TO lit_item_data.
CLEAR lwa_item_control.
lwa_item_control-deliv_numb = p_vbeln.
lwa_item_control-deliv_item = '900001'. "拆分后的新行项目
lwa_item_control-chg_delqty = 'X'. "数量修改标志
APPEND lwa_item_control TO lit_item_control .
CLEAR lwa_item_control.
lwa_item_control-deliv_numb = p_vbeln.
lwa_item_control-deliv_item = '900002'."拆分后的新行项目
lwa_item_control-chg_delqty = 'X'. "数量修改标志
APPEND lwa_item_control TO lit_item_control .
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = is_header_data
header_control = is_header_control
delivery = iv_delivery
TABLES
header_partner = lit_header_partner
header_deadlines = lit_header_deadlines
item_data = lit_item_data
item_control = lit_item_control
item_data_spl = lit_item_data_spl
return = lit_ret.
IF lit_ret[] IS INITIAL.
COMMIT WORK AND WAIT.
ENDIF.
LOOP AT lit_ret WHERE type = 'E'.
CLEAR l_msg.
MESSAGE ID lit_ret-id
TYPE 'E'
NUMBER lit_ret-number
WITH lit_ret-message_v1
lit_ret-message_v2
lit_ret-message_v3
lit_ret-message_v4
INTO l_msg.
WRITE:/ l_msg.
ENDLOOP.
"拣货相关变量
DATA: ls_vbkok TYPE vbkok.
DATA: lt_vbkok TYPE STANDARD TABLE OF vbkok.
DATA: lt_prott TYPE STANDARD TABLE OF prott.
DATA: ls_prott TYPE prott.
DATA: lt_vbpok TYPE STANDARD TABLE OF vbpok.
DATA: ls_vbpok TYPE vbpok.
DATA: lv_flag TYPE char01.
DATA: lv_message TYPE string.
DATA: lv_all_message TYPE string.
ls_vbkok-vbeln_vl = p_vbeln.
ls_vbkok-komue = 'X'. "交货数量 = 捡配数量
ls_vbkok-kzkodat = 'X'. "Picking date
ls_vbkok-kodat = sy-datum. "Picking date
CLEAR ls_vbpok.
ls_vbpok-vbeln_vl = p_vbeln.
ls_vbpok-posnr_vl = '900001'.
ls_vbpok-vbeln = '1000000111'. " 交货单对应的销售单
ls_vbpok-posnn = '10'. " 销售单的行项目
ls_vbpok-pikmg = '4'. " 拣货数量
ls_vbpok-vrkme = ls_lips-meins.
APPEND ls_vbpok TO lt_vbpok.
CLEAR ls_vbpok.
ls_vbpok-vbeln_vl = p_vbeln.
ls_vbpok-posnr_vl = '900002'.
ls_vbpok-vbeln = '1000000111'. " 交货单对应的销售单
ls_vbpok-posnn = '10'. " 销售单的行项目
ls_vbpok-pikmg = '6'. " 拣货数量
ls_vbpok-vrkme = ls_lips-meins.
APPEND ls_vbpok TO lt_vbpok.
"拣货
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
vbkok_wa = ls_vbkok
delivery = p_vbeln
update_picking = 'X'
synchron = 'X'
nicht_sperren = 'X' "L.S Inserted
TABLES
vbpok_tab = lt_vbpok
prot = lt_prott
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF sy-subrc = 0 .
LOOP AT lt_prott INTO ls_prott WHERE msgty CA 'EAX'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_prott-msgid
msgnr = ls_prott-msgno
msgv1 = ls_prott-msgv1
msgv2 = ls_prott-msgv2
msgv3 = ls_prott-msgv3
msgv4 = ls_prott-msgv4
IMPORTING
message_text_output = lv_message.
CONCATENATE lv_all_message lv_message INTO lv_all_message .
lv_message = lv_all_message.
lv_flag = 'X' .
CLEAR ls_prott.
ENDLOOP.
ELSE.
CLEAR lv_message.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = lv_all_message.
lv_message = lv_all_message.
lv_flag = 'X' .
ENDIF .
IF lv_flag IS INITIAL .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
"过账发货相关函数
DATA:
lv_vbeln TYPE bapiobdlvhdrcon-deliv_numb,
ls_header_data LIKE bapiobdlvhdrcon,
ls_header_control LIKE bapiobdlvhdrctrlcon,
lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE.
DATA:
es_emkpf TYPE emkpf,
t_mesg LIKE TABLE OF mesg WITH HEADER LINE.
DATA:
lt_header_deadlines LIKE TABLE OF bapidlvdeadln WITH HEADER LINE, "交货截止日期
lt_item_data LIKE TABLE OF bapiobdlvitemcon WITH HEADER LINE, "交货单项目
lt_item_control LIKE TABLE OF bapiobdlvitemctrlcon WITH HEADER LINE, "交货单项目控制数据
lt_item_data_spl LIKE TABLE OF /spe/bapiobdlvitemconf WITH HEADER LINE, "库存地点
lt_handle_unit_header LIKE TABLE OF bapidlvhdunhdr WITH HEADER LINE. "工厂
"交货单过账抬头数据
lv_vbeln = p_vbeln.
ls_header_data-deliv_numb = p_vbeln.
ls_header_control-deliv_numb = p_vbeln.
ls_header_control-post_gi_flg = 'X'. "自动过账货物移动
lt_header_deadlines-deliv_numb = p_vbeln.
lt_header_deadlines-timezone = sy-zonlo. "当前用户所在时区
CONVERT DATE sy-datum "过账日期
INTO TIME STAMP lt_header_deadlines-timestamp_utc TIME ZONE lt_header_deadlines-timezone.
APPEND lt_header_deadlines.
CLEAR lt_item_data.
lt_item_data-deliv_numb = p_vbeln. "交货单号
lt_item_data-deliv_item = '900001'. "交货单项目号
lt_item_data-dlv_qty = '4'. "实际交货数量
* 数量转换,类似500毫升可乐转换为1瓶可乐
lt_item_data-fact_unit_nom = 1.
lt_item_data-fact_unit_denom = 1.
APPEND lt_item_data.
CLEAR lt_item_control.
lt_item_control-deliv_numb = p_vbeln.
lt_item_control-deliv_item = '900001'.
lt_item_control-chg_delqty = 'X'. "允许修改交货数量
lt_item_control-volume_flg = 'X'. "量的确认
APPEND lt_item_control.
CLEAR lt_item_data_spl.
lt_item_data_spl-deliv_numb = p_vbeln.
lt_item_data_spl-deliv_item = '900001'.
lt_item_data_spl-stge_loc = '3001'. "库存地点
APPEND lt_item_data_spl.
CLEAR lt_item_data.
lt_item_data-deliv_numb = p_vbeln. "交货单号
lt_item_data-deliv_item = '900002'. "交货单项目号
lt_item_data-dlv_qty = '6'. "实际交货数量
* 数量转换,类似500毫升可乐转换为1瓶可乐
lt_item_data-fact_unit_nom = 1.
lt_item_data-fact_unit_denom = 1.
APPEND lt_item_data.
CLEAR lt_item_control.
lt_item_control-deliv_numb = p_vbeln.
lt_item_control-deliv_item = '900002'.
lt_item_control-chg_delqty = 'X'. "允许修改交货数量
lt_item_control-volume_flg = 'X'. "量的确认
APPEND lt_item_control.
CLEAR lt_item_data_spl.
lt_item_data_spl-deliv_numb = p_vbeln.
lt_item_data_spl-deliv_item = '900002'.
lt_item_data_spl-stge_loc = '3001'. "库存地点
APPEND lt_item_data_spl.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC' "交货单过账
EXPORTING
header_data = ls_header_data
header_control = ls_header_control
delivery = lv_vbeln
TABLES
header_deadlines = lt_header_deadlines
item_data = lt_item_data
item_control = lt_item_control
item_data_spl = lt_item_data_spl
return = lt_return.
LOOP AT lt_return WHERE type CA 'AEX'.
MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number INTO DATA(msg)
WITH lt_return-message_v1 lt_return-message_v2 lt_return-message_v3 lt_return-message_v4.
l_msg = msg && '!' && l_msg.
ENDLOOP.
IF l_msg = ''.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
代码执行结果
如图可以看到,该交货单已经拆批完成,从两个批次进行交货,并且完成相应拣货以及过账发货

ABAP 拆批拣货交货bapi以及实例的更多相关文章
- 销售订单、外向交货单、交货 bapi
转自[http://www.cnblogs.com/elegantok/archive/2009/10/18/1585398.html]***********SALES ORDER INPUT CRE ...
- 挂sqlserver计划,系统自动分配拣货任务
USE [P2WMS_WH43] GO /****** Object: StoredProcedure [dbo].[sp_fru_CalcAllocatePickData] Script Date: ...
- Super超级ERP系统---(9)订单管理--订单拣货
订单审核完成后,库房就可以开始备货,安排相应的人员去拣货了.订单拣货主要分为一次分拣和二次分拣,这里我们先看下一次分拣的流程.一次分拣就是根据订单去拣货,可以简单的理解为拿着一个订单,推着购物车,把当 ...
- [SAP ABAP开发技术总结]业务对象和BAPI
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- SAP 参照sto订单创建外向交货BAPI
DATA: SHIP_POINT TYPE TVST-VSTEL, "装运点/接收点 NUM_DELIVERIES TYPE VBNUM, STOCK_TRANS_ITEMS WITH HE ...
- 收货确定 BAPI BAPI_GOODSMVT_CREATE
CLEAR gmhead. gmhead-pstng_date = ls_table-gzdate."sy-datum . gmhead-doc_date = sy-datu ...
- SAP交货单过账自动生产采购订单、采购订单自动收货入库
公司间需要买卖操作,由于发货和收货都是同一批人在操作,为了减少业务人员的工作量,提高工作效率,特实现以上功能 1.增强实现:增强点为交货单过账成功时触发,在提交前触发,如果遇到不可预知问题,可能造成数 ...
- .NET面试题解析(02)-拆箱与装箱
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 装箱和拆箱几乎是所有面试题中必考之一,看上去简单,就往往容易被忽视.其实它一点都不简单的,一个简单的问题也 ...
- 转 C# 装箱和拆箱[整理]
1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...
- C# 装箱与拆箱
知识点 值类型. 值类型是在栈中分配内存,在声明时初始化才能使用,不能为null. 值类型超出作用范围系统自动释放内存. 主要由两类组成:结构,枚举(enum),结构分为以下几类: ...
随机推荐
- 本机无法配置远程服务器上的MySQL ODBC连接驱动
1.问题描述 我想要访问远程windows服务器上的MySQL数据库,因此需要在本地ODBC驱动上配好远程服务器的MySQL.但配置好基本信息后,测试的时候出现如下问题: 2.解决方法 之所以产生这种 ...
- Redis-02 Redis 类型
Redis List 命令 说明 例子 LPush 在 List 头插入一个或多个元素 LPush mylist hello RPush 在 List 尾插入一个或多个元素 RPush mylist ...
- vulnhub靶场之IA: KEYRING (1.0.1)
准备: 攻击机:虚拟机kali.本机win10. 靶机:IA: KEYRING (1.0.1),下载地址:https://download.vulnhub.com/ia/keyring-v1.01.o ...
- js取不到iframe元素
跨域 iframe 请绕道,下文是针对非跨域 iframe 的问题排除 1.iframe 取不到值的问题的原因 1. 父页面未加载完成 2. iframe 未加载完成 3. 语法使用错误 4. 跨域( ...
- JavaScript 图像压缩
JavaScript 可以使用类似于 canvas 和 web workers 来实现图像压缩. 使用 canvas,可以将图像绘制到 canvas 上,然后使用 canvas 提供的 toBlob( ...
- hashlib加密、subprocess、logging日志模块
1.hashlib加密模块 1.加密:将明文数据处理成密文数据,让人无法看懂 2.为什么加密:保证数据的安全 3.如何判断数据是否加密:如果是一长串没有规律的字符串(数字.字母.符号)那么数据被加密 ...
- Python 发展趋势:与 Rust 深度融合、更易于编写 Web 应用
大家好,我是猫哥,好久不见!2022 年末的时候,我不可避免地阳了,借着身体不舒服就停更了,接踵而至的是元旦和春节假期,又给自己放了假,连年终总结也鸽了,一懈怠就到了 2 月中旬-- 现在是我家娃出生 ...
- Vue27 scoped样式
https://www.jianshu.com/p/d80383251fc5 1 简介 当我们在组件中写样式,vue最后会把所有样式合在一起,如果样式名称重复的话就会有问题 style标签上加scop ...
- springboot返回数据null参数设为空字符串或空数组
package com.ruoyi.framework.config.ResponseVoConfig.WebConfig; /** * @Classname MyJsonMapper * @Desc ...
- mysql14 sql优化-索引失效
1.索引失效 先创建符合索引,三个字段 ALTER table abilityassessrecord add INDEX idx_customerno_roomno_abilityassessrec ...