FUNCTION z_fmmm090 .
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(INPUT) TYPE ZMT_MM090_PURCHASEINFO_SAP_REQ OPTIONAL
*" VALUE(IV_MSGID) TYPE ZEMSGID OPTIONAL
*" VALUE(IS_CONFIG) TYPE ZCMT0001 OPTIONAL
*" EXPORTING
*" VALUE(OUTPUT) TYPE ZMT_MM090_PURCHASEINFO_SAP_RES
*" VALUE(ES_IFMSG) TYPE ZCMS0001
*"----------------------------------------------------------------------
*----------------------------------------------------------------------*
* PROGRAM ID : RICEF-MM-090 *
* APPLICATION NAME : PP *
* AUTHOR : CG018 *
* TRANSACTION : N/A *
* PROGRAM TYPE : INTERFACE *
* INPUT FILES : N/A *
* OUTPUT FILES : N/A *
* DEVELOPMENT CLASS : ZDEV *
* MESSAGE CLASS : N/A *
* DESCRIPTION : SRM-SAP PROCUREMENT INFORMATION RECORDS *
*----------------------------------------------------------------------*
* 000 2024/09/05 NEW PROGRAM *
*----------------------------------------------------------------------*
DATA:lv_mode TYPE c.
DATA:ls_ieina TYPE mewieina,
ls_ieinax TYPE mewieinax,
ls_ieine TYPE mewieine,
ls_ieinex TYPE mewieinex.
DATA:lv_test TYPE bapiflag-bapiflag.
DATA:lt_return2 TYPE mewi_t_return,
ls_return2 LIKE LINE OF lt_return2.
DATA:lt_con_vali TYPE TABLE OF mewivalidity,
ls_con_vali TYPE mewivalidity.
DATA:lt_condition TYPE TABLE OF mewicondition,
ls_condition TYPE mewicondition.
DATA:lt_condvalue TYPE TABLE OF mewiscalequan,
ls_condvalue TYPE mewiscalequan.
DATA:e_eina TYPE mewieina,
e_eine TYPE mewieine.
DATA:ls_log TYPE zshmm_015_log.
DATA:lv_index TYPE sy-index.
DATA:lv_matnr TYPE matnr.
DATA:lv_flag TYPE char1 VALUE '1' .
DATA:lt_werks TYPE STANDARD TABLE OF zscmwerks.
SELECT * FROM eina INTO TABLE @DATA(lt_eina).
SELECT * FROM eine INTO TABLE @DATA(lt_eine).
SELECT * FROM marc INTO TABLE @DATA(lt_marc).
SELECT * FROM mara INTO TABLE @DATA(lt_mara).
SELECT * FROM a017 INTO TABLE @DATA(lt_a017).
* BAPI创建参数
DATA:
lt_eina_new TYPE mewieina_mig_t, "一般数据
ls_eina_new TYPE mewieina_mig, "一般数据
lt_einax_new TYPE mewieinax_t,
ls_einax_new TYPE mewieinax_ty,
lt_eine_new TYPE mewieine_t, "采购组织数据
ls_eine_new TYPE mewieine_ty, "采购组织数据
lt_einex_new TYPE mewieinex_t,
ls_einex_new TYPE mewieinex_ty,
lt_cond_validity TYPE mewivalidity_tt, "条件有效期
ls_cond_validity TYPE mewivalidity_ty, "条件有效期
lt_condition_new TYPE mewicondition_tt, "条件明细
ls_condition_new TYPE mewicondition_ty, "条件明细
lt_eina_e TYPE mewieina_mig_t, "创建返回-一般数据
lt_eine_e TYPE mewieine_t, "创建返回-采购组织数据
lt_return TYPE fs4mig_t_bapiret2. "创建返回消息
DATA:ls_opt TYPE ctu_params,
lv_dismode TYPE ctu_params-dismode VALUE 'N',
lv_updmode TYPE ctu_params-updmode VALUE 'L',
lv_racommit TYPE ctu_params-racommit VALUE 'S',
lt_bdc_msg TYPE STANDARD TABLE OF bdcmsgcoll,
ls_bdc_msg TYPE bdcmsgcoll,
lt_bdcdata TYPE TABLE OF bdcdata,
lt_bdcdata_1 TYPE TABLE OF bdcdata.
"数据校验
CALL FUNCTION 'Z_FM_CM_CHECK_SYSTEM_COMPANY'
EXPORTING
im_system = 'SRM' "传入系统
im_flg_werks = abap_on
im_flg_vkorg = abap_on
TABLES
it_werks = lt_werks.
IF lt_werks IS NOT INITIAL.
SORT input-mt_mm090_purchaseinfo_sap_req-head BY lifnr matnr ekorg werks.
LOOP AT input-mt_mm090_purchaseinfo_sap_req-head ASSIGNING FIELD-SYMBOL(<fs_head>).
IF <fs_head>-werks IS NOT INITIAL.
READ TABLE lt_werks INTO DATA(Ls_werks) WITH KEY werks = <fs_head>-werks.
IF sy-subrc NE 0.
RETURN.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <fs_head>-matnr
IMPORTING
output = lv_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_head>-lifnr
IMPORTING
output = <fs_head>-lifnr.
AT NEW werks.
"判断数据是新增还是修改
READ TABLE lt_eina INTO DATA(ls_eina) WITH KEY matnr = lv_matnr lifnr = <fs_head>-lifnr.
IF sy-subrc <> 0.
lv_mode = 'I'."新增
ELSE.
READ TABLE lt_eine INTO DATA(ls_eine) WITH KEY infnr = ls_eina-infnr ekorg = <fs_head>-ekorg esokz = <fs_head>-esokz werks = <fs_head>-werks.
IF sy-subrc = 0.
lv_mode = 'M'."修改
ls_ieina-info_rec = ls_eina-infnr."采购信息记录号
ls_ieine-info_rec = ls_eina-infnr."
ls_ieinex-info_rec = 'X'.
ls_ieinax-vendor = 'X'.
ls_ieinax-material = 'X'.
ELSE.
lv_mode = 'I'."新增
ENDIF.
ENDIF.
ENDAT.
LOOP AT <fs_head>-item INTO DATA(ls_item).
"数据填写
ls_ieina-vendor = <fs_head>-lifnr."供应商
ls_ieina-material = lv_matnr."物料编码
"采购组织
ls_ieine-purch_org = <fs_head>-ekorg."采购组织
IF ls_ieine-purch_org IS NOT INITIAL.
ls_ieinex-purch_org = 'X'.
ENDIF.
ls_ieine-info_type = <fs_head>-esokz."信息类别
IF ls_ieine-info_type IS NOT INITIAL.
ls_ieinex-info_type = 'X'.
ENDIF.
ls_ieine-plant = <fs_head>-werks."工厂
IF ls_ieine-plant IS NOT INITIAL.
ls_ieinex-plant = 'X'.
ENDIF.
READ TABLE lt_marc INTO DATA(ls_marc) WITH KEY werks = <fs_head>-werks matnr = lv_matnr.
IF ls_marc-ekgrp IS NOT INITIAL.
ls_ieine-pur_group = ls_marc-ekgrp.
ls_ieinex-pur_group = abap_on.
ELSE.
ls_ieine-pur_group = 'F01'.
ls_ieinex-pur_group = abap_on.
ENDIF.
ls_ieine-currency = ls_item-waers."货币码
IF ls_ieine-currency IS NOT INITIAL.
ls_ieinex-currency = 'X'.
ENDIF.
ls_ieine-tax_code = ls_item-mwskz."税码
IF ls_ieine-tax_code IS NOT INITIAL.
ls_ieinex-tax_code = 'X'.
ENDIF.
ls_ieine-plnd_delry = ls_item-aplfz."计划交货时间(天)
IF ls_ieine-plnd_delry IS NOT INITIAL.
ls_ieinex-plnd_delry = 'X'.
ENDIF.
ls_ieine-net_price = ls_item-netpr."净价
IF ls_ieine-net_price IS NOT INITIAL.
ls_ieinex-net_price = 'X'.
ENDIF.
ls_ieine-nrm_po_qty = ls_item-norbm."标准数量
IF ls_ieine-nrm_po_qty IS NOT INITIAL.
ls_ieinex-nrm_po_qty = abap_on.
ENDIF.
ls_ieine-min_po_qty = ls_item-minbm."最小订单数量
IF ls_ieine-min_po_qty IS NOT INITIAL.
ls_ieinex-min_po_qty = abap_on.
ENDIF.
ls_ieine-gr_basediv = ls_item-webre."基于收货的发票校验
IF ls_ieine-gr_basediv IS NOT INITIAL.
ls_ieinex-gr_basediv = abap_on.
ENDIF.
ls_ieine-tax_code = ls_item-mwskz. "税码
IF ls_ieine-tax_code IS NOT INITIAL.
ls_ieinex-tax_code = abap_on.
ENDIF.
ls_ieine-price_unit = ls_item-peinh."价格单位
IF ls_ieine-price_unit IS NOT INITIAL.
ls_ieinex-price_unit = abap_on.
ENDIF.
"获取单位
READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = lv_matnr.
ls_ieine-orderpr_un = ls_mara-meins."采购单位
IF ls_ieine-orderpr_un IS NOT INITIAL.
ls_ieinex-orderpr_un = 'X'.
ENDIF.
READ TABLE lt_a017 INTO DATA(ls_a017) WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr kschl = ls_item-kschl1.
ls_con_vali-serial_id = ls_a017-knumh.
ls_con_vali-plant = <fs_head>-werks."工厂
ls_con_vali-valid_from = ls_item-datab1."有效起始日
ls_con_vali-valid_to = ls_item-datbi1."有效截止日
APPEND ls_con_vali TO lt_con_vali.
CLEAR:ls_con_vali.
IF ls_item-kschl1 IS NOT INITIAL.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '01'.
ls_condition-cond_type = ls_item-kschl1."固定值
ls_condition-currency = ls_item-waers."货币码
ls_condition-cond_value = ls_item-netpr."净价
ls_condition-cond_p_unt = ls_item-peinh."条件定价单位
ls_condition-cond_unit = ls_mara-meins."条件单位
APPEND ls_condition TO lt_condition.
CLEAR:ls_condition.
ENDIF.
IF ls_item-kschl2 IS NOT INITIAL.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '02'.
ls_condition-cond_type = ls_item-kschl2."固定值
ls_condition-currency = '%'."货币码
ls_condition-cond_value = ls_item-kbetr2 * 1000."净价
ls_condition-cond_p_unt = ls_item-peinh."条件定价单位
ls_condition-cond_unit = ls_mara-meins."条件单位
APPEND ls_condition TO lt_condition.
CLEAR:ls_condition.
ENDIF.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0001'.
ls_condvalue-cond_value = ls_item-netpr.
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
IF ls_item-kbetr_2 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0004'.
ls_condvalue-cond_value = ls_item-kbetr_2."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_2."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_3 IS NOT INITIAL.
* READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0007'.
ls_condvalue-cond_value = ls_item-kbetr_3."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_3."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_4 IS NOT INITIAL.
* READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0010'.
ls_condvalue-cond_value = ls_item-kbetr_4."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_4."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_5 IS NOT INITIAL.
* READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0013'.
ls_condvalue-cond_value = ls_item-kbetr_5."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_5."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_6 IS NOT INITIAL.
* READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0016'.
ls_condvalue-cond_value = ls_item-kbetr_6."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_6."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_7 IS NOT INITIAL.
* READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0019'.
ls_condvalue-cond_value = ls_item-kbetr_7."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_7."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
CLEAR:lt_return2.
IF lv_mode = 'I'.
lv_flag = '1'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_einax = ls_ieinax
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
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 AND lv_test = ''.
"创建时需要将数据写入到数据库里,不然报错
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
"因为净价和条件不能同时维护,所以分开维护
CLEAR:ls_ieinex-net_price.
CLEAR:lt_return2.
ls_ieina-info_rec = e_eina-info_rec."采购信息记录号
ls_ieine-info_rec = e_eina-info_rec."
ls_ieinex-info_rec = 'X'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_einax = ls_ieinax
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
condition = lt_condition
cond_scale_quan = lt_condvalue
return = lt_return2.
ENDIF.
ELSE.
"对数据进行修改
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_einax = ls_ieinax
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
return = lt_return2.
* "理论上这里可以不用commit就能更改条件
CLEAR:ls_ieinex-net_price."一定要清空这个变量,不然程序会报错
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
* i_einax = ls_ieinax
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
condition = lt_condition
cond_scale_quan = lt_condvalue
return = lt_return2.
ENDIF.
LOOP AT lt_return2 INTO DATA(ls_return) WHERE type CA 'EAX'.
CONCATENATE ls_log-message ls_return-message INTO ls_log-message.
output-mt_mm090_purchaseinfo_sap_res-message = ls_log-message.
output-mt_mm090_purchaseinfo_sap_res-status = 'E'.
ENDLOOP.
IF output-mt_mm090_purchaseinfo_sap_res-status = 'E'.
READ TABLE output-mt_mm090_purchaseinfo_sap_res-head INTO DATA(ls_ret) INDEX 1.
ls_ret-zsrmid = <fs_head>-zsrnid.
APPEND ls_ret TO output-mt_mm090_purchaseinfo_sap_res-head.
ls_log-zsrmid = <fs_head>-zsrnid.
ls_log-type = 'E'.
ls_log-message = ls_log-message.
ls_log-aedat1 = sy-datum.
ls_log-aedat2 = sy-uzeit.
MODIFY zshmm_015_log FROM ls_log .
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
output-mt_mm090_purchaseinfo_sap_res-message = TEXT-m02..
output-mt_mm090_purchaseinfo_sap_res-status = 'S'.
READ TABLE output-mt_mm090_purchaseinfo_sap_res-head INTO ls_ret INDEX 1.
ls_ret-zsrmid = <fs_head>-zsrnid.
ls_ret-infnr = e_eina-info_rec.
APPEND ls_ret TO output-mt_mm090_purchaseinfo_sap_res-head.
ls_log-zsrmid = <fs_head>-zsrnid.
ls_log-type = 'S'.
ls_log-infnr = e_eina-info_rec.
ls_log-message = ls_log-message.
ls_log-aedat1 = sy-datum.
ls_log-aedat2 = sy-uzeit.
MODIFY zshmm_015_log FROM ls_log .
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CLEAR:ls_ieina,ls_ieinax,
ls_ieine,ls_ieinex,
lt_con_vali,lt_condition,
ls_eina,lt_condvalue.
CLEAR:lt_return2.
ENDLOOP.
* AT END OF werks.
* ENDAT.
ELSE.
"如果工厂为空
SELECT werks,ekorg FROM t024w INTO TABLE @DATA(lt_t024w) WHERE ekorg = @<fs_head>-ekorg.
"数据必须先进行模拟测试后才可以进行创建,功能。
*-------------模拟功能------------------8
*-------------模拟功能------------------8
*-------------模拟功能------------------8
LOOP AT lt_t024w INTO DATA(ls_t024w).
lv_test = abap_on.
"凡是位数是2的工厂都是无价值工厂 根本不需要采购组织
IF ls_t024w-werks+3(1) NE '2'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <fs_head>-matnr
IMPORTING
output = lv_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_head>-lifnr
IMPORTING
output = <fs_head>-lifnr.
"判断数据是新增还是修改
READ TABLE lt_eina INTO ls_eina WITH KEY matnr = lv_matnr lifnr = <fs_head>-lifnr.
IF sy-subrc <> 0.
lv_mode = 'I'."新增
ELSE.
READ TABLE lt_eine INTO ls_eine WITH KEY infnr = ls_eina-infnr ekorg = <fs_head>-ekorg esokz = <fs_head>-esokz werks = ls_t024w-werks.
IF sy-subrc = 0.
lv_mode = 'M'."修改
ls_ieina-info_rec = ls_eina-infnr."采购信息记录号
ls_ieine-info_rec = ls_eina-infnr."
ls_ieinex-info_rec = 'X'.
ls_ieinax-vendor = 'X'.
ls_ieinax-material = 'X'.
ELSE.
lv_mode = 'I'."新增
ENDIF.
ENDIF.
LOOP AT <fs_head>-item INTO ls_item.
"数据填写
ls_ieina-vendor = <fs_head>-lifnr."供应商
ls_ieina-material = lv_matnr."物料编码
ls_ieine-purch_org = <fs_head>-ekorg."采购组织
IF ls_ieine-purch_org IS NOT INITIAL.
ls_ieinex-purch_org = 'X'.
ENDIF.
ls_ieine-info_type = <fs_head>-esokz."信息类别
IF ls_ieine-info_type IS NOT INITIAL.
ls_ieinex-info_type = 'X'.
ENDIF.
ls_ieine-plant = ls_t024w-werks."工厂
IF ls_ieine-plant IS NOT INITIAL.
ls_ieinex-plant = 'X'.
ENDIF.
READ TABLE lt_marc INTO ls_marc WITH KEY werks = ls_t024w-werks matnr = lv_matnr.
IF ls_marc-ekgrp IS NOT INITIAL.
ls_ieine-pur_group = ls_marc-ekgrp.
ls_ieinex-pur_group = abap_on.
ELSE.
ls_ieine-pur_group = 'F01'.
ls_ieinex-pur_group = abap_on.
ENDIF.
ls_ieine-currency = ls_item-waers."货币码
IF ls_ieine-currency IS NOT INITIAL.
ls_ieinex-currency = 'X'.
ENDIF.
ls_ieine-tax_code = ls_item-mwskz."税码
IF ls_ieine-tax_code IS NOT INITIAL.
ls_ieinex-tax_code = 'X'.
ENDIF.
ls_ieine-plnd_delry = ls_item-aplfz."计划交货时间(天)
IF ls_ieine-plnd_delry IS NOT INITIAL.
ls_ieinex-plnd_delry = 'X'.
ENDIF.
ls_ieine-net_price = ls_item-netpr."净价
IF ls_ieine-net_price IS NOT INITIAL.
ls_ieinex-net_price = 'X'.
ENDIF.
ls_ieine-nrm_po_qty = ls_item-norbm."标准数量
IF ls_ieine-nrm_po_qty IS NOT INITIAL.
ls_ieinex-nrm_po_qty = abap_on.
ENDIF.
ls_ieine-min_po_qty = ls_item-minbm."最小订单数量
IF ls_ieine-min_po_qty IS NOT INITIAL.
ls_ieinex-min_po_qty = abap_on.
ENDIF.
ls_ieine-gr_basediv = ls_item-webre."基于收货的发票校验
IF ls_ieine-gr_basediv IS NOT INITIAL.
ls_ieinex-gr_basediv = abap_on.
ENDIF.
ls_ieine-tax_code = ls_item-mwskz. "税码
IF ls_ieine-tax_code IS NOT INITIAL.
ls_ieinex-tax_code = abap_on.
ENDIF.
ls_ieine-price_unit = ls_item-peinh."价格单位
IF ls_ieine-price_unit IS NOT INITIAL.
ls_ieinex-price_unit = abap_on.
ENDIF.
"获取单位
READ TABLE lt_mara INTO ls_mara WITH KEY matnr = lv_matnr.
ls_ieine-orderpr_un = ls_mara-meins."采购单位
IF ls_ieine-orderpr_un IS NOT INITIAL.
ls_ieinex-orderpr_un = 'X'.
ENDIF.
READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr kschl = ls_item-kschl1.
ls_con_vali-serial_id = ls_a017-knumh.
ls_con_vali-plant = ls_t024w-werks."工厂
ls_con_vali-valid_from = ls_item-datab1."有效起始日
ls_con_vali-valid_to = ls_item-datbi1."有效截止日
APPEND ls_con_vali TO lt_con_vali.
CLEAR:ls_con_vali.
IF ls_item-kschl1 IS NOT INITIAL.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '01'.
ls_condition-cond_type = ls_item-kschl1."固定值
ls_condition-currency = ls_item-waers."货币码
ls_condition-cond_value = ls_item-netpr."净价
ls_condition-cond_p_unt = ls_item-peinh."条件定价单位
ls_condition-cond_unit = ls_mara-meins."条件单位
APPEND ls_condition TO lt_condition.
CLEAR:ls_condition.
ENDIF.
IF ls_item-kschl2 IS NOT INITIAL.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '02'.
ls_condition-cond_type = ls_item-kschl2."固定值
ls_condition-currency = '%'."货币码
ls_condition-cond_value = ls_item-kbetr2 * 1000."净价
ls_condition-cond_p_unt = ls_item-peinh."条件定价单位
ls_condition-cond_unit = ls_mara-meins."条件单位
APPEND ls_condition TO lt_condition.
CLEAR:ls_condition.
ENDIF.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0001'.
ls_condvalue-cond_value = ls_item-netpr.
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
IF ls_item-kbetr_2 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0004'.
ls_condvalue-cond_value = ls_item-kbetr_2."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_2."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_3 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0007'.
ls_condvalue-cond_value = ls_item-kbetr_3."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_3."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_4 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0010'.
ls_condvalue-cond_value = ls_item-kbetr_4."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_4."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_5 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0013'.
ls_condvalue-cond_value = ls_item-kbetr_5."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_5."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_6 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0016'.
ls_condvalue-cond_value = ls_item-kbetr_6."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_6."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_7 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0019'.
ls_condvalue-cond_value = ls_item-kbetr_7."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_7."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
ENDLOOP.
CLEAR:lt_return2.
IF lv_mode = 'I'..
"无工厂数据需要模拟创建功能来判断数据是否正确
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
return = lt_return2.
ELSE.
ENDIF.
LOOP AT lt_return2 INTO ls_return WHERE type CA 'EAX'.
CONCATENATE ls_log-message ls_return-message INTO ls_log-message.
output-mt_mm090_purchaseinfo_sap_res-message = ls_log-message.
output-mt_mm090_purchaseinfo_sap_res-status = 'E'.
READ TABLE output-mt_mm090_purchaseinfo_sap_res-head INTO ls_ret INDEX 1.
ls_ret-zsrmid = <fs_head>-zsrnid.
ls_ret-infnr = ' '.
APPEND ls_ret TO output-mt_mm090_purchaseinfo_sap_res-head.
RETURN.
ENDLOOP.
IF sy-subrc NE 0.
CLEAR:lv_test.
ENDIF.
CLEAR:ls_ieina,ls_ieinax,
ls_ieine,ls_ieinex,
lt_con_vali,lt_condition,
ls_eina,lt_condvalue.
CLEAR:lt_return2.
"采购组织
ENDIF.
ENDLOOP.
"正式运行
"正式运行
"正式运行
LOOP AT lt_t024w INTO ls_t024w.
lv_flag = '1'.
"凡是位数是2的工厂都是无价值工厂 根本不需要采购组织
IF ls_t024w-werks+3(1) NE '2'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <fs_head>-matnr
IMPORTING
output = lv_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_head>-lifnr
IMPORTING
output = <fs_head>-lifnr.
"判断数据是新增还是修改
READ TABLE lt_eina INTO ls_eina WITH KEY matnr = lv_matnr lifnr = <fs_head>-lifnr.
IF sy-subrc <> 0.
lv_mode = 'I'."新增
ELSE.
READ TABLE lt_eine INTO ls_eine WITH KEY infnr = ls_eina-infnr ekorg = <fs_head>-ekorg esokz = <fs_head>-esokz werks = ls_t024w-werks.
IF sy-subrc = 0.
lv_mode = 'M'."修改
ls_ieina-info_rec = ls_eina-infnr."采购信息记录号
ls_ieine-info_rec = ls_eina-infnr."
ls_ieinex-info_rec = 'X'.
ls_ieinax-vendor = 'X'.
ls_ieinax-material = 'X'.
ELSE.
lv_mode = 'I'."新增
ENDIF.
ENDIF.
LOOP AT <fs_head>-item INTO ls_item.
"数据填写
ls_ieina-vendor = <fs_head>-lifnr."供应商
ls_ieina-material = lv_matnr."物料编码
ls_ieine-purch_org = <fs_head>-ekorg."采购组织
IF ls_ieine-purch_org IS NOT INITIAL.
ls_ieinex-purch_org = 'X'.
ENDIF.
ls_ieine-info_type = <fs_head>-esokz."信息类别
IF ls_ieine-info_type IS NOT INITIAL.
ls_ieinex-info_type = 'X'.
ENDIF.
ls_ieine-plant = ls_t024w-werks."工厂
IF ls_ieine-plant IS NOT INITIAL.
ls_ieinex-plant = 'X'.
ENDIF.
READ TABLE lt_marc INTO ls_marc WITH KEY werks = ls_t024w-werks matnr = lv_matnr.
IF ls_marc-ekgrp IS NOT INITIAL.
ls_ieine-pur_group = ls_marc-ekgrp.
ls_ieinex-pur_group = abap_on.
ELSE.
ls_ieine-pur_group = 'F01'.
ls_ieinex-pur_group = abap_on.
ENDIF.
ls_ieine-currency = ls_item-waers."货币码
IF ls_ieine-currency IS NOT INITIAL.
ls_ieinex-currency = 'X'.
ENDIF.
ls_ieine-tax_code = ls_item-mwskz."税码
IF ls_ieine-tax_code IS NOT INITIAL.
ls_ieinex-tax_code = 'X'.
ENDIF.
ls_ieine-plnd_delry = ls_item-aplfz."计划交货时间(天)
IF ls_ieine-plnd_delry IS NOT INITIAL.
ls_ieinex-plnd_delry = 'X'.
ENDIF.
ls_ieine-net_price = ls_item-netpr."净价
IF ls_ieine-net_price IS NOT INITIAL.
ls_ieinex-net_price = 'X'.
ENDIF.
ls_ieine-nrm_po_qty = ls_item-norbm."标准数量
IF ls_ieine-nrm_po_qty IS NOT INITIAL.
ls_ieinex-nrm_po_qty = abap_on.
ENDIF.
ls_ieine-min_po_qty = ls_item-minbm."最小订单数量
IF ls_ieine-min_po_qty IS NOT INITIAL.
ls_ieinex-min_po_qty = abap_on.
ENDIF.
ls_ieine-gr_basediv = ls_item-webre."基于收货的发票校验
IF ls_ieine-gr_basediv IS NOT INITIAL.
ls_ieinex-gr_basediv = abap_on.
ENDIF.
ls_ieine-tax_code = ls_item-mwskz. "税码
IF ls_ieine-tax_code IS NOT INITIAL.
ls_ieinex-tax_code = abap_on.
ENDIF.
ls_ieine-price_unit = ls_item-peinh."价格单位
IF ls_ieine-price_unit IS NOT INITIAL.
ls_ieinex-price_unit = abap_on.
ENDIF.
"获取单位
READ TABLE lt_mara INTO ls_mara WITH KEY matnr = lv_matnr.
ls_ieine-orderpr_un = ls_mara-meins."采购单位
IF ls_ieine-orderpr_un IS NOT INITIAL.
ls_ieinex-orderpr_un = 'X'.
ENDIF.
READ TABLE lt_a017 INTO ls_a017 WITH KEY lifnr = <fs_head>-lifnr matnr = lv_matnr kschl = ls_item-kschl1.
ls_con_vali-serial_id = ls_a017-knumh.
ls_con_vali-plant = ls_t024w-werks."工厂
ls_con_vali-valid_from = ls_item-datab1."有效起始日
ls_con_vali-valid_to = ls_item-datbi1."有效截止日
APPEND ls_con_vali TO lt_con_vali.
CLEAR:ls_con_vali.
IF ls_item-kschl1 IS NOT INITIAL.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '01'.
ls_condition-cond_type = ls_item-kschl1."固定值
ls_condition-currency = ls_item-waers."货币码
ls_condition-cond_value = ls_item-netpr."净价
ls_condition-cond_p_unt = ls_item-peinh."条件定价单位
ls_condition-cond_unit = ls_mara-meins."条件单位
APPEND ls_condition TO lt_condition.
CLEAR:ls_condition.
ENDIF.
IF ls_item-kschl2 IS NOT INITIAL.
ls_condition-serial_id = ls_a017-knumh.
ls_condition-cond_count = '02'.
ls_condition-cond_type = ls_item-kschl2."固定值
ls_condition-currency = '%'."货币码
ls_condition-cond_value = ls_item-kbetr2 * 1000."净价
ls_condition-cond_p_unt = ls_item-peinh."条件定价单位
ls_condition-cond_unit = ls_mara-meins."条件单位
APPEND ls_condition TO lt_condition.
CLEAR:ls_condition.
ENDIF.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0001'.
ls_condvalue-cond_value = ls_item-netpr.
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
IF ls_item-kbetr_2 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0004'.
ls_condvalue-cond_value = ls_item-kbetr_2."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_2."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_3 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0007'.
ls_condvalue-cond_value = ls_item-kbetr_3."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_3."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_4 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0010'.
ls_condvalue-cond_value = ls_item-kbetr_4."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_4."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_5 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0013'.
ls_condvalue-cond_value = ls_item-kbetr_5."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_5."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_6 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0016'.
ls_condvalue-cond_value = ls_item-kbetr_6."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_6."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
IF ls_item-kbetr_7 IS NOT INITIAL.
ls_condvalue-serial_no = ls_a017-knumh.
ls_condvalue-cond_count = '01'.
ls_condvalue-line_no = '0019'.
ls_condvalue-cond_value = ls_item-kbetr_7."阶梯价格2
ls_condvalue-scale_base_qty = ls_item-kstbm_7."阶梯价格数量2
APPEND ls_condvalue TO lt_condvalue.
CLEAR:ls_condvalue.
ENDIF.
ENDLOOP.
CLEAR:lt_return2.
IF lv_mode = 'I'..
"无工厂数据需要模拟创建功能来判断数据是否正确
lv_flag = '1'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
return = lt_return2.
READ TABLE lt_return2 INTO ls_return2 WITH KEY type = 'E'.
IF sy-subrc <> 0 AND lv_test = ''.
"创建时需要将数据写入到数据库里,不然报错
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
"因为净价和条件不能同时维护,所以分开维护
CLEAR:ls_ieinex-net_price.
CLEAR:lt_return2.
ls_ieina-info_rec = e_eina-info_rec."采购信息记录号
ls_ieine-info_rec = e_eina-info_rec."
ls_ieinex-info_rec = 'X'.
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
condition = lt_condition
cond_scale_quan = lt_condvalue
return = lt_return2.
ENDIF.
ELSE.
"对数据进行修改
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_einax = ls_ieinax
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
return = lt_return2.
"理论上这里可以不用commit就能更改条件
CLEAR:ls_ieinex-net_price."一定要清空这个变量,不然程序会报错
CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
EXPORTING
i_eina = ls_ieina
i_eine = ls_ieine
i_einex = ls_ieinex
testrun = lv_test
IMPORTING
e_eina = e_eina
e_eine = e_eine
TABLES
cond_validity = lt_con_vali
condition = lt_condition
cond_scale_quan = lt_condvalue
return = lt_return2.
ENDIF.
LOOP AT lt_return2 INTO ls_return WHERE type CA 'EAX'.
CONCATENATE ls_log-message ls_return-message INTO ls_log-message.
output-mt_mm090_purchaseinfo_sap_res-message = ls_log-message.
output-mt_mm090_purchaseinfo_sap_res-status = 'E'..
ENDLOOP.
IF output-mt_mm090_purchaseinfo_sap_res-status = 'E'.
READ TABLE output-mt_mm090_purchaseinfo_sap_res-head INTO ls_ret INDEX 1.
ls_ret-zsrmid = <fs_head>-zsrnid.
APPEND ls_ret TO output-mt_mm090_purchaseinfo_sap_res-head.
ls_log-zsrmid = <fs_head>-zsrnid.
ls_log-type = 'E'.
ls_log-message = ls_log-message.
ls_log-aedat1 = sy-datum.
ls_log-aedat2 = sy-uzeit.
MODIFY zshmm_015_log FROM ls_log .
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
output-mt_mm090_purchaseinfo_sap_res-message = TEXT-m02..
output-mt_mm090_purchaseinfo_sap_res-status = 'S'.
READ TABLE output-mt_mm090_purchaseinfo_sap_res-head INTO ls_ret INDEX 1.
ls_ret-zsrmid = <fs_head>-zsrnid.
ls_ret-infnr = e_eina-info_rec.
APPEND ls_ret TO output-mt_mm090_purchaseinfo_sap_res-head.
CLEAR:ls_ret,e_eina.
ls_log-zsrmid = <fs_head>-zsrnid.
ls_log-type = 'S'.
ls_log-infnr = e_eina-info_rec.
ls_log-message = ls_log-message.
ls_log-aedat1 = sy-datum.
ls_log-aedat2 = sy-uzeit.
MODIFY zshmm_015_log FROM ls_log .
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CLEAR:ls_ieina,ls_ieinax,
ls_ieine,ls_ieinex,
lt_con_vali,lt_condition,
ls_eina,lt_condvalue.
CLEAR:lt_return2.
"采购组织
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDIF.
ENDFUNCTION.
项目记录,遇到一些问题,就是开始日期为不能是当前日期,求高手可以给解答一下,顺便做一些记录