news 2026/5/1 11:03:01

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/4/30 20:50:18

Chain33 Orderbook:去中心化订单簿的创新架构与实现

随着区块链技术的不断发展&#xff0c;去中心化交易&#xff08;DEX&#xff09;已成为Web3领域的重要基础设施。它们消除了中介&#xff0c;让用户真正掌控资产&#xff0c;实现了"你的资产&#xff0c;你做主"的Web3原生承诺。 然而&#xff0c;现有的DEX模式仍面临…

作者头像 李华
网站建设 2026/5/1 6:16:07

基于混合模型磁链观测器实现异步电机感应电机矢量控制及仿真验证

基于混合模型磁链观测器的异步电机/感应电机矢量控制混合模型磁链观测器集合了电压模型和电流模型磁链观测器的优势&#xff0c;实现在全速范围内较为准确地观测转子磁链。 仿真验证了混合模型磁链观测器的优越性。异步电机矢量控制的核心在于转子磁链的准确观测。传统方案要么…

作者头像 李华
网站建设 2026/4/19 2:31:48

全面解析Halar®涂层在化工设备中的应用与优势

化学工程师在反应釜前停下脚步&#xff0c;手指轻轻划过光滑的金属表面——这里曾是他们最头疼的腐蚀高发区&#xff0c;强酸强碱的长期侵蚀让设备寿命大幅缩短&#xff0c;维护成本居高不下。如今&#xff0c;一层厚度不足毫米的Halar涂层彻底改变了这一局面。 01 核心技术Hal…

作者头像 李华
网站建设 2026/5/1 8:55:37

Halar涂层在离心机领域的应用:防腐与性能的双重突破

在化工、制药、食品等行业的物料分离过程中&#xff0c;离心机是关键设备之一。而设备的防腐、耐蚀性能直接决定了分离效率、物料纯度与设备使用寿命。Halar&#xff08;ECTFE&#xff09;涂层的出现&#xff0c;为离心机行业带来了革命性的材料解决方案&#xff0c;其在防腐、…

作者头像 李华
网站建设 2026/5/1 7:23:29

Wordpress如何调整区块高度与宽度

在 WordPress 的区块编辑器&#xff08;Gutenberg&#xff09;中&#xff0c;默认情况下每个区块会根据内容自动适应大小。但在实际设计中&#xff0c;我们经常需要手动调整区块的高度与宽度&#xff0c;以更好地控制页面排版。例如&#xff0c;您可能希望某段文本占据整行&…

作者头像 李华
网站建设 2026/5/1 5:03:54

BM25, TF-IDF, Faiss-based methods

在深度学习&#xff08;Deep Learning&#xff09;和 BERT 大行其道之前&#xff0c;它们统治了信息检索&#xff08;Information Retrieval, IR&#xff09;领域几十年。1. TF-IDF&#xff1a;统计学的直觉全称&#xff1a; Term Frequency - Inverse Document Frequency&…

作者头像 李华