news 2026/8/14 12:56:44

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/8/14 9:31:45

零基础使用网络安全工具的方法

第❶步&#xff1a;工具认知&#xff08;第1个月&#xff09;- 别被工具吓倒&#xff0c;先当“普通软件”用核心心态&#xff1a;忘掉“黑客工具”的标签&#xff0c;把它们看作帮你完成特定任务的“瑞士军刀”。必装三件套&#xff08;虚拟机环境内操作&#xff09;&#xff…

作者头像 李华
网站建设 2026/8/13 16:27:17

校园人体工学深度解析:固定高度课桌椅如何成为学生“隐形推手”

引言在现代化校园建设中&#xff0c;标准化的管理模式往往被视为高效与秩序的象征。为了追求视觉上的整齐划一&#xff0c;许多学校在教室家具配置上采取了“一刀切”的策略&#xff1a;无论班级里的学生身高是1.2米还是1.6米&#xff0c;配备的课桌椅高度往往是固定的。这种为…

作者头像 李华
网站建设 2026/8/13 21:32:23

Vu3 打包问题

Vu3 打包问题 npm run build 时出现原因 TS 验证比较严格 解决方案 &#xff1a;在tsconfig.app。json中添加 “exclude”: [“node_modules/unplugin-element-plus/dist/vite.d.ts”]彻底解决 在package.json 中添加 “type-check”: “echo “Skipping type check””, c…

作者头像 李华
网站建设 2026/8/13 16:29:51

用 Swap 技巧彻底释放 Vector 内存

C 性能优化笔记&#xff1a;为什么 clear() 还不够&#xff1f;教你用 Swap 技巧彻底释放 Vector 内存 在阅读 DataNode.cpp 源码时&#xff0c;我发现了一个非常经典且优雅的 C 惯用写法&#xff08;Idiom&#xff09;。在 RemoveAll 函数中&#xff0c;作者并没有直接调用我…

作者头像 李华
网站建设 2026/8/12 15:08:29

14、Linux 系统脚本操作与用户管理全解析

Linux 系统脚本操作与用户管理全解析 1. 运行脚本 在 Linux 系统中, mkslocatedb 脚本的运行有特殊要求。它不仅必须以 root 用户身份运行,使用 sudo 还不行,需要直接登录为 root 用户或者使用更强大的 su 命令切换到 root 用户后再运行。这是因为 su 会真正切换到…

作者头像 李华