LLL与BKZ算法
2025/12/19 0:34:44
发布时间:20251218
主要逻辑分为两个部分:
拆分和过账,拆分批次时必须写入存储位置,否则过账可能会报错(eg:存储地点不是为交货项目900001确定的)。
直接上源码,复制可用:
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.