FUNCTION zsdfu016.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_ID) TYPE ZRFC_LOGID OPTIONAL
*" VALUE(I_CANUM) TYPE CANUM OPTIONAL
*" EXPORTING
*" VALUE(E_CODE) TYPE MSGTY
*" VALUE(E_MSG) TYPE MSGTXT
*" VALUE(E_FLOW_END) TYPE CHAR01
*" TABLES
*" ET_RETURN STRUCTURE ZRFCT005 OPTIONAL
*"----------------------------------------------------------------------
DATA:ls_zsdt024 TYPE zsdt024,
lt_zsdt024 TYPE TABLE OF zsdt024,
ls_zsdt008 TYPE zsdt008,
lt_zsdt008 TYPE TABLE OF zsdt008,
ls_zsdt025 TYPE zsdt025,
ls_vbap TYPE vbap,
lt_vbap TYPE TABLE OF vbap,
ls_zsdt001 TYPE zsdt001,
ls_zrfct002 TYPE zrfct002,
ls_zrfct005 TYPE zrfct005.
DATA:lv_canum TYPE canum,
lv_zrfc_logid TYPE zsdt008-zrfc_logid,
lv_vbeln TYPE vbak-vbeln,
lv_waers TYPE vbak-waerk,
lv_waers_1 TYPE vbak-waerk,,
lv_kbetr TYPE konp-kbetr,
lv_knumh TYPE konp-knumh,
lv_mtart TYPE mara-mtart.
DATA:lv_canum_2 TYPE canum,
lv_code TYPE msgty,
lv_msg TYPE msgtxt,
lt_return TYPE TABLE OF zrfct005.
DATA:lv_mwskz TYPE konv-mwsk1.
CLEAR:lt_zsdt008,ls_zsdt008,lv_canum,lv_zrfc_logid,lv_vbeln,lv_waers,ls_zsdt025,ls_zsdt001.
"获取源表数据
CLEAR:lt_zsdt024.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zsdt024 FROM zsdt024 WHERE zrfc_logid = i_id.
IF lt_zsdt024 IS INITIAL.
e_code = 'E'.
e_msg = '无可执行数据'.
RETURN.
ENDIF.
READ TABLE lt_zsdt024 INTO ls_zsdt024 INDEX 1.
SELECT SINGLE * INTO ls_zsdt025 FROM zsdt025 WHERE zrfcid = ls_zsdt024-zrfcid AND canum = i_canum." AND bsart = ls_zsdt024-bsart.
SELECT SINGLE zrfc_logid INTO lv_zrfc_logid FROM zsdt008 WHERE zrfcid = ls_zsdt025-zzrfcid AND canum = '0010' AND objkey = ls_zsdt024-ebeln.
SELECT * INTO TABLE lt_zsdt008 FROM zsdt008 WHERE zrfc_logid = lv_zrfc_logid.
*
SORT lt_zsdt008 BY zrfc_logid canum.
READ TABLE lt_zsdt008 INTO ls_zsdt008 WITH KEY canum = ls_zsdt025-zcanum.
SELECT SINGLE * INTO ls_zsdt001 FROM zsdt001 WHERE zrfcid = ls_zsdt008-zrfcid AND canum = ls_zsdt008-canum.
lv_vbeln = ls_zsdt008-objkey.
DATA:ls_vbak TYPE vbak,
ls_konv TYPE konv,
lt_konv TYPE TABLE OF konv.
SELECT SINGLE * INTO ls_vbak FROM vbak WHERE vbeln = lv_vbeln.
SELECT * INTO TABLE lt_vbap FROM vbap WHERE vbeln = lv_vbeln.
lv_waers_1 = ls_vbak-waerk.
SELECT * INTO TABLE lt_konv FROM konv WHERE knumv = ls_vbak-knumv.
READ TABLE lt_konv INTO ls_konv WITH KEY kschl = 'MWST'.
lv_mwskz = ls_konv-mwsk1.
"销售订单修改BAPI结构定义
DATA: salesdocument LIKE bapivbeln-vbeln,
order_header_in LIKE bapisdh1,
order_header_inx LIKE bapisdh1x,
order_item_in LIKE bapisditm OCCURS 0 WITH HEADER LINE,
order_item_inx LIKE bapisditmx OCCURS 0 WITH HEADER LINE,
return1 LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
order_schedules_in LIKE bapischdl OCCURS 0 WITH HEADER LINE,
order_schedules_inx LIKE bapischdlx OCCURS 0 WITH HEADER LINE,
order_conditions_in LIKE bapicond OCCURS 0 WITH HEADER LINE,
order_conditions_inx LIKE bapicondx OCCURS 0 WITH HEADER LINE,
logic_switch LIKE bapisdls,
ls_bapi_view TYPE order_view,
lt_salesdocuments TYPE TABLE OF sales_key,
ls_salesdocuments TYPE sales_key,
lt_order_conditions_out TYPE TABLE OF bapisdcond,
ls_order_conditions_out TYPE bapisdcond.
CLEAR:ls_bapi_view,ls_salesdocuments,lt_salesdocuments,lt_order_conditions_out.
ls_bapi_view-sdcond = 'X'.
ls_salesdocuments = lv_vbeln.
APPEND ls_salesdocuments TO lt_salesdocuments.
CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
i_bapi_view = ls_bapi_view
TABLES
sales_documents = lt_salesdocuments
order_conditions_out = lt_order_conditions_out.
"取税率
IF lv_mwskz IS NOT INITIAL.
CLEAR:lv_kbetr,lv_knumh.
SELECT SINGLE knumh INTO lv_knumh FROM a003 WHERE kappl = 'TX' AND aland = 'CN' AND mwskz = lv_mwskz.
SELECT SINGLE kbetr INTO lv_kbetr FROM konp WHERE knumh = lv_knumh.
lv_kbetr = 1 + lv_kbetr / 1000.
ELSE.
lv_kbetr = 1.
ENDIF.
DATA:ls_ekko TYPE ekko,
ls_ekpo TYPE ekpo.
READ TABLE lt_zsdt024 INTO ls_zsdt024 INDEX 1.
IF sy-subrc = 0.
SELECT SINGLE * FROM ekko INTO ls_ekko WHERE ebeln = ls_zsdt024-ebeln.
ENDIF.
DATA:lv_uebpo TYPE ekpo-uebpo,
lv_uptyp TYPE ekpo-uptyp.
DATA:lv_from_cur TYPE bapi1093_1-from_curr,
lv_to_cur TYPE bapi1093_1-to_currncy,
ls_rate TYPE bapi1093_0,
ls_return TYPE bapiret1.
LOOP AT lt_zsdt024 INTO ls_zsdt024.
SELECT SINGLE *
INTO @DATA(ls_ekpo2)
FROM ekpo
WHERE ebeln = @ls_zsdt024-ebeln
AND ebelp = @ls_zsdt024-ebelp.
IF lv_uebpo NE '' AND lv_uptyp = 4.
CLEAR:ls_ekpo2.
CONTINUE.
ENDIF.
IF ls_zsdt024-zbs = 'I'. "新增
* IF lv_ukurs IS INITIAL.
* lv_ukurs = 1.
* ENDIF.
order_item_in-itm_number = ls_zsdt024-ebelp.
order_item_inx-itm_number = ls_zsdt024-ebelp.
order_item_inx-updateflag = 'I'.
order_item_in-material = ls_zsdt024-matnr."物料
order_item_inx-material = 'X'.
order_item_in-target_qty = ls_zsdt024-menge."数量
order_item_inx-target_qty = 'X'.
order_item_in-sales_unit = ls_zsdt024-vrkme."单位
order_item_inx-sales_unit = 'X'.
order_item_in-plant = ls_zsdt001-werks. "工厂
order_item_inx-plant = 'X'.
order_item_in-price_date = sy-datum. "定价日期
order_item_inx-price_date = 'X'.
order_item_in-po_itm_no = ls_zsdt024-ebelp.
order_item_inx-po_itm_no = 'X'.
****ADD BY ZJ 20221203 S 转换因子
order_item_in-salqtynum = ls_ekpo2-umrez.
order_item_in-salqtyden = ls_ekpo2-umren.
order_item_inx-salqtynum = 'X'.
order_item_inx-salqtyden = 'X'.
****ADD BY ZJ 20221203 E 转换因子
APPEND:order_item_inx,order_item_in.
CLEAR:order_item_in,order_item_inx.
IF ls_zsdt001-kschl IS NOT INITIAL.
order_conditions_in-itm_number = ls_zsdt024-ebelp. "itm_number
order_conditions_in-cond_type = ls_zsdt001-kschl. "定价条件
SELECT SINGLE knumv INTO @DATA(lv_knumv) FROM ekko WHERE ebeln = @ls_zsdt024-ebeln.
SELECT SINGLE kbetr waers kmein stunr zaehk
FROM konv
INTO ( order_conditions_in-cond_value,
order_conditions_in-currency,
order_conditions_in-cond_unit,
order_conditions_in-cond_st_no,
order_conditions_in-cond_count )
WHERE knumv = lv_knumv
AND kposn = ls_zsdt024-ebelp
AND ( kschl = 'PB00' OR kschl = 'PBXX' )
AND kinak = ''.
CLEAR:lv_knumv.
order_conditions_in-cond_p_unt = ls_zsdt024-kpein.. "条件单位
APPEND order_conditions_in.
CLEAR order_conditions_in.
order_conditions_inx-itm_number = ls_zsdt024-ebelp.
order_conditions_inx-cond_type = ls_zsdt001-kschl.
order_conditions_inx-cond_value = 'X'.
order_conditions_inx-currency = 'X'.
order_conditions_inx-cond_unit = 'X'.
order_conditions_inx-cond_p_unt = 'X'.
order_conditions_inx-cond_st_no = 'X'.
order_conditions_inx-cond_count = 'X'.
order_conditions_inx-updateflag = 'U'.
APPEND order_conditions_inx.
CLEAR order_conditions_inx.
ENDIF.
"交货计划行
order_schedules_in-itm_number = ls_zsdt024-ebelp.
order_schedules_inx-itm_number = ls_zsdt024-ebelp.
order_schedules_inx-updateflag = 'I'.
order_schedules_in-req_qty = ls_zsdt024-menge.
order_schedules_inx-req_qty = 'X'.
order_schedules_in-req_date = ls_zsdt024-eindt.
order_schedules_inx-req_date = 'X'.
APPEND:order_schedules_in,order_schedules_inx.
CLEAR:order_schedules_in,order_schedules_inx.
ELSEIF ls_zsdt024-zbs = 'U'. "修改
order_item_in-itm_number = ls_zsdt024-ebelp.
order_item_inx-itm_number = ls_zsdt024-ebelp.
order_item_inx-updateflag = 'U'.
order_item_in-target_qty = ls_zsdt024-menge."数量
order_item_inx-target_qty = 'X'.
order_item_in-sales_unit = ls_zsdt024-vrkme."单位
order_item_inx-sales_unit = 'X'.
IF ls_zsdt024-flag = 'X'.
order_item_in-reason_rej = ''.
order_item_inx-reason_rej = 'X'.
ENDIF.
SELECT SINGLE * FROM vbap INTO @DATA(ls_vbap_2) WHERE vbeln = @lv_vbeln AND posnr = @ls_zsdt024-ebelp.
****ADD BY ZJ 20221204 S 判断行项目是否做更改了
IF ls_vbap_2-kwmeng NE ls_zsdt024-menge OR
ls_vbap_2-vrkme NE ls_zsdt024-vrkme OR
( ls_vbap_2-abgru NE '' AND ls_zsdt024-flag = 'X' ).
APPEND:order_item_inx,order_item_in.
ENDIF.
CLEAR:order_item_in,order_item_inx.
****ADD BY ZJ 20221204 E 判断行项目是否做更改了
***------价格
IF ls_zsdt024-kbetr IS NOT INITIAL.
CLEAR:ls_order_conditions_out.
READ TABLE lt_order_conditions_out INTO ls_order_conditions_out WITH KEY sd_doc = lv_vbeln itm_number = ls_zsdt024-ebelp cond_type = ls_zsdt001-kschl.
order_conditions_in-cond_st_no = ls_order_conditions_out-cond_st_no.
order_conditions_inx-cond_st_no = ls_order_conditions_out-cond_st_no.
order_conditions_in-cond_count = ls_order_conditions_out-cond_count."计数器
order_conditions_inx-cond_count = ls_order_conditions_out-cond_count.
order_conditions_in-cond_type = ls_order_conditions_out-cond_type."条件类型
order_conditions_inx-cond_type = ls_order_conditions_out-cond_type."条件类型.
order_conditions_in-cond_value = ls_zsdt024-kbetr."" * lv_kbetr
IF ls_zsdt024-bsart = 'ZFTO' OR ls_zsdt024-bsart = 'ZITO'. ""非进口单据,货币使用源头订单货币
order_conditions_in-currency = ls_zsdt024-koein.
ELSE.
IF ls_order_conditions_out-currency <> ls_zsdt024-koein.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
date = sy-datum
foreign_amount = order_conditions_in-cond_value
foreign_currency = ls_zsdt024-koein
local_currency = ls_order_conditions_out-currency
IMPORTING
local_amount = order_conditions_in-cond_value.
ENDIF.
order_conditions_in-currency = ls_order_conditions_out-currency."货币
ENDIF.
order_conditions_inx-cond_value = 'X'.
* order_conditions_in-currency = ls_order_conditions_out-currency."货币
* order_conditions_in-currency = ls_zsdt024-koein.
order_conditions_inx-currency = 'X'.
order_conditions_in-cond_unit = ls_order_conditions_out-cond_d_unt. "条件单位
order_conditions_inx-cond_unit = 'X'.
order_conditions_in-cond_p_unt = ls_zsdt024-kpein. "条件定价单位 UPDATE BY JT 20221018
order_conditions_inx-cond_p_unt = 'X'.
order_conditions_inx-updateflag = 'U'.
APPEND:order_conditions_in,order_conditions_inx.
CLEAR:order_conditions_in,order_conditions_inx.
ENDIF.
"交货计划行
SELECT SINGLE * FROM vbep INTO @DATA(ls_vbep) WHERE vbeln = @lv_vbeln AND posnr = @ls_zsdt024-ebelp
AND etenr = '0001'.
order_schedules_in-itm_number = ls_zsdt024-ebelp.
order_schedules_inx-itm_number = ls_zsdt024-ebelp.
order_schedules_in-sched_line = '0001'.
order_schedules_inx-sched_line = '0001'.
order_schedules_inx-updateflag = 'U'.
order_schedules_in-req_qty = ls_zsdt024-menge.
order_schedules_inx-req_qty = 'X'.
order_schedules_in-req_date = ls_zsdt024-eindt.
order_schedules_inx-req_date = 'X'.
****ADD BY ZJ 20221204 S 判断行项目是否做更改了
IF ls_vbep-wmeng NE ls_zsdt024-menge OR
ls_vbep-edatu NE ls_zsdt024-eindt.
APPEND:order_schedules_in,order_schedules_inx.
ENDIF.
****ADD BY ZJ 20221204 E 判断行项目是否做更改了
CLEAR:order_schedules_in,order_schedules_inx.
ELSEIF ls_zsdt024-zbs = 'D'. "删除
order_item_in-itm_number = ls_zsdt024-ebelp.
order_item_inx-itm_number = ls_zsdt024-ebelp.
order_item_inx-updateflag = 'U'.
* order_item_inx-updateflag = 'D'.
order_item_in-reason_rej = ls_zsdt025-abgru."拒绝原因
order_item_inx-reason_rej = 'X'.
APPEND:order_item_inx,order_item_in.
CLEAR:order_item_in,order_item_inx.
ENDIF.
CLEAR:ls_zsdt024,ls_ekpo2.
ENDLOOP.
logic_switch-pricing = 'G'. "注意手工的价格条件一定要给C,否则会出现定价失败
order_header_inx-updateflag = 'U'.
READ TABLE lt_zsdt024 INTO ls_zsdt024 INDEX 1.
order_header_in-pmnttrms = ls_zsdt024-zterm.
order_header_inx-pmnttrms = 'X'.
DATA:lv_flag.
LOOP AT order_item_in WHERE reason_rej NE '' .
ENDLOOP.
IF sy-subrc = 0.
lv_flag = 'X'.
ELSE.
LOOP AT lt_zsdt024 TRANSPORTING NO FIELDS WHERE uebpo <> ''
AND uptyp = 4
AND zbs = 'D'.
ENDLOOP.
IF sy-subrc = 0.
lv_flag = 'X'.
ENDIF.
ENDIF.
IF lv_flag = 'X'.
lv_canum_2 = i_canum + 10.
CALL FUNCTION 'ZSDFU023'
EXPORTING
i_id = i_id
i_canum = lv_canum_2
IMPORTING
e_code = lv_code
e_msg = lv_msg
TABLES
et_return = lt_return.
IF lv_code EQ 'E'.
e_code = 'E'.
e_msg = lv_msg.
RETURN.
ENDIF.
ENDIF.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = lv_vbeln
order_header_in = order_header_in
order_header_inx = order_header_inx
logic_switch = logic_switch
TABLES
return = return1
order_item_in = order_item_in
order_item_inx = order_item_inx
schedule_lines = order_schedules_in
schedule_linesx = order_schedules_inx
conditions_in = order_conditions_in
conditions_inx = order_conditions_inx.
LOOP AT return1 WHERE type = 'E' OR type = 'A' OR type = 'X'.
CONCATENATE e_msg return1-message INTO e_msg SEPARATED BY '/'.
ENDLOOP.
IF sy-subrc NE 0.
CALL METHOD zcl_rfc=>get_source
EXPORTING
i_id = i_id
i_canum = i_canum
IMPORTING
e_zrfct002 = ls_zrfct002.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CLEAR:ls_zsdt008.
ls_zsdt008-canum = ls_zrfct002-canum.
ls_zsdt008-objtype = ls_zrfct002-objtype_save.
ls_zsdt008-objkey = lv_vbeln.
ls_zsdt008-zrfcid = ls_zrfct002-zrfcid.
ls_zsdt008-zrfc_logid = i_id.
APPEND ls_zsdt008 TO lt_zsdt008.
MODIFY zsdt008 FROM TABLE lt_zsdt008.
e_code = 'S'.
CONCATENATE 'SO:' lv_vbeln '修改成功' INTO e_msg.
CLEAR:ls_zrfct005.
ls_zrfct005-status = '53'.
ls_zrfct005-msgty = e_code.
ls_zrfct005-msgid = '00'.
ls_zrfct005-msgno = '001'.
ls_zrfct005-msgv1 = e_msg.
ls_zrfct005-msgv4 = lv_vbeln.
APPEND ls_zrfct005 TO et_return.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
e_code = 'E'.
ENDIF.
ENDFUNCTION.