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),结构分为以下几类: ...
随机推荐
- screenfetch—最炫酷的查看你的设备信息
screenfetch是一个很方便的并且很炫酷的一个程序,它可以做到很炫酷的输出你想要看到的系统信息. 只需要短短一行命令,就可以快速的安装上它.! 并且可以直观的显示出来,当前设备的信息.
- 浅谈Java并发
Java并发是比较难的知识点,难于对并发的理解.并发要从操作系统和硬件层面去理解,才会比较深入,而不单单是从编程语言的逻辑去理解. 首先对于并发要清楚的几点: 线程可能在任何时刻被切换.计算机只对硬件 ...
- [常用工具] cvat安装与使用指北
cvat是一个非常好用的标注工具,但是也是非常难以安装的标注工具,所以本文简单讲一讲如何安装与使用cvat.cvat最好在ubuntu18.04安装,windows平台安装难度很大,然后在其他平台使用 ...
- 数据库日志——binlog、redo log、undo log扫盲
日志是数据库中比较重要的组成部分,很多核心的功能必须依靠日志才能完成. 该篇文章简要介绍了binlog.redo log与undo log,能够在一定程度上拓宽对mysql日志的整体认识. binlo ...
- (10)go-micro微服务发送邮件
目录 一 获取QQ邮箱Pass 二 安装gomail 三 初始化发送邮件 四 发送注册邮件 五 发送重置密码邮件 六 最后 一 获取QQ邮箱Pass 1.登录QQ邮箱 2.点击设置,点击账户,下拉找到 ...
- C艹 里 printf 和 cout 的区别总结
1. printf里面打出%需要连着打出两次 打出一次默认为格式标识符 打出两次: 2. 当 未完待续
- IDEA必备插件、阿里巴巴规范插件(代码格式化,注释模板化)的安装及使用和快捷键设置
背景:记录下idea的配置,换电脑方便直接配置这些信息 第一步:安装必备插件如下 英文直接翻译就是插件的作用,大部分不用额外配置,Adapter for Eclipse Code Formatter是 ...
- 【随笔记】NDK 编译开源库 ffmpeg
一.下载源代码 wget http://ffmpeg.org/releases/ffmpeg-4.4.tar.gz tar -zxvf ffmpeg-4.4.tar.gz 二.编译配置脚本 #! /b ...
- 如何在阿里云服务器搭建flask
下载flask不用我多说了,pip3 install flask 今天在阿里云的服务器上测试一个Flask程序,命名指定了 ip:0.0.0.0,port:5000,但是外网IP确怎么也访问不了网页 ...
- socket模块实现网络编程及struct模块解决黏包问题
目录 一.socket模块 1.简介 2.基于文件类型的套接字家族 3.基于网络类型的套接字家族 二.socket代码简介 三.socket代码优化 1.聊天内容自定义 2.让聊天循环起来 3.用户输 ...