逻辑顺序 创建生产订单->添加组件->添加工序(工序和组件顺序千万不能乱 如果乱了可能导致组件写不进去)
DATA: ls_orderdata TYPE bapi_pp_order_create. "BAPI传入参数
DATA: ls_return TYPE bapiret2.
DATA: lv_aufnr TYPE afko-aufnr,
lv_arbpl TYPE crhd-arbpl,
lv_steus TYPE afvc-steus,
lv_vornr TYPE resb-vornr.
DATA:lv_aufpl LIKE afvc-aufpl.
DATA:lv_aplzl LIKE afvc-aplzl.
DATA:is_order_key TYPE coxt_ord_key,
i_material TYPE coxt_material,
is_storage_location TYPE coxt_s_storage_location,
is_storage_locationx TYPE coxt_s_storage_locationx,
is_requ_quan TYPE coxt_s_quantity,
i_operation TYPE afvc-aplzl,
lv_posno TYPE cif_r3res-positionno,
gs_return TYPE coxt_bapireturn,
lv_error TYPE c.
LOOP AT it_output INTO wa_output GROUP BY ( zsign = wa_output-zsign ) ASSIGNING FIELD-SYMBOL(<fs_group>).
CLEAR:lv_aufnr,lv_posno.
LOOP AT GROUP <fs_group> ASSIGNING FIELD-SYMBOL(<ls_group>).
IF lv_aufnr IS INITIAL.
* 先创建生产订单
CLEAR:ls_orderdata.
ls_orderdata-order_type = <ls_group>-auart."订单类型
ls_orderdata-plant = <ls_group>-werks."工厂
ls_orderdata-material = <ls_group>-plnbez.
ls_orderdata-basic_start_date = <ls_group>-gstrp.
ls_orderdata-basic_end_date = <ls_group>-gltrp.
ls_orderdata-quantity = <ls_group>-gamng.
* IF <ls_group>-lgort IS NOT INITIAL.
* ls_orderdata-storage_location = <ls_group>-lgort.
* ENDIF.
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = ls_orderdata
IMPORTING
return = ls_return
order_number = lv_aufnr.
IF ls_return-type CA 'EAX' OR lv_aufnr IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR:ls_output.
ls_output-msg = ls_return-message.
ls_output-icon = icon_red_light.
MODIFY it_output FROM ls_output TRANSPORTING icon msg WHERE zsign = <fs_group>-zsign .
EXIT.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
WAIT UP TO 1 SECONDS.
CLEAR:lv_arbpl, lv_steus,lv_vornr.
lv_arbpl = <ls_group>-arbpl.
lv_steus = <ls_group>-steus.
lv_vornr = <ls_group>-vornr.
ENDIF.
ENDIF.
IF lv_aufnr IS NOT INITIAL .
lv_posno = lv_posno + 10.
* 根据生产订单创建组件
CLEAR:is_requ_quan.
is_requ_quan-quantity = <ls_group>-bdmng.
SELECT SINGLE meins INTO is_requ_quan-uom FROM mara WHERE matnr = <ls_group>-matnr.
CLEAR: is_storage_location,is_storage_locationx.
is_storage_location-werks = <ls_group>-werks.
is_storage_locationx-werks = 'X'.
IF <ls_group>-lgort IS NOT INITIAL.
is_storage_location-lgort = <ls_group>-lgort.
is_storage_locationx-lgort = 'X'.
ENDIF.
CLEAR: lv_aufpl,lv_aplzl.
SELECT SINGLE aufpl INTO lv_aufpl FROM afko WHERE aufnr = lv_aufnr.
SELECT SINGLE aplzl INTO lv_aplzl FROM afvc WHERE aufpl = lv_aufpl.
CALL FUNCTION 'CO_XT_COMPONENT_ADD'
EXPORTING
is_order_key = lv_aufnr
i_material = <ls_group>-matnr
is_requ_quan = is_requ_quan
i_operation = lv_aplzl
is_storage_location = is_storage_location
is_storage_locationx = is_storage_locationx
i_postp = <ls_group>-postp
i_posno = '000000'
IMPORTING
es_bapireturn = gs_return
e_error_occurred = lv_error.
"修复序号问题
ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <ft_resb_bt>.
IF <ft_resb_bt> IS ASSIGNED.
LOOP AT <ft_resb_bt> ASSIGNING <fs_resb_bt>.
DATA(lv_numc) = sy-tabix * 10.
ASSIGN COMPONENT 'POSNR' OF STRUCTURE <fs_resb_bt> TO FIELD-SYMBOL(<fs>).
IF sy-subrc = 0.
" <fs_resb_bt>-posnr = lv_numc.
<fs> = lv_numc.
"添加前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs>
IMPORTING
output = <fs>.
ENDIF.
CLEAR lv_numc.
ENDLOOP.
ENDIF.
IF lv_error IS INITIAL.
CALL FUNCTION 'ZCO_XT_ORDER_PREPARE_COMMIT' "接口不弹出对话框
IMPORTING
es_bapireturn = gs_return
e_error_occurred = lv_error.
IF gs_return-type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR:ls_output.
ls_output-msg = gs_return-message.
ls_output-icon = icon_red_light.
MODIFY it_output FROM ls_output TRANSPORTING icon msg WHERE zsign = <fs_group>-zsign .
* 失败需要将生产订单关闭
PERFORM frm_close_order USING lv_aufnr.
EXIT.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.
* WAIT UP TO '0.5' SECONDS.
ENDIF.
ENDIF.
* 创建组件之前需要先修改工序中的工作重心及控制码
* IF lv_arbpl IS NOT INITIAL AND lv_vornr IS NOT INITIAL .
* PERFORM frm_change_process USING lv_aufnr lv_arbpl lv_steus lv_vornr CHANGING ls_return.
* CLEAR:lv_arbpl, lv_steus,lv_vornr.
** 返回消息
* IF ls_return-type = 'E'.
* CLEAR:ls_output.
* ls_output-msg = ls_return-message.
* ls_output-icon = icon_red_light.
* MODIFY it_output FROM ls_output TRANSPORTING icon msg WHERE zsign = <fs_group>-zsign .
** 失败需要将生产订单关闭
* PERFORM frm_close_order USING lv_aufnr.
* EXIT.
* ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
* WAIT UP TO 1 SECONDS.
* ENDIF.
* ENDIF.
CLEAR:ls_output.
ls_output-msg = '成功'.
ls_output-icon = icon_green_light.
ls_output-aufnr = lv_aufnr.
MODIFY it_output FROM ls_output TRANSPORTING icon msg aufnr WHERE zsign = <fs_group>-zsign .
ENDIF.
ENDLOOP.
ENDLOOP.
DATA(lt_output) = it_output.
SORT lt_output BY zsign plnbez.
DELETE ADJACENT DUPLICATES FROM lt_output COMPARING zsign plnbez.
LOOP AT lt_output INTO wa_output.
IF wa_output-icon = icon_green_light.
* 创建组件之后需要先修改工序中的工作重心及控制码(如果放在创建组件之前 组件创建不进去 所有可能会有冲突?原因未知)
PERFORM frm_change_process USING wa_output-aufnr wa_output-arbpl wa_output-steus wa_output-vornr CHANGING ls_return.
CLEAR:lv_arbpl, lv_steus,lv_vornr.
* 返回消息
IF ls_return-type = 'E'.
CLEAR:ls_output.
ls_output-msg = ls_return-message.
ls_output-icon = icon_red_light.
ls_output-aufnr = ''.
MODIFY it_output FROM ls_output TRANSPORTING icon msg aufnr WHERE zsign = wa_output-zsign .
* 失败需要将生产订单关闭
PERFORM frm_close_order USING wa_output-aufnr.
EXIT.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM frm_change_process USING lv_aufnr
lv_arbpl
lv_steus
lv_vornr
CHANGING ls_return TYPE bapiret2.
DATA:lt_operation TYPE cose_t_operation,
ls_operation LIKE LINE OF lt_operation.
ls_operation-operation = lv_vornr."0010 工序修改
ls_operation-control_key = lv_steus."控制码
ls_operation-work_center = lv_arbpl."工作中心
ls_operation-work_center_x = 'X'.
*ls_operation-short_text = '测试工序短文本'."短文本
*ls_operation-short_text_x = 'X'.
APPEND ls_operation TO lt_operation.
CALL FUNCTION 'CO_SE_PRODORD_CHANGE'
EXPORTING
iv_order_number = lv_aufnr
* IS_HEADER =
* IT_HDR_USER_STATUS =
* IT_SEQUENCE =
it_operation = lt_operation
* IT_OPR_USER_STATUS =
* IT_PRT =
* IV_COMMIT =
IMPORTING
es_return = ls_return.
IF ls_return-type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDFORM.
FORM frm_close_order USING lv_aufnr.
DATA:ls_return TYPE bapiret2,
lt_order TYPE TABLE OF bapi_order_key WITH HEADER LINE,
lt_order_return TYPE TABLE OF bapi_order_return WITH HEADER LINE.
CLEAR:lt_order.
lt_order-order_number = lv_aufnr.
APPEND lt_order.
CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
IMPORTING
return = ls_return
TABLES
orders = lt_order
detail_return = lt_order_return.
IF ls_return-type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDFORM.