前言
采用BDC创建客商主数据复用性低,且时常发生错误,比如字段必输性调整造成报错等
现通过API或BAPI去查询,创建,修改,锁定
以下为实际做的一个RFC接口
范例代码
供应商主数据创建查询修改锁定
FUNCTION zfm_pi_rfc_vendor_mas.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IT_HEADER_INFO) TYPE ZZT__PARTNER_H OPTIONAL
*" VALUE(IT_BANK_INFO) TYPE ZET__BANK_INFO OPTIONAL
*" EXPORTING
*" VALUE(ET_RETURN_INFO) TYPE ZET__MAS_RETURN
*"----------------------------------------------------------------------
* DATA:BEGIN OF ls_header_info,
* result TYPE char1.
* INCLUDE STRUCTURE zzs__partner_h.
* DATA:END OF ls_header_info.
DATA:ls_return TYPE zes__mas_return,
lt_header_info TYPE zzt__partner_h,
lt_header_n TYPE zzt__partner_h, "经营性客商数据
* lt_header_info LIKE STANDARD TABLE OF ls_header_info,
lt_bank_info TYPE zet__bank_info,
lt_bank TYPE TABLE OF zzt_epic_bnka,
lt_bank_n TYPE TABLE OF zzt_epic_bnka, "经营性客商银行数据
ls_bank_info TYPE zzt_epic_bnka,
lv_lifnr TYPE lifnr,
lv_index TYPE int4,
lv_count TYPE int4,
lv_next_num(4) TYPE n,
lv_str TYPE string,
BEGIN OF ls_ktokk,
ktokk TYPE ktokk,
next_num(4) TYPE n,
lifnr6 TYPE char6,
END OF ls_ktokk,
lt_ktokk LIKE STANDARD TABLE OF ls_ktokk,
lt_brnch_d TYPE TABLE OF fitha_brnch_t,
ls_brnch_d TYPE fitha_brnch_t,
lt_brnch TYPE TABLE OF fitha_brnch,
ls_brnch TYPE fitha_brnch,
* BEGIN OF ls_lifnr,
* unique_number TYPE guid,
* partner TYPE objkt,
* bukrs TYPE bukrs,
* lifnr TYPE lifnr,
* END OF ls_lifnr,
* lt_lifnr_l LIKE STANDARD TABLE OF ls_lifnr,
lv_test TYPE xfeld,
ls_master_data TYPE vmds_ei_main,
ls_ei_main TYPE vmds_ei_main,
ls_vendor TYPE vmds_ei_extern,
ls_error TYPE cvis_message,
ls_message TYPE cvis_message,
* lt_msg TYPE bapiret2_t,
ls_msg TYPE bapiret2,
* lt_bapiret1 TYPE TABLE OF bapiret1 WITH HEADER LINE,
* lt_bapiret1 TYPE TABLE OF bapiret1,
ls_bapiret1 LIKE bapiret1,
lv_cre_err TYPE char1,
lt_vend TYPE vmds_ei_extern_t,
lwa_vend TYPE vmds_ei_extern,
lt_company TYPE vmds_ei_company_t,
lwa_company TYPE vmds_ei_company,
* lt_bankdetails TYPE cvis_ei_bankdetail_t,
* lwa_bankdetails TYPE cvis_ei_cvi_bankdetail, "CVIS_EI_BANKDETAIL.
* lt_purchasing TYPE vmds_ei_purchasing_t,
* lwa_purchasing TYPE vmds_ei_purchasing,
* lt_functions TYPE vmds_ei_functions_t,
* lwa_functions TYPE vmds_ei_functions,
lt_smtp_str TYPE cvis_ei_smtp_t,
ls_smtp_str TYPE cvis_ei_smtp_str,
* lo_vendor TYPE REF TO zcl_if__co_si_ecc__statu, "STATUS接口
lv_tgsys TYPE tbdlst-logsys,
lv_msg TYPE string,
lv_type TYPE syst_msgty,
lv_diff TYPE char1,
BEGIN OF ls_namet,
name1 TYPE name1_gp,
name2 TYPE name2_gp,
name3 TYPE name3_gp,
name4 TYPE name4_gp,
name_cn TYPE char70,
name_en TYPE char70,
END OF ls_namet,
lt_namet LIKE STANDARD TABLE OF ls_namet.
FIELD-SYMBOLS:<fs_ktokk> LIKE ls_ktokk,
* <ls_message> TYPE bapiret2,
<fs_bank> LIKE zes__bank_info.
CONSTANTS:lc_numrg TYPE numkr VALUE '02', "创建 规定区间
lc_object TYPE inri-object VALUE 'KREDITOR'. "供应商 编号对象
* 校验必输性 筛除错误数据
IF it_header_info[] IS NOT INITIAL.
MOVE-CORRESPONDING it_header_info[] TO lt_header_info.
* 去除测试数据
DELETE lt_header_info WHERE partner EQ '?'.
SORT lt_header_info BY partner bukrs.
LOOP AT lt_header_info ASSIGNING FIELD-SYMBOL(<fs_header>).
lv_index = sy-tabix.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_header>-partner
IMPORTING
output = lv_lifnr.
<fs_header>-partner = lv_lifnr.
* CHECK ls_header-zzjyx EQ 'N'.
"当客商是 经营性的时候, 不会修改客商内容,且不校验客商字段必输性
* N为非经营性
IF <fs_header>-zzjyx NE 'N'.
APPEND <fs_header> TO lt_header_n.
DELETE lt_header_info INDEX lv_index.
ENDIF.
ENDLOOP.
* 限制账户组
SELECT ktokk,numkr INTO TABLE @DATA(lt_t077k)
FROM t077k
WHERE numkr EQ @lc_numrg.
IF sy-subrc EQ 0.
CLEAR:lv_str.
LOOP AT lt_t077k INTO DATA(ls_t077k).
IF lv_str IS INITIAL.
lv_str = ls_t077k-ktokk.
ELSE.
lv_str = lv_str && ',' && ls_t077k-ktokk.
ENDIF.
ENDLOOP.
SORT lt_t077k BY ktokk.
LOOP AT lt_header_info ASSIGNING <fs_header>.
lv_index = sy-tabix.
READ TABLE lt_t077k WITH KEY ktokk = <fs_header>-ktokk TRANSPORTING NO FIELDS.
IF sy-subrc NE 0.
ls_return-unique_number = <fs_header>-unique_number.
ls_return-partner = <fs_header>-partner.
ls_return-bukrs = <fs_header>-bukrs.
ls_return-error_msg = text-021 && lv_str && text-022."账户组不能为规定以外的.
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
DELETE lt_header_info INDEX lv_index.
ENDIF.
ENDLOOP.
ELSE.
ls_return-unique_number = <fs_header>-unique_number.
ls_return-partner = <fs_header>-partner.
ls_return-bukrs = <fs_header>-bukrs.
ls_return-error_msg = text-023."账户组未维护间隔
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
CLEAR:lt_header_info.
RETURN.
ENDIF.
LOOP AT lt_header_info INTO DATA(ls_header).
lv_index = sy-tabix.
IF ls_header-process_type IS INITIAL OR ls_header-sr_number IS INITIAL.
IF ls_header-process_type NE 'V'. "在V的时候不检查SR_NUMBER
CLEAR:ls_return.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-error_msg = text-008."'处理类型、服务请求编号不能为空!'.
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
DELETE lt_header_info INDEX lv_index.
EXIT.
ENDIF.
ENDIF.
CALL FUNCTION 'BAPI_VENDOR_GETDETAIL'
EXPORTING
vendorno = ls_header-partner
companycode = ls_header-bukrs
IMPORTING
* GENERALDETAIL =
* COMPANYDETAIL =
return = ls_bapiret1
* TABLES
* BANKDETAIL =
* VENDORIBANDETAIL =
.
IF ls_bapiret1-type EQ 'E'.
IF ls_bapiret1-id EQ 'FN' AND ls_bapiret1-number EQ '521'.
CASE ls_header-process_type.
WHEN 'C' OR 'V'.
* EXIT.
WHEN 'U' OR 'L'.
ls_return-error_msg = ls_bapiret1-message.
lv_cre_err = abap_true.
* EXIT.
WHEN OTHERS.
ENDCASE.
ELSE.
IF ls_bapiret1-id EQ 'FN' AND ls_bapiret1-number EQ '522' .
IF ls_header-process_type EQ 'U' OR ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
ELSE.
lv_cre_err = abap_true.
ls_return-error_msg = ls_return-error_msg && ' ' && ls_bapiret1-message.
ENDIF.
ELSE.
lv_cre_err = abap_true.
ls_return-error_msg = ls_return-error_msg && ' ' && ls_bapiret1-message.
ENDIF.
ENDIF.
ENDIF.
* 判断当类型为U时 判断主数据是否发生变动
* 有变动 有未清项不能改,无未清项可以修改
IF ls_header-process_type EQ 'U'.
CLEAR:lv_diff.
SELECT SINGLE * INTO @DATA(ls_lfa1_u)
FROM lfa1
WHERE lifnr EQ @ls_header-partner.
IF sy-subrc EQ 0.
IF ls_header-stcd1 NE ls_lfa1_u-stcd1 AND ls_header-stcd1 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-stcd2 NE ls_lfa1_u-stcd2 AND ls_header-stcd2 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-stcd3 NE ls_lfa1_u-stcd3 AND ls_header-stcd3 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-stcd4 NE ls_lfa1_u-stcd4 AND ls_header-stcd4 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-stcd5 NE ls_lfa1_u-stcd5 AND ls_header-stcd5 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-stceg NE ls_lfa1_u-stceg AND ls_header-stceg IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-ktokk NE ls_lfa1_u-ktokk AND ls_header-ktokk IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-land1 NE ls_lfa1_u-land1 AND ls_header-land1 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-ort01 NE ls_lfa1_u-ort01 AND ls_header-ort01 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-stras NE ls_lfa1_u-stras AND ls_header-stras IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_header-telf1 NE ls_lfa1_u-telf1 AND ls_header-telf1 IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
* 称谓
IF lv_diff NE abap_true.
IF ls_lfa1_u-anred IS NOT INITIAL.
SELECT * INTO TABLE @DATA(lt_tsad3t)
FROM tsad3t.
IF sy-subrc EQ 0.
SORT lt_tsad3t BY title_medi.
DELETE ADJACENT DUPLICATES FROM lt_tsad3t COMPARING title_medi.
READ TABLE lt_tsad3t INTO DATA(ls_tsad3t) WITH KEY title_medi = ls_lfa1_u-anred BINARY SEARCH.
IF sy-subrc EQ 0 AND ls_tsad3t-title NE ls_header-title AND ls_header-title IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
ENDIF.
ELSE.
IF ls_header-title IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
ENDIF.
ENDIF.
IF lv_diff NE abap_true.
SELECT SINGLE * INTO @DATA(ls_addr6)
FROM adr6
WHERE addrnumber EQ @ls_lfa1_u-adrnr.
IF sy-subrc EQ 0 AND ls_addr6-smtp_addr NE ls_header-email_addr.
lv_diff = abap_true.
ENDIF.
ENDIF.
IF lv_diff NE abap_true.
SELECT SINGLE * INTO @DATA(ls_lfb1_u)
FROM lfb1
WHERE lifnr EQ @ls_header-partner
AND bukrs EQ @ls_header-bukrs.
IF sy-subrc EQ 0.
IF ls_lfb1_u-akont NE ls_header-akont AND ls_header-akont IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_lfb1_u-fdgrv NE ls_header-fdgrv AND ls_header-fdgrv IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
IF ls_lfb1_u-zuawa NE ls_header-zuawa AND ls_header-zuawa IS NOT INITIAL.
lv_diff = abap_true.
ENDIF.
ELSE.
lv_diff = abap_true.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* END ADD
* 校验修改时客商下是否有未清项
IF ls_header-partner IS NOT INITIAL AND ls_header-process_type EQ 'U'.
IF lv_diff EQ abap_true.
SELECT COUNT(*)
FROM bsik
WHERE lifnr = ls_header-partner.
IF sy-subrc EQ 0.
lv_cre_err = abap_true.
ls_return-error_msg = text-024.
ENDIF.
ENDIF.
ENDIF.
* 税号必输
CASE ls_header-land1.
WHEN 'CN'.
* IF ls_header-stcd3 IS INITIAL. "cn调整为增值税号必填
IF ls_header-stceg IS INITIAL.
lv_cre_err = abap_true.
ls_return-error_msg = ls_header-land1 && text-032.
ENDIF.
* IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
IF ls_header-process_type EQ 'C'."C创建才校验
* 校验增值税登记号在当前系统是否存在
IF ls_header-stceg IS NOT INITIAL.
* CLEAR:lv_index.
* SELECT COUNT(*) INTO lv_index
CLEAR:lv_count.
SELECT COUNT(*) INTO lv_count
* END MODIFY
FROM lfa1
WHERE stceg EQ ls_header-stceg.
* IF lv_index GE 1.
IF lv_count GE 1.
* END MODIFY
lv_cre_err = abap_true.
ls_return-error_msg = text-035.
ENDIF.
ENDIF.
* 校验供应商名称在当前系统中是否存在
IF lt_t077k IS NOT INITIAL.
SELECT name1 name2 name3 name4 INTO CORRESPONDING FIELDS OF TABLE lt_namet
FROM lfa1
FOR ALL ENTRIES IN lt_t077k
WHERE ktokk EQ lt_t077k-ktokk.
IF sy-subrc EQ 0.
LOOP AT lt_namet ASSIGNING FIELD-SYMBOL(<fs_namet>).
<fs_namet>-name_cn = <fs_namet>-name1 && <fs_namet>-name2.
<fs_namet>-name_en = <fs_namet>-name3 && <fs_namet>-name4.
ENDLOOP.
ENDIF.
IF ls_header-name_cn IS NOT INITIAL.
SORT lt_namet BY name_cn.
DELETE ADJACENT DUPLICATES FROM lt_namet COMPARING name_cn.
READ TABLE lt_namet WITH KEY name_cn = ls_header-name_cn BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
lv_cre_err = abap_true.
ls_return-error_msg = text-036.
ENDIF.
ENDIF.
IF ls_header-name_en IS NOT INITIAL.
SORT lt_namet BY name_en.
DELETE ADJACENT DUPLICATES FROM lt_namet COMPARING name_en.
READ TABLE lt_namet WITH KEY name_en = ls_header-name_en BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
lv_cre_err = abap_true.
ls_return-error_msg = text-036.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
IF lv_cre_err EQ abap_true.
DELETE lt_header_info INDEX lv_index.
* CLEAR:ls_return.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
CLEAR:lv_cre_err.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
IF it_bank_info[] IS NOT INITIAL.
IF lt_header_n IS NOT INITIAL.
SORT lt_header_n BY partner bukrs.
ENDIF.
MOVE-CORRESPONDING it_bank_info[] TO lt_bank_info.
LOOP AT lt_bank_info ASSIGNING <fs_bank>.
lv_index = sy-tabix.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_bank>-partner
IMPORTING
output = lv_lifnr.
<fs_bank>-partner = lv_lifnr.
* READ TABLE lt_header_n WITH KEY partner = <fs_bank>-partner bukrs = <fs_bank>-bukrs TRANSPORTING NO FIELDS BINARY SEARCH.
READ TABLE lt_header_n INTO ls_header WITH KEY partner = <fs_bank>-partner bukrs = <fs_bank>-bukrs BINARY SEARCH.
* IF sy-subrc EQ 0. " 应只有u或c的时候才append
IF sy-subrc EQ 0 AND ( ls_header-process_type EQ 'U' OR ls_header-process_type = 'C' ).
APPEND <fs_bank> TO lt_bank_n.
DELETE lt_bank_info INDEX lv_index.
ENDIF.
ENDLOOP.
SORT lt_header_info BY partner bukrs.
* 去除测试数据
DELETE lt_bank_info WHERE partner EQ '?'.
LOOP AT lt_bank_info INTO DATA(ls_bank).
lv_index = sy-tabix.
IF ls_bank-partner IS INITIAL OR ls_bank-bukrs IS INITIAL OR ls_bank-land1 IS INITIAL
OR ls_bank-bankl IS INITIAL OR ls_bank-ziban IS INITIAL
OR ls_bank-waers IS INITIAL.
CLEAR:ls_return.
ls_return-error_msg = text-009."'供应商编号、公司代码、国家代码、开户行联行号、银行账号、账户币种 均不能为空'.
LOOP AT lt_header_info INTO ls_header WHERE partner EQ ls_bank-partner AND bukrs EQ ls_bank-bukrs.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
EXIT.
ENDLOOP.
DELETE lt_bank_info INDEX lv_index.
DELETE lt_header_info WHERE partner EQ ls_bank-partner.
ENDIF.
IF ls_bank-land1 NE 'CN' AND ( ls_bank-ziban IS INITIAL OR ls_bank-swift IS INITIAL ). "海外iban swift必输
CLEAR:ls_return.
ls_return-error_msg = text-026.
LOOP AT lt_header_info INTO ls_header WHERE partner EQ ls_bank-partner AND bukrs EQ ls_bank-bukrs.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
EXIT.
ENDLOOP.
DELETE lt_bank_info INDEX lv_index.
DELETE lt_header_info WHERE partner EQ ls_bank-partner.
ENDIF.
ENDLOOP.
ENDIF.
* 处理主数据
IF lt_header_info IS NOT INITIAL.
LOOP AT lt_header_info INTO ls_header.
CLEAR:ls_return,lt_vend,lt_smtp_str.
lv_index = sy-tabix.
CASE ls_header-process_type.
WHEN 'C' OR 'U' OR 'V'. "C--创建(Create) U--更改(UPDATE) V--校验(VALIDATION)
CLEAR:ls_master_data,ls_return,lv_lifnr.
IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
* 供应商外部给号
IF ls_header-ktokk IS NOT INITIAL.
* 限定供应商码 分配的区间为20000MG往上
READ TABLE lt_ktokk ASSIGNING <fs_ktokk> INDEX 1."WITH KEY ktokk = ls_header-ktokk ASSIGNING <fs_ktokk>.
IF sy-subrc NE 0.
SELECT MAX( lifnr ) INTO lv_lifnr
FROM lfa1
WHERE lifnr LIKE '2000M%'.
IF sy-subrc NE 0.
* 一个都没读取到 给一个最初的间隔
lv_lifnr = '2000MG0000'.
ELSE.
PERFORM frm_get_next_number_vendor CHANGING lv_lifnr.
lwa_vend-header-object_instance-lifnr = lv_lifnr."lv_lifnr+0(6) && lv_next_num.
ls_ktokk-next_num = lv_lifnr+6(4)."lv_next_num.
ls_ktokk-lifnr6 = lv_lifnr+0(6).
IF lt_ktokk IS INITIAL.
APPEND ls_ktokk TO lt_ktokk.
ENDIF.
ENDIF.
ELSE.
lv_lifnr = <fs_ktokk>-lifnr6 && <fs_ktokk>-next_num.
PERFORM frm_get_next_number_vendor CHANGING lv_lifnr.
lwa_vend-header-object_instance-lifnr = lv_lifnr."ls_ktokk-lifnr6 && lv_next_num.
<fs_ktokk>-next_num = lv_lifnr+6(4)."lv_next_num.
<fs_ktokk>-lifnr6 = lv_lifnr+0(6).
ENDIF.
ELSE.
* 报错 没有账户组
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'E'.
ls_return-error_msg = text-034."'账户组不能为空。'.
APPEND ls_return TO et_return_info.
EXIT.
ENDIF.
lwa_vend-header-object_instance-lifnr = lv_lifnr.
* ls_return-error_msg = text-001." '供应商主数据创建成功!'.
lwa_vend-header-object_task = 'I'.
lwa_vend-central_data-address-task = 'I'.
IF ls_header-process_type EQ 'V'.
DELETE lt_header_info WHERE process_type NE 'V'.
ENDIF.
ELSEIF ls_header-process_type EQ 'U'.
lwa_vend-header-object_task = 'M'.
lwa_vend-central_data-address-task = 'M'.
* ls_return-error_msg = text-002."'供应商主数据更新成功!'.
ENDIF.
* 主数据
IF ls_header-process_type EQ 'U'.
lwa_vend-header-object_instance-lifnr = ls_header-partner.
ENDIF.
lwa_vend-central_data-central-data-ktokk = ls_header-ktokk.
lwa_vend-central_data-central-datax-ktokk = 'X'.
lwa_vend-central_data-central-data-stcd1 = ls_header-stcd1.
lwa_vend-central_data-central-datax-stcd1 = 'X'.
lwa_vend-central_data-central-data-stcd2 = ls_header-stcd2.
lwa_vend-central_data-central-datax-stcd2 = 'X'.
lwa_vend-central_data-central-data-stcd3 = ls_header-stcd3.
lwa_vend-central_data-central-datax-stcd3 = 'X'.
lwa_vend-central_data-central-data-stcd4 = ls_header-stcd4.
lwa_vend-central_data-central-datax-stcd4 = 'X'.
lwa_vend-central_data-central-data-stcd5 = ls_header-stcd5.
lwa_vend-central_data-central-datax-stcd5 = 'X'.
lwa_vend-central_data-central-data-stceg = ls_header-stceg.
lwa_vend-central_data-central-datax-stceg = 'X'.
lwa_vend-central_data-central-data-sperr = ls_header-sperr.
lwa_vend-central_data-central-datax-sperr = 'X'.
* 地址数据
IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
lwa_vend-central_data-address-task = 'I'.
ELSE.
lwa_vend-central_data-address-task = 'M'.
ENDIF.
lwa_vend-central_data-address-postal-data-postl_cod1 = ls_header-pstlz. "城市邮编
lwa_vend-central_data-address-postal-datax-postl_cod1 = 'X'.
lwa_vend-central_data-address-postal-data-title = ls_header-title.
lwa_vend-central_data-address-postal-datax-title = 'X'.
lwa_vend-central_data-address-postal-data-langu = sy-langu.
lwa_vend-central_data-address-postal-datax-langu = 'X'.
lwa_vend-central_data-address-postal-data-country = ls_header-land1.
lwa_vend-central_data-address-postal-datax-county = 'X'.
lwa_vend-central_data-address-postal-data-city = ls_header-ort01.
lwa_vend-central_data-address-postal-datax-city = 'X'.
lwa_vend-central_data-address-postal-data-street = ls_header-stras.
lwa_vend-central_data-address-postal-datax-street = 'X'.
lwa_vend-central_data-address-postal-data-name = ls_header-name_cn+0(35).
lwa_vend-central_data-address-postal-datax-name = 'X'.
lwa_vend-central_data-address-postal-data-name_2 = ls_header-name_cn+35(35).
lwa_vend-central_data-address-postal-datax-name_2 = 'X'.
lwa_vend-central_data-address-postal-data-name_3 = ls_header-name_en+0(35).
lwa_vend-central_data-address-postal-datax-name_3 = 'X'.
lwa_vend-central_data-address-postal-data-name_4 = ls_header-name_en+35(35).
lwa_vend-central_data-address-postal-datax-name_4 = 'X'.
lwa_vend-central_data-address-postal-data-langu = sy-langu.
lwa_vend-central_data-address-postal-datax-langu = 'X'.
* 公司数据
IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
lwa_company-task = 'I'.
ELSE.
lwa_company-task = 'M'.
ENDIF.
lwa_company-data_key-bukrs = ls_header-bukrs.
lwa_company-data-fdgrv = ls_header-fdgrv.
lwa_company-datax-fdgrv = 'X'.
lwa_company-data-zuawa = ls_header-zuawa.
lwa_company-datax-zuawa = 'X'.
lwa_company-data-akont = ls_header-akont.
lwa_company-datax-akont = 'X'.
APPEND lwa_company TO lt_company.
lwa_vend-company_data-current_state = 'X'.
lwa_vend-company_data-company = lt_company.
* 邮箱
lwa_vend-central_data-address-communication-smtp-current_state = 'X'.
IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
ls_smtp_str-contact-task = 'I'.
ELSE.
ls_smtp_str-contact-task = 'M'.
ENDIF.
ls_smtp_str-contact-data-e_mail = ls_header-email_addr.
ls_smtp_str-contact-datax-e_mail = 'X'.
APPEND ls_smtp_str TO lt_smtp_str.
lwa_vend-central_data-address-communication-smtp-smtp = lt_smtp_str.
APPEND lwa_vend TO lt_vend.
ls_master_data-vendors = lt_vend.
* 操作创建/修改数据
IF ls_master_data IS NOT INITIAL.
IF ls_header-process_type EQ 'V'.
lv_test = 'X'.
ELSE.
CLEAR:lv_test.
ENDIF.
* CALL METHOD vmd_ei_api=>maintain_bapi
* EXPORTING
* iv_test_run = lv_test
* iv_collect_messages = 'X'
* is_master_data = ls_master_data
* IMPORTING
* es_master_data_correct = ls_ei_main
** es_message_correct =
** es_master_data_defective =
* es_message_defective = ls_error.
CALL METHOD vmd_ei_api=>maintain
EXPORTING
iv_test_run = lv_test
is_master_data = ls_master_data
IMPORTING
es_error = ls_error.
IF ls_error-is_error NE 'X'.
* 创建或修改成功
IF ls_header-process_type EQ 'C'.
* READ TABLE ls_ei_main-vendors INTO ls_vendor INDEX 1.
* IF sy-subrc EQ 0.
*
* lv_lifnr = ls_vendor-header-object_instance-lifnr.
* 经讨论 当创建时partner传一个不存在的客户供应商编号做关联 创建成功后修改掉就行
LOOP AT lt_bank_info ASSIGNING <fs_bank> WHERE partner EQ ls_header-partner AND bukrs EQ ls_header-bukrs.
<fs_bank>-partner = lv_lifnr.
ENDLOOP.
ls_header-partner = lv_lifnr.
MODIFY lt_header_info FROM ls_header TRANSPORTING partner WHERE unique_number EQ ls_header-unique_number.
* ENDIF.
ENDIF.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'S'.
APPEND ls_return TO et_return_info.
COMMIT WORK AND WAIT.
ELSE.
* 创建或修改失败
IF ls_header-process_type EQ 'C'.
ls_return-error_msg = text-003."'供应商主数据创建失败'.
ELSEIF ls_header-process_type EQ 'U'.
ls_return-error_msg = text-004."'供应商主数据修改失败'.
ELSEIF ls_header-process_type EQ 'V'.
ls_return-error_msg = text-020."'供应商主数据校验失败'.
ENDIF.
LOOP AT ls_error-messages INTO ls_msg WHERE type EQ 'E'.
ls_return-error_msg = ls_return-error_msg && '-' && ls_msg-message.
ENDLOOP.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'E'.
APPEND ls_return TO et_return_info.
DELETE lt_header_info INDEX lv_index.
ROLLBACK WORK.
ENDIF.
vmd_ei_api=>initialize( ).
ENDIF.
WHEN 'L'. "L--冻结(Lock)
CALL METHOD vmd_ei_api=>lock
EXPORTING
iv_lifnr = ls_header-partner
* iv_mode_lfa1 = 'E'
* iv_mandt = sy-mandt
* iv_collect = ' '
* iv_wait = SPACE
* iv_scope = '2'
* iv_x_lifnr = SPACE
IMPORTING
es_error = ls_message.
IF ls_message-is_error EQ 'X'.
ls_return-error_msg = text-010.
ls_return-flag = 'E'.
DELETE lt_header_info INDEX lv_index.
ELSE.
* ls_return-error_msg = text-006."'供应商主数据冻结成功!'.
ls_return-flag = 'S'.
ENDIF.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
APPEND ls_return TO et_return_info.
* vmd_ei_api=>initialize( ).
* EXIT.
* WHEN 'V'. "V--校验(Verification)"
* ls_return-unique_number = ls_header-unique_number.
* ls_return-partner = ls_header-partner.
* ls_return-bukrs = ls_header-bukrs.
* ls_return-flag = 'S'.
* ls_return-error_msg = text-005."'供应商主数据校验成功!'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDIF.
* 处理经营性数据
IF lt_bank_n IS NOT INITIAL.
LOOP AT lt_bank_n INTO ls_bank.
CLEAR:ls_bank_info.
MOVE-CORRESPONDING ls_bank TO ls_bank_info.
ls_bank_info-objkt = ls_bank-partner.
ls_bank_info-upnam = sy-uname.
ls_bank_info-udat = sy-datum.
ls_bank_info-utime = sy-uzeit.
CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
EXPORTING
i_datlo = sy-datum
i_timlo = sy-uzeit
i_tzone = sy-zonlo
IMPORTING
e_timestamp = ls_bank_info-timestamp.
ls_bank_info-banks = ls_bank-land1.
APPEND ls_bank_info TO lt_bank.
CHECK et_return_info IS INITIAL.
LOOP AT it_header_info[] INTO ls_header WHERE zzjyx NE 'N' AND partner EQ ls_bank-partner AND bukrs EQ ls_bank-bukrs.
ls_return-unique_number = ls_header-unique_number.
ls_return-partner = ls_header-partner.
ls_return-bukrs = ls_header-bukrs.
ls_return-flag = 'S'.
APPEND ls_return TO et_return_info.
EXIT.
ENDLOOP.
ENDLOOP.
MODIFY zzt_epic_bnka FROM TABLE lt_bank.
IF sy-subrc EQ 0.
COMMIT WORK AND WAIT.
RETURN.
ENDIF.
ENDIF.
* 校验就rollback 不走了
LOOP AT it_header_info[] INTO ls_header WHERE process_type EQ 'V'.
ROLLBACK WORK.
RETURN.
ENDLOOP.
* 排除可能因供应商创建失败的对应银行数据
SORT lt_header_info BY partner bukrs.
LOOP AT lt_bank_info INTO ls_bank.
lv_index = sy-tabix.
READ TABLE lt_header_info WITH KEY partner = ls_bank-partner bukrs = ls_bank-bukrs TRANSPORTING NO FIELDS BINARY SEARCH.
IF sy-subrc NE 0.
DELETE lt_bank_info INDEX lv_index.
ENDIF.
ENDLOOP.
* 执行commit
IF lt_header_info IS NOT INITIAL.
* 银行数据
IF lt_bank_info IS NOT INITIAL.
ENDIF.
* BRANCH CODE
* FITHA_BRNCH_T,FITHA_BRNCH
LOOP AT lt_header_info INTO ls_header WHERE j_1tpbupl IS NOT INITIAL." AND land1 EQ 'TH'.
SELECT SINGLE * INTO ls_brnch
FROM fitha_brnch
WHERE bp_nummr EQ ls_header-partner
AND bcode EQ ls_header-j_1tpbupl
AND bukrs EQ ls_header-bukrs
AND koart EQ 'K'.
CHECK sy-subrc NE 0.
CLEAR:ls_brnch,ls_brnch_d.
ls_brnch-bcode = ls_header-j_1tpbupl.
ls_brnch-bp_nummr = ls_header-partner.
ls_brnch-bukrs = ls_header-bukrs.
ls_brnch-koart = 'K'.
APPEND ls_brnch TO lt_brnch.
ls_brnch_d-bcode = ls_header-j_1tpbupl.
ls_brnch_d-bp_nummr = ls_header-partner.
ls_brnch_d-bukrs = ls_header-bukrs.
ls_brnch_d-koart = 'K'.
ls_brnch_d-spras = sy-langu.
APPEND ls_brnch_d TO lt_brnch_d.
ENDLOOP.
IF lt_brnch IS NOT INITIAL.
MODIFY fitha_brnch FROM TABLE lt_brnch.
MODIFY fitha_brnch_t FROM TABLE lt_brnch_d.
ENDIF.
COMMIT WORK AND WAIT."数据库提交
ELSE. "没有执行成功的数据
ROLLBACK WORK.
ENDIF.
ENDFUNCTION.
总结
银行信息如果不是自定义的 就需要把银行信息填入到API对应的结构中
以上