DATA:lv_mode TYPE c,
ls_eina TYPE eina,
lt_eina TYPE TABLE OF eina,
ls_eine TYPE eine,
lt_eine TYPE TABLE OF eine,
i_eina TYPE mewieina,
i_einax TYPE mewieinax,
i_eine TYPE mewieine,
i_einex TYPE mewieinex,
lt_return2 TYPE mewi_t_return,
ls_return2 LIKE LINE OF lt_return2,
lt_con_vali TYPE TABLE OF mewivalidity,
ls_con_vali TYPE mewivalidity,
lt_condition TYPE TABLE OF mewicondition,
ls_condition TYPE mewicondition,
e_eina TYPE mewieina,
e_eine TYPE mewieine,
ls_mara TYPE mara,
lt_mara TYPE TABLE OF mara,
lv_msg TYPE bapi_msg.
SELECT matnr,werks,ekgrp,plifz FROM marc INTO TABLE @DATA(lt_marc).
SORT lt_marc BY matnr werks.
SELECT * FROM mara INTO TABLE lt_mara.
SORT lt_mara BY matnr.
SELECT * FROM eina INTO TABLE lt_eina.
SORT lt_eina BY matnr lifnr.
SELECT * FROM eine INTO TABLE lt_eine.
SORT lt_eine BY infnr ekorg esokz werks.
SELECT a~lifnr, "供应商
a~matnr, "物料
a~ekorg, "采购组织
a~werks, "工厂
a~esokz, "信息类型
a~datab, "有效期自
a~datbi, "有效期至
a~knumh "条件记录编号
INTO TABLE @DATA(lt_a017)
FROM a017 AS a.
SORT lt_a017 BY lifnr matnr ekorg werks esokz.
LOOP AT in_tab ASSIGNING FIELD-SYMBOL(<fs_zmms009>).
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <fs_zmms009>-matnr
IMPORTING
output = <fs_zmms009>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
"补齐供应商的前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_zmms009>-lifnr
IMPORTING
output = <fs_zmms009>-lifnr.
READ TABLE lt_eina INTO ls_eina WITH KEY matnr = <fs_zmms009>-matnr lifnr = <fs_zmms009>-lifnr BINARY SEARCH.
IF sy-subrc <> 0.
lv_mode = 'I'."新增
ELSE.
READ TABLE lt_eine INTO ls_eine WITH KEY infnr = ls_eina-infnr
ekorg = <fs_zmms009>-ekorg esokz = <fs_zmms009>-esokz werks = <fs_zmms009>-werks BINARY SEARCH.
IF sy-subrc = 0.
lv_mode = 'M'."修改
i_eina-info_rec = ls_eina-infnr."采购信息记录号
i_eine-info_rec = ls_eina-infnr."
i_einex-info_rec = 'X'.
i_einax-vendor = 'X'.
i_einax-material = 'X'.
ELSE.
lv_mode = 'I'."新增
ENDIF.
ENDIF.
i_eina-vendor = <fs_zmms009>-lifnr."供应商
i_eina-material = <fs_zmms009>-matnr."物料编码
* i_eina-conv_num1 = <fs_zmms009>-umrez."转换分子
* i_eina-conv_den1 = <fs_zmms009>-umren."转换分母
i_eine-conv_num1 = <fs_zmms009>-umrez."转换分子
IF i_eine-conv_num1 IS NOT INITIAL.
i_einex-conv_num1 = 'X'.
ENDIF.
i_eine-conv_den1 = <fs_zmms009>-umren."转换分母
IF i_eine-conv_den1 IS NOT INITIAL.
i_einex-conv_den1 = 'X'.
ENDIF.
i_eine-purch_org = <fs_zmms009>-ekorg."采购组织
IF i_eine-purch_org IS NOT INITIAL.
i_einex-purch_org = 'X'.
ENDIF.
i_eine-info_type = <fs_zmms009>-esokz."信息类别
IF i_eine-info_type IS NOT INITIAL.
i_einex-info_type = 'X'.
ENDIF.
i_eine-plant = <fs_zmms009>-werks."工厂
IF i_eine-plant IS NOT INITIAL.
i_einex-plant = 'X'.
ENDIF.
IF <fs_zmms009>-ekgrp IS INITIAL.
READ TABLE lt_marc INTO DATA(ls_marc) WITH KEY matnr = <fs_zmms009>-matnr
werks = <fs_zmms009>-werks
BINARY SEARCH.
IF sy-subrc = 0.
i_eine-plnd_delry = ls_marc-plifz. "计划交货时间
<fs_zmms009>-ekgrp = ls_marc-ekgrp.
ENDIF.
ENDIF.
IF i_eine-plnd_delry IS NOT INITIAL.
i_einex-plnd_delry = 'X'.
ENDIF.
i_eine-pur_group = <fs_zmms009>-ekgrp."采购组
IF i_eine-pur_group IS NOT INITIAL.
i_einex-pur_group = 'X'.
ENDIF.
i_eine-currency = <fs_zmms009>-waers."货币码
IF i_eine-currency IS NOT INITIAL.
i_einex-currency = 'X'.
ENDIF.
i_eine-tax_code = <fs_zmms009>-mwskz."税码
IF i_eine-tax_code IS NOT INITIAL.
i_einex-tax_code = 'X'.
ENDIF.
IF <fs_zmms009>-netpr1 IS NOT INITIAL.
ls_condition-cond_type = 'PB99'."条件类型
i_eine-net_price = <fs_zmms009>-netpr1."净价
IF i_eine-net_price IS NOT INITIAL.
i_einex-net_price = 'X'.
ENDIF.
ELSEIF <fs_zmms009>-netpr2 IS NOT INITIAL.
ls_condition-cond_type = 'PB01'."条件类型
i_eine-net_price = <fs_zmms009>-netpr2."净价
IF i_eine-net_price IS NOT INITIAL.
i_einex-net_price = 'X'.
ENDIF.
ENDIF.
"对采购单位进行一次转换
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = <fs_zmms009>-bprme
* LANGUAGE = SY-LANGU
IMPORTING
output = <fs_zmms009>-bprme
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
"对单位进行校验
READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <fs_zmms009>-matnr BINARY SEARCH.
IF sy-subrc = 0.
IF ls_mara-bstme IS NOT INITIAL.
i_eine-orderpr_un = ls_mara-bstme."采购单位
IF i_eine-orderpr_un IS NOT INITIAL.
i_einex-orderpr_un = 'X'.
ENDIF.
IF ls_mara-bstme <> <fs_zmms009>-bprme AND <fs_zmms009>-bprme IS NOT INITIAL.
i_eine-orderpr_un = <fs_zmms009>-bprme."采购单位
ENDIF.
ELSE.
i_eine-orderpr_un = ls_mara-meins."采购单位
IF i_eine-orderpr_un IS NOT INITIAL.
i_einex-orderpr_un = 'X'.
ENDIF.
IF ls_mara-meins <> <fs_zmms009>-bprme AND <fs_zmms009>-bprme IS NOT INITIAL.
i_eine-orderpr_un = <fs_zmms009>-bprme."采购单位
ENDIF.
ENDIF.
ENDIF.
i_eine-price_unit = <fs_zmms009>-peinh."价格单位
IF i_eine-price_unit IS NOT INITIAL.
i_einex-price_unit = 'X'.
ENDIF.
i_eine-nrm_po_qty = <fs_zmms009>-norbm."标准采购订单数量
IF i_eine-nrm_po_qty IS NOT INITIAL.
i_einex-nrm_po_qty = 'X'.
ENDIF.
IF i_eina-info_rec <> ''.
ls_condition-change_id = 'U'.
READ TABLE lt_a017 INTO DATA(ls_a017) WITH KEY lifnr = <fs_zmms009>-lifnr
matnr = <fs_zmms009>-matnr
ekorg = <fs_zmms009>-ekorg
werks = <fs_zmms009>-werks
esokz = <fs_zmms009>-esokz
BINARY SEARCH.
IF sy-subrc = 0.
ls_con_vali-serial_id = ls_a017-knumh.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '01'.
ENDIF.
ENDIF.
ls_con_vali-plant = <fs_zmms009>-werks."工厂
ls_con_vali-valid_from = <fs_zmms009>-datab."有效起始日
ls_con_vali-valid_to = <fs_zmms009>-prdat."有效截止日
APPEND ls_con_vali TO lt_con_vali.
ls_condition-currency = <fs_zmms009>-waers."货币码
IF <fs_zmms009>-netpr1 IS NOT INITIAL.
ls_condition-cond_value = <fs_zmms009>-netpr1."净价
ELSEIF <fs_zmms009>-netpr2 IS NOT INITIAL.
ls_condition-cond_value = <fs_zmms009>-netpr2."净价
ENDIF.
ls_condition-cond_p_unt = <fs_zmms009>-peinh."条件定价单位
ls_condition-cond_unit = <fs_zmms009>-bprme."条件单位
APPEND ls_condition TO lt_condition.
REFRESH:lt_return2.
IF lv_mode = 'I'.
CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = i_eina
i_eine = i_eine
i_einex = i_einex
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
return = lt_return2.
READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
IF sy-subrc <> 0.
"创建时需要将数据写入到数据库里,不然报错
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
"因为净价和条件不能同时维护,所以分开维护
CLEAR:i_einex-net_price.
REFRESH:lt_return2.
i_eina-info_rec = e_eina-info_rec."采购信息记录号
i_eine-info_rec = e_eina-info_rec.
i_einex-info_rec = 'X'.
CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = i_eina
i_eine = i_eine
i_einex = i_einex
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
condition = lt_condition
return = lt_return2.
ENDIF.
ELSE.
"对数据进行修改
CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = i_eina
i_einax = i_einax
i_eine = i_eine
i_einex = i_einex
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
* condition = lt_condition
return = lt_return2.
READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
REFRESH : lt_return2.
CLEAR:i_einex-net_price.
CALL FUNCTION 'ME_INITIALIZE_INFORECORD'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = i_eina
i_einax = i_einax
i_eine = i_eine
i_einex = i_einex
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
condition = lt_condition
return = lt_return2.
ENDIF.
READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
IF sy-subrc = 0.
<fs_zmms009>-msgty = 'E'.
<fs_zmms009>-msgtxt = ls_return2-message.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
<fs_zmms009>-e_infnr = e_eina-info_rec."采购信息记录号
<fs_zmms009>-msgty = 'S'.
IF lv_mode = 'I'.
<fs_zmms009>-msgtxt = '创建成功' && <fs_zmms009>-e_infnr.
ELSE.
<fs_zmms009>-msgtxt = '修改成功' && <fs_zmms009>-e_infnr.
ENDIF.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
CLEAR:i_eina,i_einax,
i_eine,i_einex,
lt_con_vali,lt_condition,
ls_eina.
CLEAR:lt_return2.
ENDLOOP.