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),结构分为以下几类: ...
随机推荐
- yolov5数据集制作 数据集分割+voc格式转txt格式代码
先上数据集分割代码 网上没找到合适的 自己写了一个 分割比例为0.6 :0.2 :0.2 import os import random oriImgDir = "./change14img ...
- 一文详解RocketMQ的存储模型
摘要:RocketMQ 优异的性能表现,必然绕不开其优秀的存储模型. 本文分享自华为云社区<终于弄明白了 RocketMQ 的存储模型>,作者:勇哥java实战分享. RocketMQ 优 ...
- 道长的算法笔记:KMP算法及其各种变体
(一)如何优化暴力算法 Waiting... (二)KMP模板 KMP 算法的精髓在于 \(next\) 数组,\(next[i]=j\) 代表 \(p[1,j]=p[i-j+1,i]\),\(nex ...
- python之路32 网络并发线程方法 线程池 协程
多进程实现TCP服务端并发 服务端: import socket from multiprocessing import Process def get_server(): server = sock ...
- [C++]模版特例化和模版偏特化
函数模版特例化 例子: //第一个版本;可以比较任意两个类型 template<typename T> int compare(const &T,const T&); // ...
- 【深入浅出Seata原理及实战】「入门基础专题」带你透析认识Seata分布式事务服务的原理和流程(1)
分布式事务的背景 随着业务的不断发展,单体架构已经无法满足我们的需求,分布式微服务架构逐渐成为大型互联网平台的首选,但所有使用分布式微服务架构的应用都必须面临一个十分棘手的问题,那就是"分布 ...
- Postman实现UI自动化测试
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/1db4fa44.html 你好,我是测试蔡坨坨. 看到这篇文章的标题,是不是有小伙伴会感到惊讶呢? Postman不是做接口 ...
- 洛谷P3654 First Step题解
这是一道暴力枚举. 大致题意:R行C列的棋盘要放下长度为K的线段,"#"表示无法放置,问有多少种放置方法. 直接贴代码: #include<bits/stdc++.h> ...
- Hive删除分区名称中含有特殊字符
先说方案:通过show partitions和hdfs url看到的都不是真正的分区名称,都是经过URI重新编码的,访问这些分区应该使用分区名称的原始字符串. 场景描述 当我们在SQL语句中使用变量时 ...
- 登山(等级考试4级 测试卷 T1)
这道题目与 重启系统(等级考试4级 2021-03 T4)重启系统(等级考试4级 2021-03 T4) - 王浩泽 - 博客园 (cnblogs.com) 非常相似,于是乎呢就在这个程序上面改一改就 ...