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),结构分为以下几类: ... 
随机推荐
- 低版本客户端连接高版本数据库报错ORA-28040、ORA-01017
			测试环境: 客户端:Oracle 11.2.0.1 服务端:Oracle 19.16 测试过程: 1.低版本客户端连接高版本数据库报错ORA-28040 2.低版本客户端连接高版本数据库报错ORA-0 ... 
- ActiveMQ 常见集群模式
			Master Slave 架构模式 这种模式是基于文件共享锁的高可用集群,个人理解其实是一种 Failover 模式,可以是一主一从,也可以是一主两从. 本文使用 Docker 搭建一个主从模式的 A ... 
- FalseSharing-伪共享
			1.CPU缓存 要了解什么是伪共享,首先得了解CPU缓存架构与缓存行的知识 (1)<CPU缓存架构> 主内存RAM是数据存在的地方,CPU和主内存之间有好几级缓存,因为即使直接访问主内存相 ... 
- ionic+vue+capacitor系列笔记--手机从安卓10升级到安卓11以后,之前的代码不管用了,无法跳转其他应用
			之前手机是安卓10版本,没什么问题,升级以后,手机出现了一些异常,发现原来代码里写的跳转功能,无法使用了哦~~脑壳痛 解决方案 本项目:build.gradle targetSdkVersion 30 ... 
- 高并发环境下3种方式优化Tomcat性能
			摘要:Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? 本文分享自华为云社区<[高并发 ... 
- win32com操作word API精讲 第十集 Paragraphs & Paragraph接口 (一)
			本课程<win32com操作word API精讲&项目实战>以视频为主,文字为辅,公众号ID:一灯编程 在word编程中,Range和Paragraph(s)接口无愧于劳模接口的称 ... 
- 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(5)-Charles如何设置捕获Https会话
			1.简介 在大数据时代,互联网时代,个人信息安全尤为重要,网络安全在近日多起电信诈骗事情发酵下的情况下,引起国家,企业,个人对于互联网安全进一步的重视.而之前很多以http协议传输的网站出现的网站信息 ... 
- Java JDK1.5: 泛型 新特性的讲解说明
			Java JDK1.5: 泛型 新特性的讲解说明 每博一文案 听到过这样一句话:"三观没有标准.在乌鸦的世界里,天鹅也有罪." 环境.阅历的不同,造就了每个人独有的世界观.人生观. ... 
- 快速实现一个简单阉割版的HashMap
			简单实现一个底层数据结构为数组 + 链表的HashMap,不考虑链表长度超过8个时变为红黑树的情况. 1.示例图 2.分析需求 put数据时: key值hash后的索引处没有元素,需要创建链表头节点, ... 
- P31_全局配置 - window - 设置上拉触底的距离
			window 设置上拉触底的距离 概念:上拉触底是移动端的专有名词,通过手指在屏幕上的上拉滑动操作,从而加载更多数据的行为. 设置步骤: app.json -> window -> 为 o ... 
