news 2026/6/10 1:09:54

SAP ABAP拆分交货单数量、批次、存储地点 并过账

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SAP ABAP拆分交货单数量、批次、存储地点 并过账

案例:将交货单数量拆分到不同批次,一个批次下数量为1,并进行过账。

发布时间:20251218

  1. 主要逻辑分为两个部分:
    拆分和过账,拆分批次时必须写入存储位置,否则过账可能会报错(eg:存储地点不是为交货项目900001确定的)。

  2. 直接上源码,复制可用:

REPORT zmm_rpt_538_wu5. TABLES:lips. TYPES: BEGIN OF ty_charg, charg TYPE charg, END OF ty_charg, tt_charg TYPE STANDARD TABLE OF ty_charg. DATA:lt_charg TYPE tt_charg, lt_item_data1 LIKE TABLE OF bapiobdlvitemchg. PARAMETERS:p_vbeln TYPE vbeln. SELECT-OPTIONS:r_charg FOR lips-charg NO INTERVALS. START-OF-SELECTION. LOOP AT r_charg ASSIGNING FIELD-SYMBOL(<lfs_charg>). APPEND VALUE #( charg = <lfs_charg>-low ) TO lt_charg. ENDLOOP. PERFORM frm_main USING p_vbeln lt_charg. FORM frm_main USING pv_vbeln TYPE vbeln pt_charg TYPE tt_charg. DATA:lv_lgort TYPE lgort_d VALUE '9008', lv_err TYPE char1. "拆分批次,数量,写入库存地点 PERFORM frm_split_batch USING pv_vbeln lv_lgort pt_charg CHANGING lv_err . "拆分失败不继续过账 CHECK lv_err <> 'E'. "交货过账 PERFORM frm_goods_move USING pv_vbeln. ENDFORM. FORM frm_split_batch USING pv_vbeln TYPE vbeln pv_lgort TYPE lgort_d pt_charg TYPE tt_charg CHANGING pv_err TYPE char1. DATA: ls_lips TYPE lips, ls_header_data LIKE bapiobdlvhdrchg, lt_item_control LIKE TABLE OF bapiobdlvitemctrlchg, ls_item_control LIKE bapiobdlvitemctrlchg, ls_header_control LIKE bapiobdlvhdrctrlchg, ls_item_data LIKE bapiobdlvitemchg, lt_item_data LIKE TABLE OF bapiobdlvitemchg, ls_item_spl LIKE /spe/bapiobdlvitemchg, lt_item_spl LIKE TABLE OF /spe/bapiobdlvitemchg, lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE. DATA: lv_newitem TYPE posnr_vl, lv_msg TYPE string. DATA:lv_posnr TYPE posnr VALUE '000010'. "本例只对一行项目进行了拆分演示(一个批次数量为1),如有多行需要拆分,可循环所有行项目一行一行单独进行拆分 SELECT SINGLE * FROM lips WHERE vbeln = @pv_vbeln AND posnr = '000010' INTO @ls_lips. IF lines( pt_charg ) <> ls_lips-lfimg. pv_err = 'E'. MESSAGE '批次号数量与带拆分数不一致' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. lv_newitem = '900000'. "Header ls_header_data-deliv_numb = pv_vbeln. ls_header_control-deliv_numb = pv_vbeln. "Set Mofify flag CLEAR ls_item_control. ls_item_control-deliv_numb = pv_vbeln. "被拆分交货单号 ls_item_control-deliv_item = lv_posnr. "被拆分交货单行项目号 ls_item_control-chg_delqty = 'X'. "数量修改标志 APPEND ls_item_control TO lt_item_control. ls_item_data-deliv_numb = ls_lips-vbeln. "交货单号 ls_item_data-deliv_item = ls_lips-posnr. "交货单行项目号 ls_item_data-sales_unit = ls_lips-vrkme. "销售单位 ls_item_data-sales_unit_iso = ls_lips-meins. "基本单位 ls_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子) ls_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(分母) IF strlen( ls_lips-matnr ) <= 18. ls_item_data-material = ls_lips-matnr. "物料号 ELSE. ls_item_data-material_external = ls_lips-matnr. ls_item_data-material_long = ls_lips-matnr. ENDIF. APPEND ls_item_data TO lt_item_data. APPEND ls_item_data TO lt_item_data1. CLEAR: ls_item_spl. ls_item_spl-deliv_numb = ls_lips-vbeln. ls_item_spl-deliv_item = ls_lips-posnr. ls_item_spl-stge_loc = pv_lgort. "库存地点 APPEND ls_item_spl TO lt_item_spl. LOOP AT pt_charg ASSIGNING FIELD-SYMBOL(<lfs_charg>). CLEAR: ls_item_data. lv_newitem = lv_newitem + 1. ls_item_data-deliv_numb = pv_vbeln. "交货单号 ls_item_data-deliv_item = lv_newitem. "拆分后的新行项目号 IF strlen( ls_lips-matnr ) <= 18. ls_item_data-material = ls_lips-matnr. "物料号 ELSE. ls_item_data-material_external = ls_lips-matnr. ls_item_data-material_long = ls_lips-matnr. ENDIF. ls_item_data-hieraritem = lv_posnr. "上级行项目/被拆分的行项目 ls_item_data-batch = <lfs_charg>-charg. "新批次号 ls_item_data-dlv_qty = 1. "新Item销售单位数量都为1 ls_item_data-sales_unit = ls_lips-vrkme. "新Item销售单位 ls_item_data-sales_unit_iso = ls_lips-meins. "新Item基本单位 ls_item_data-fact_unit_nom = ls_lips-umvkz. "销售数量转换成SKU的分子(因子) ls_item_data-fact_unit_denom = ls_lips-umvkn. "销售数量转换为 SKU 的值(分母) ls_item_data-usehieritm = '1'. "子项标记 APPEND ls_item_data TO lt_item_data. APPEND ls_item_data TO lt_item_data1. CLEAR: ls_item_spl. ls_item_spl-deliv_numb = ls_lips-vbeln. ls_item_spl-deliv_item = lv_newitem. ls_item_spl-stge_loc = pv_lgort. "库存地点 APPEND ls_item_spl TO lt_item_spl. ENDLOOP. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE' EXPORTING header_data = ls_header_data header_control = ls_header_control delivery = p_vbeln TABLES item_data = lt_item_data item_data_spl = lt_item_spl item_control = lt_item_control return = lt_return. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT lt_return ASSIGNING FIELD-SYMBOL(<lfs_return>) WHERE type CA 'EAX'. CALL FUNCTION 'MESSAGE_TEXT_BUILD' EXPORTING msgid = <lfs_return>-id msgnr = <lfs_return>-number msgv1 = <lfs_return>-message_v1 msgv2 = <lfs_return>-message_v2 msgv3 = <lfs_return>-message_v3 msgv4 = <lfs_return>-message_v4 IMPORTING message_text_output = lv_msg. MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDLOOP. pv_err = 'E'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. ENDFORM. FORM frm_goods_move USING pv_vbeln TYPE vbeln. DATA: l_vbkok TYPE vbkok, ls_vbpok TYPE vbpok, lt_vbpok TYPE STANDARD TABLE OF vbpok, lt_prott TYPE STANDARD TABLE OF prott, lv_message TYPE string. "获取交货单信息 SELECT * INTO TABLE @DATA(lt_new_lips) FROM lips WHERE vbeln EQ @pv_vbeln. SORT lt_new_lips BY posnr. l_vbkok-vbeln_vl = pv_vbeln. "<-- fill this field with your delivery number l_vbkok-wabuc = 'X'. LOOP AT lt_new_lips INTO DATA(ls_new_lips) . ls_vbpok-vbeln_vl = ls_new_lips-vbeln. ls_vbpok-posnr_vl = ls_new_lips-posnr. ls_vbpok-vbeln = ls_new_lips-vgbel. ls_vbpok-posnn = ls_new_lips-vgpos. ls_vbpok-pikmg = ls_new_lips-lfimg. APPEND ls_vbpok TO lt_vbpok. ENDLOOP . "交货过账 CALL FUNCTION 'WS_DELIVERY_UPDATE' EXPORTING vbkok_wa = l_vbkok synchron = 'X' no_messages_update = ' ' update_picking = 'X' commit = 'X' delivery = pv_vbeln nicht_sperren = 'X' TABLES vbpok_tab = lt_vbpok prot = lt_prott EXCEPTIONS ef_error_any_0 = 1 ef_error_in_item_deletion_0 = 2 ef_error_in_pod_update_0 = 3 ef_error_in_interface_0 = 4 ef_error_in_goods_issue_0 = 5 ef_error_in_final_check_0 = 6 ef_error_partner_update = 7 ef_error_sernr_update = 8 error_message = 9 OTHERS = 10. IF sy-subrc = 0 . LOOP AT lt_prott ASSIGNING FIELD-SYMBOL(<lfs_prott>) WHERE msgty CA 'EAX'.. CALL FUNCTION 'MESSAGE_TEXT_BUILD' EXPORTING msgid = <lfs_prott>-msgid msgnr = <lfs_prott>-msgno msgv1 = <lfs_prott>-msgv1 msgv2 = <lfs_prott>-msgv2 msgv3 = <lfs_prott>-msgv3 msgv4 = <lfs_prott>-msgv4 IMPORTING message_text_output = lv_message. ENDLOOP. ELSE. 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_message. ENDIF . MESSAGE lv_message TYPE 'S' DISPLAY LIKE 'E'. ENDFORM.
  1. 看一下执行效果:
    选择画面输入交货单号和批次号

    执行后,查看交货单,可以看到,拆分并过账成功。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 20:21:06

VT五轴仿真模型与DMU五轴VT机床仿真模型:一键导入,轻松仿真

VT五轴仿真模型&#xff0c;DMU五轴VT机床仿真模型&#xff0c;全部搭建设置好的&#xff0c;编程软件一键导入即可仿真。五轴加工仿真这玩意儿吧&#xff0c;说难不难说简单也不简单。我去年在车间调试五轴程序的时候&#xff0c;三天两头被老板骂撞刀。后来搞到一套现成的VT仿…

作者头像 李华
网站建设 2026/6/9 23:54:27

SpringBoot 整合 RabbitMQ 最简案例:注解驱动的生产者与消费者开发

RabbitMQ 作为一款高性能的消息中间件&#xff0c;被广泛应用于微服务架构中的异步通信、解耦、削峰填谷等场景。而 SpringBoot 凭借其 “约定优于配置” 的特性&#xff0c;极大简化了与 RabbitMQ 的整合过程。本文将通过注解驱动的方式&#xff0c;实现一个最简的 SpringBoot…

作者头像 李华
网站建设 2026/6/9 23:18:59

RAG实践技巧:这次还做不好AI客服,那我也没办法了...

就近两年的实践经验&#xff0c;各个公司最常见的AI需求有以下四类&#xff1a; 一、工作流类AI 这个可以解决很多确实的问题&#xff0c;但AI含量很低&#xff0c;不到20%&#xff08;通常10%左右&#xff09;&#xff1a;二、简单AI知识库-AI客服 这是最常用也是公司体系真正…

作者头像 李华
网站建设 2026/6/9 11:41:24

Vue.js前端框架技术课程总结知识点

前言 Vue.js 是前端领域最适合新手入门的框架之一&#xff01;它以简单易学、渐进式集成、数据驱动视图为核心特点&#xff0c;不用一次性掌握所有知识点&#xff0c;就能快速开发小型项目。本文专为零基础 / 入门级开发者整理&#xff0c;用通俗的语言、完整的代码示例&#…

作者头像 李华