本例包含SET物料部分订单拒绝,全部拒绝
DATA: lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2.
FIELD-SYMBOLS: <f_so> LIKE LINE OF gt_so.
DATA: order_header_in LIKE bapisdh1,
order_header_inx LIKE bapisdh1x,
order_item_in LIKE TABLE OF bapisditm, " Order Items
order_item_inx LIKE TABLE OF bapisditmx,
schedule_lines LIKE TABLE OF bapischdl,
schedule_linesx LIKE TABLE OF bapischdlx.
DATA: i_bapi_view LIKE order_view,
sales_documents LIKE TABLE OF sales_key,
order_headers_out LIKE TABLE OF bapisdhd,
order_items_out LIKE TABLE OF bapisdit,
extensionout LIKE TABLE OF bapiparex.
DATA: order_schedules_out LIKE TABLE OF bapisdhedu.
DATA: origin_line LIKE bapisdit.
DATA: extensionin LIKE TABLE OF bapiparex,
extensionex LIKE TABLE OF bapiparex,
order_partners_out LIKE TABLE OF bapisdpart.
******* extension
DATA: BEGIN OF lwa_ext_head
, structure TYPE te_struc VALUE 'BAPE_VBAK'
, fld TYPE bape_vbak
,END OF lwa_ext_head
,BEGIN OF lwa_ext_headx
, structure TYPE te_struc VALUE 'BAPE_VBAKX'
, fld TYPE bape_vbakx
,END OF lwa_ext_headx
,BEGIN OF lwa_ext_item
, structure TYPE te_struc VALUE 'BAPE_VBAP'
, fld TYPE bape_vbap
,END OF lwa_ext_item
,BEGIN OF lwa_ext_itemx
, structure TYPE te_struc VALUE 'BAPE_VBAPX'
, fld TYPE bape_vbapx
,END OF lwa_ext_itemx.
DATA: lv_vbeln TYPE vbak-vbeln.
DATA: lv_reject_all. "reject all
DATA: lv_posnr_ora TYPE vbap-posnr.
* SELECT SINGLE * FROM vbap INTO @DATA(lw_vbap)
* WHERE vbeln = @pw_main-order
* AND posnr = @pw_main-item.
LOOP AT gt_so INTO gs_so WHERE sel = 'X' AND mess <> 'successful!'.
CLEAR:sales_documents, order_headers_out, order_items_out, order_schedules_out, extensionout.
CLEAR: lv_reject_all,lv_vbeln.
CLEAR:order_header_in,order_header_inx, lt_return,order_item_in,order_item_inx,schedule_lines, schedule_linesx,extensionin.
CLEAR: i_bapi_view, origin_line.
IF gs_so-olfmng > gs_so-opqty.
gs_so-mess = 'error:reject qty.>open qty'.
gs_so-icon = icon_led_red.
MODIFY gt_so FROM gs_so.
CONTINUE.
ENDIF.
lv_vbeln = gs_so-vbeln.
"IF pw_check-menge <= 0 AND gs_so-kwmeng = gs_so-ord_qty.
IF gs_so-kwmeng = gs_so-olfmng.
lv_reject_all = 'X'.
ENDIF.
i_bapi_view-item = 'X'.
i_bapi_view-sdschedule = 'X'.
i_bapi_view-header = 'X'.
APPEND INITIAL LINE TO sales_documents
ASSIGNING FIELD-SYMBOL(<f1>).
<f1>-vbeln = gs_so-vbeln.
"获取原本so相关信息
CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
i_bapi_view = i_bapi_view
* I_MEMORY_READ =
* I_WITH_HEADER_CONDITIONS = ' '
TABLES
sales_documents = sales_documents
order_headers_out = order_headers_out
order_items_out = order_items_out
order_schedules_out = order_schedules_out
extensionout = extensionout.
READ TABLE lt_return INTO DATA(lw_return) WITH KEY type = 'E'.
IF sy-subrc = 0.
RETURN.
ENDIF.
CLEAR lt_return[].
SORT order_items_out BY itm_number DESCENDING.
DATA(lv_posnr) = order_items_out[ 1 ]-itm_number.
lv_posnr+5 = 0.
lv_posnr_ora = gs_so-posnr.
”业务需求itme物料需要带出库存地点,做了处理(可优化)
DO 10 TIMES.
DATA(lv_index) = sy-index.
IF sy-index = 1.
ASSIGN order_items_out[ itm_number = gs_so-posnr ] TO FIELD-SYMBOL(<cr>).
IF sy-subrc NE 0.
MESSAGE | Sales document item not found, please refresh. |
TYPE 'I'.
EXIT.
ENDIF.
ELSE.
ASSIGN order_items_out[ itm_number = lv_posnr_ora hg_lv_item = gs_so-posnr ] TO <cr>.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
****** new item for rejection
IF lv_reject_all IS INITIAL.
"部分拒绝
APPEND INITIAL LINE TO order_item_in
ASSIGNING FIELD-SYMBOL(<2>).
MOVE-CORRESPONDING <cr> TO <2>.
lv_posnr = lv_posnr + 10.
<2>-itm_number = lv_posnr .
<2>-material = <cr>-material.
<2>-item_categ = <cr>-item_categ.
<2>-target_qty = gs_so-olfmng.
<2>-target_qu = <cr>-sales_unit .
<2>-plant = <cr>-plant .
IF <cr>-hg_lv_item = gs_so-posnr.
<2>-store_loc = <cr>-stge_loc.
<2>-hg_lv_item = lv_posnr - ( lv_index - 1 ) * 10.
ENDIF.
CLEAR: <2>-wbs_elem.
<2>-reason_rej = reason ."'KJ'.
* clear <2>-ITEM_CATEG.
APPEND INITIAL LINE TO order_item_inx
ASSIGNING FIELD-SYMBOL(<3>).
<3>-itm_number = lv_posnr .
<3>-material = 'X'.
<3>-item_categ = 'X'.
<3>-target_qty = 'X'.
<3>-target_qu = 'X'.
<3>-reason_rej = 'X'.
<3>-updateflag = 'I'.
<3>-po_itm_no = 'X'.
<3>-plant = 'X'.
<3>-ship_point = 'X'.
IF <cr>-hg_lv_item = gs_so-posnr.
<3>-store_loc = 'X'.
<3>-hg_lv_item = 'X'.
ENDIF.
IF lv_index = 1.."header物料部分发货需要重新插入一行
APPEND INITIAL LINE TO schedule_lines
ASSIGNING FIELD-SYMBOL(<4>).
APPEND INITIAL LINE TO schedule_linesx
ASSIGNING FIELD-SYMBOL(<5>).
<4>-itm_number = lv_posnr.
<4>-sched_line = '0001'.
<4>-req_qty = gs_so-olfmng.
<5>-itm_number = lv_posnr.
<5>-sched_line = '0001'.
<5>-updateflag = 'I'.
<5>-req_qty = 'X'.
ENDIF.
****** oringial line change quantity
APPEND INITIAL LINE TO order_item_in
ASSIGNING <2>.
APPEND INITIAL LINE TO order_item_inx
ASSIGNING <3>.
MOVE-CORRESPONDING <cr> TO <2>.
<2>-itm_number = <cr>-itm_number .
* <2>-MATERIAL = <CR>-MATERIAL.
* <2>-ITEM_CATEG = <CR>-ITEM_CATEG.
<2>-target_qty = gs_so-kwmeng - gs_so-olfmng.
<3>-target_qty = 'X'.
CLEAR: <2>-wbs_elem, <2>-ship_point.
<3>-itm_number = <cr>-itm_number .
<3>-updateflag = 'U'.
DATA: lf_1st.
CLEAR lf_1st.
LOOP AT order_schedules_out ASSIGNING FIELD-SYMBOL(<os>)
WHERE itm_number = <cr>-itm_number.
IF lf_1st = ''.
APPEND INITIAL LINE TO schedule_lines ASSIGNING <4>.
APPEND INITIAL LINE TO schedule_linesx ASSIGNING <5>.
MOVE-CORRESPONDING <os> TO <4>.
<4>-itm_number = <os>-itm_number.
<4>-sched_line = <os>-sched_line.
<4>-req_qty = gs_so-kwmeng - gs_so-olfmng ."<os>-req_qty - pw_main-ord_qty + pw_check-menge. "<cr>-req_qty.
<5>-itm_number = <os>-itm_number.
<5>-sched_line = <os>-sched_line.
<5>-updateflag = 'U'.
<5>-req_qty = 'X'.
lf_1st = 'X'.
ELSE.
ENDIF.
ENDLOOP.
ELSE.
"全部拒绝
* reject origiall line
APPEND INITIAL LINE TO order_item_in
ASSIGNING <2>.
APPEND INITIAL LINE TO order_item_inx
ASSIGNING <3>.
MOVE-CORRESPONDING <cr> TO <2>.
<2>-itm_number = <cr>-itm_number .
<2>-reason_rej = reason ."'KJ'.
<2>-plant = <cr>-plant .
<2>-store_loc = <cr>-stge_loc .
<3>-reason_rej = 'X'.
CLEAR: <2>-wbs_elem, <2>-ship_point.
<3>-itm_number = <cr>-itm_number .
<3>-updateflag = 'U'.
<3>-plant = 'X'.
<3>-store_loc = 'X'.
lv_posnr = <cr>-itm_number.
ENDIF.
******* extension
lwa_ext_item-fld-/bshm/som_incmpl = 'X'.
lwa_ext_item-fld-vbeln = lv_vbeln.
lwa_ext_item-fld-posnr = lv_posnr.
APPEND lwa_ext_item TO extensionin.
lwa_ext_itemx-fld-vbeln = lv_vbeln.
lwa_ext_itemx-fld-posnr = lv_posnr.
DATA: lv_ci TYPE i.
lv_ci = 3.
DO 100 TIMES.
ASSIGN COMPONENT lv_ci OF STRUCTURE lwa_ext_itemx-fld
TO FIELD-SYMBOL(<xxx>).
CHECK sy-subrc EQ 0.
<xxx> = 'X'.
lv_ci = lv_ci + 1.
ENDDO.
APPEND lwa_ext_itemx TO extensionin.
UNASSIGN <cr>.
lv_posnr_ora = lv_posnr_ora + 10.
ENDDO.
** header
order_header_in-dlv_block = ''.
order_header_inx-dlv_block = 'X'.
order_header_inx-updateflag = 'U'.
DO 10 TIMES.
IF sy-index <> 1.
WAIT UP TO 1 SECONDS.
ENDIF.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = lv_vbeln
order_header_in = order_header_in
order_header_inx = order_header_inx
TABLES
return = lt_return
order_item_in = order_item_in
order_item_inx = order_item_inx
schedule_lines = schedule_lines
schedule_linesx = schedule_linesx
extensionin = extensionin.
"Sales document 0000000000 is currently being processed (by user XXXXXX)
READ TABLE lt_return WITH KEY type = 'E' id = 'V1' number = '042' TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'." TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
gs_so-mess = ls_return-message.
gs_so-icon = icon_led_red.
MODIFY gt_so FROM gs_so.
CONTINUE.
ELSE.
gs_so-mess = 'successful!'.
gs_so-icon = icon_led_green.
MODIFY gt_so FROM gs_so.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDLOOP.
IF sy-subrc <> 0.
MESSAGE 'Rejected' TYPE 'E'.
ENDIF.
LOOP AT gt_so INTO gs_so WHERE sel = 'X' .
LOOP AT gt_so ASSIGNING <f_so> WHERE vbeln = gs_so-vbeln AND uepos = gs_so-posnr.
<f_so>-mess = gs_so-mess .
<f_so>-icon = gs_so-icon.
ENDLOOP.
ENDLOOP.
网友评论