ABAP-客户主数据创建
使用cl_md_bp_maintain=>maintain创建
下面直接进入正文
FUNCTION zbpm_isp004.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(INPUT) TYPE ZSBPM_ISP004_INPUT
*" EXPORTING
*" VALUE(OUTPUT) TYPE ZSBPM_ISP004_OUTPUT
*"----------------------------------------------------------------------
DATA:
lv_msg TYPE bapi_msg.
* 晴空消息字段
CLEAR: lv_msg.
* 判断必输项:BPM流程编号
IF input-is_bpmbh-zbpmbh IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = 'BPM流程编号必输'.
RETURN.
ENDIF.
* 判断必输项:提交人
IF input-is_bpmbh-ztjr IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '提交人必输'.
RETURN.
ENDIF.
* 判断必输项:提交日期
IF input-is_bpmbh-ztjdate IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '提交日期必输'.
RETURN.
ENDIF.
* 判断必输项:提交时间
IF input-is_bpmbh-ztjtime IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '提交时间必输'.
RETURN.
ENDIF.
* 判断必输项:创建/修改/冻结标识
IF input-is_bpmbh-zbs IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '创建/修改/冻结标识必输'.
RETURN.
ENDIF.
* 判断必输项:客户编码
* ZBS字段传入M和B时,需要必填
IF input-is_kna1-partner IS INITIAL AND ( input-is_bpmbh-zbs = 'M' OR input-is_bpmbh-zbs = 'B' ) .
output-return-msgty = 'E'.
output-return-msgtx = '客户编码必输'.
RETURN.
ENDIF.
* 判断必输项:客商名称1
IF input-is_kna1-name_org1 IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '客商名称1必输'.
RETURN.
ENDIF.
* 判断必输项:银行标识
LOOP AT input-it_knbk INTO DATA(ls_knbk).
IF ls_knbk-bkvid IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '银行标识必输'.
RETURN.
ENDIF.
ENDLOOP.
* 判断必输项:销售组织
LOOP AT input-it_knvv INTO DATA(ls_knvv).
IF ls_knvv-vkorg IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '销售组织必输'.
RETURN.
ENDIF.
* 判断必输项:分销渠道
IF ls_knvv-vtweg IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '分销渠道必输'.
RETURN.
ENDIF.
ENDLOOP.
LOOP AT input-it_knvp INTO DATA(ls_knvp).
IF ls_knvp-vkorg IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '销售组织必输'.
RETURN.
ENDIF.
* 判断必输项:分销渠道
IF ls_knvp-vtweg IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '分销渠道必输'.
RETURN.
ENDIF.
ENDLOOP.
* 判断必输项:公司代码
LOOP AT input-it_knb1 INTO DATA(ls_knb1).
IF ls_knb1-bukrs IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '公司代码必输'.
RETURN.
ENDIF.
* 判断必输项:总账科目
IF ls_knb1-akont IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '总账科目必输'.
RETURN.
ENDIF.
* 判断必输项:付款条件
IF ls_knb1-zterm IS INITIAL.
output-return-msgty = 'E'.
output-return-msgtx = '付款条件必输'.
RETURN.
ENDIF.
ENDLOOP.
* 判断 创建/修改/冻结标识
* 判断DFKKBPTAXNUM-TAXNUMXL是否=传入的TAXNUMXL
* 若已存在值则在该账号下拓展客户数据,即I变为M
* IF input-is_kna1-taxnumxl IS NOT INITIAL.
* input-is_bpmbh-zbs = 'M'.
* ELSE.
* input-is_bpmbh-zbs = 'I'.
* ENDIF.
*------------------------------ 固定值 ------------------------------*
input-is_kna1-type = '2'. "客户类型
input-is_kna1-spras = '1'. "语言
* 创建客户主数据基本数据
DATA: lv_guid TYPE guid_16,
lv_text TYPE string.
DATA: lt_data TYPE cvis_ei_extern_t,
ls_data TYPE cvis_ei_extern,
ls_paadr TYPE bus_ei_bupa_address,
ls_mail TYPE bus_ei_bupa_smtp,
lt_mail TYPE bus_ei_bupa_smtp_t,
ls_fax TYPE bus_ei_bupa_fax,
lt_fax TYPE bus_ei_bupa_fax_t,
ls_phone TYPE bus_ei_bupa_telephone,
lt_phone TYPE bus_ei_bupa_telephone_t,
ls_bank TYPE bus_ei_bupa_bankdetail,
ls_sales TYPE cmds_ei_sales,
ls_tax TYPE cmds_ei_tax_ind,
lt_tax TYPE cmds_ei_tax_ind_t,
ls_company TYPE cmds_ei_company.
DATA:
lt_roles TYPE bus_ei_bupa_roles_t,
ls_roles TYPE bus_ei_bupa_roles,
ls_bank_address TYPE bapi1011_address,
ls_bank_return TYPE bapiret2,
ls_functions_s TYPE cmds_ei_functions,
ls_functions_t TYPE cmds_ei_functions_t,
lt_return_map TYPE mdg_bs_bp_msgmap_t,
lt_return TYPE bapiretm,
lt_return_tax TYPE TABLE OF bapiret2 WITH HEADER LINE,
ls_addressusage TYPE bus_ei_bupa_addressusage,
lt_addressusage TYPE bus_ei_bupa_addressusage_t.
* 创建
IF input-is_bpmbh-zbs = 'I'.
TRY.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_x16
RECEIVING
uuid = lv_guid.
CATCH cx_uuid_error .
ENDTRY.
ENDIF.
* Create customer
IF input-is_bpmbh-zbs = 'I'.
ls_data-partner-header-object_task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_data-partner-header-object_task = 'M'. "创建/修改/冻结标识
ENDIF.
ls_data-partner-header-object_instance-bpartner = input-is_kna1-partner. "业务伙伴编号
ls_data-partner-header-object_instance-bpartnerguid = lv_guid. "BAPI 的 CHAR 32 格式业务伙伴地址的全局唯一标识符
*--- Partner / Central data / common ------------------------------*
ls_data-partner-central_data-common-data-bp_control-category = input-is_kna1-type. "业务伙伴类别
ls_data-partner-central_data-common-data-bp_control-grouping = input-is_kna1-bu_group. "业务伙伴分组
* 业务伙伴角色 [若传入的BU_GROUP=Z005和Z006,默认角色ZFLCU0和ZFLCU1,其他的默认角色ZFLCU0、ZFLCU1和ZUKM00]
ls_roles-data_key = 'ZFLCU0'. "角色
APPEND ls_roles TO lt_roles.
ls_roles-data_key = 'ZFLCU1'. "角色
APPEND ls_roles TO lt_roles.
IF input-is_kna1-bu_group = 'Z005' OR input-is_kna1-bu_group = 'Z006'.
ELSE.
ls_roles-data_key = 'ZUKM00'. "角色
APPEND ls_roles TO lt_roles.
ENDIF.
ls_data-partner-central_data-role-roles = lt_roles. "外部接口:角色数据
ls_data-partner-central_data-common-data-bp_centraldata-title_key = input-is_kna1-title. "称谓代码
ls_data-partner-central_data-common-data-bp_centraldata-searchterm1 = input-is_kna1-bu_sort1. "客商简称
ls_data-partner-central_data-common-data-bp_centraldata-searchterm2 = input-is_kna1-bu_sort2. "原系统编号
ls_data-partner-central_data-common-datax-bp_centraldata-title_key = abap_true.
ls_data-partner-central_data-common-datax-bp_centraldata-searchterm1 = abap_true.
ls_data-partner-central_data-common-datax-bp_centraldata-searchterm2 = abap_true.
* 若客商名称1字段值的长度超40位字符,超40位的部分写入客商名称2字段
ls_data-partner-central_data-common-data-bp_organization-name1 = input-is_kna1-name_org1+0(40). "客商名称1
ls_data-partner-central_data-common-data-bp_organization-name2 = input-is_kna1-name_org1+40(40). "客商名称12
ls_data-partner-central_data-common-datax-bp_organization-name1 = abap_true.
ls_data-partner-central_data-common-datax-bp_organization-name2 = abap_true.
*--- Partner / Central data / Address -----------------------------*
IF input-is_bpmbh-zbs = 'I'.
ls_paadr-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_paadr-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_paadr-data_key-operation = 'XXDFLT'. "默认:XXDFLT/标准
ls_paadr-data-postal-data-langu = input-is_kna1-spras. "语言代码
ls_paadr-data-postal-data-country = input-is_kna1-country. "客商注册国家
ls_paadr-data-postal-data-region = input-is_kna1-region. "地区(省/自治区/直辖市、市、县)
ls_paadr-data-postal-data-city = input-is_kna1-city1. "客商注册城市
ls_paadr-data-postal-data-street = input-is_kna1-kh_street+0(40). "客商地址
ls_paadr-data-postal-data-str_suppl1 = input-is_kna1-kh_street+40(40). "客商地址
ls_paadr-data-postal-data-c_o_name = input-is_kna1-name_co. "联系人
ls_paadr-data-postal-data-postl_cod1 = input-is_kna1-post_code1. "客商邮编
ls_paadr-data-postal-datax-langu = abap_true.
ls_paadr-data-postal-datax-country = abap_true.
ls_paadr-data-postal-datax-region = abap_true.
ls_paadr-data-postal-datax-city = abap_true.
ls_paadr-data-postal-datax-street = abap_true.
ls_paadr-data-postal-datax-str_suppl1 = abap_true.
ls_paadr-data-postal-datax-c_o_name = abap_true.
ls_paadr-data-postal-datax-postl_cod1 = abap_true.
"电子邮件
IF input-is_kna1-smtp_addr IS NOT INITIAL .
IF input-is_bpmbh-zbs = 'I'.
ls_mail-contact-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_mail-contact-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_mail-contact-data-e_mail = input-is_kna1-smtp_addr.
ls_mail-contact-datax-e_mail = 'X'.
APPEND ls_mail TO lt_mail.
ls_paadr-data-communication-smtp-smtp = lt_mail.
ENDIF.
"微信/传真
IF input-is_kna1-fax_number IS NOT INITIAL .
IF input-is_bpmbh-zbs = 'I'.
ls_fax-contact-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_fax-contact-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_fax-contact-data-country = input-is_kna1-country.
ls_fax-contact-data-fax = input-is_kna1-fax_number.
ls_fax-contact-datax-country = 'X'.
ls_fax-contact-datax-fax = 'X'.
APPEND ls_fax TO lt_fax.
ls_paadr-data-communication-fax-fax = lt_fax.
ENDIF.
" Communication
"移动电话
IF input-is_kna1-telf1 IS NOT INITIAL.
IF input-is_bpmbh-zbs = 'I'.
ls_phone-contact-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_phone-contact-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_phone-contact-data-country = input-is_kna1-country.
ls_phone-contact-data-telephone = input-is_kna1-telf2.
ls_phone-contact-datax-country = 'X'.
ls_phone-contact-datax-telephone = 'X'.
APPEND ls_phone TO lt_phone.
ls_paadr-data-communication-phone-phone = lt_phone.
ENDIF.
"whatapp/电话
IF input-is_kna1-telf2 IS NOT INITIAL.
ls_phone-contact-data-country = input-is_kna1-country.
ls_phone-contact-data-r_3_user = '2'. "标识符:电话是移动电话
ls_phone-contact-data-telephone = input-is_kna1-telf1.
ls_phone-contact-datax-country = 'X'.
ls_phone-contact-datax-telephone = 'X'.
APPEND ls_phone TO lt_phone.
ls_paadr-data-communication-phone-phone = lt_phone.
ENDIF.
APPEND ls_paadr TO ls_data-partner-central_data-address-addresses.
CLEAR: ls_paadr , lt_phone , lt_fax , lt_mail.
*--- Partner / Customer data / Address -----------------------------*
ls_data-customer-central_data-central-data-kukla = input-is_kna1-kukla.
*--- Partner / Central data / Address ------------------------------*
IF input-is_bpmbh-zbs = 'I'.
ls_paadr-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_paadr-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_paadr-data_key-operation = 'BBP004'. "BBP004/开票地址
ls_paadr-data-postal-data-langu = input-is_kna1-kp_spras. "语言代码
ls_paadr-data-postal-data-country = input-is_kna1-kp_country. "客商注册国家
ls_paadr-data-postal-data-region = input-is_kna1-kp_region. "地区(省/自治区/直辖市、市、县)
ls_paadr-data-postal-data-city = input-is_kna1-kp_city1. "客商注册城市
ls_paadr-data-postal-data-street = input-is_kna1-kp_street+0(40). "开票地址
ls_paadr-data-postal-data-str_suppl1 = input-is_kna1-kp_street+40(40). "开票地址
ls_paadr-data-postal-datax-langu = abap_true.
ls_paadr-data-postal-datax-country = abap_true.
ls_paadr-data-postal-datax-region = abap_true.
ls_paadr-data-postal-datax-city = abap_true.
ls_paadr-data-postal-datax-street = abap_true.
ls_paadr-data-postal-datax-str_suppl1 = abap_true.
ls_paadr-data-postal-datax-postl_cod1 = abap_true.
ls_addressusage-task = 'I'.
ls_addressusage-data_key-addresstype = 'BILL_TO'.
APPEND ls_addressusage TO lt_addressusage.
ls_paadr-data-addr_usage-current_state = 'X'.
ls_paadr-data-addr_usage-addr_usages = lt_addressusage.
"开票电话
IF input-is_kna1-kp_tel_number IS NOT INITIAL .
IF input-is_bpmbh-zbs = 'I'.
ls_phone-contact-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_phone-contact-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_phone-contact-data-country = input-is_kna1-kp_country.
ls_phone-contact-data-r_3_user = '2'. "标识符:电话是移动电话
ls_phone-contact-data-telephone = input-is_kna1-kp_tel_number.
ls_phone-contact-datax-country = 'X'.
ls_phone-contact-datax-telephone = 'X'.
APPEND ls_phone TO lt_phone.
ls_paadr-data-communication-phone-phone = lt_phone.
ENDIF.
APPEND ls_paadr TO ls_data-partner-central_data-address-addresses.
CLEAR: ls_paadr , ls_phone, lt_phone , ls_addressusage , lt_addressusage.
*--- Partner / Central data / Address ------------------------------*
LOOP AT input-it_adrc INTO DATA(ls_adrc).
IF input-is_bpmbh-zbs = 'I'.
ls_paadr-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_paadr-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_paadr-data_key-operation = 'BBP003'. "BBP003/交货地址
ls_paadr-data-postal-data-langu = ls_adrc-sh_spras. "语言代码
ls_paadr-data-postal-data-country = ls_adrc-sh_country. "客商注册国家
ls_paadr-data-postal-data-region = ls_adrc-sh_region. "地区(省/自治区/直辖市、市、县)
ls_paadr-data-postal-data-city = ls_adrc-sh_city1. "客商注册城市
ls_paadr-data-postal-data-street = ls_adrc-sh_street+0(40). "交货地址
ls_paadr-data-postal-data-str_suppl1 = ls_adrc-sh_street+40(40). "交货地址
ls_paadr-data-postal-data-c_o_name = ls_adrc-sh_name_co. "收货联系人
ls_paadr-data-postal-datax-langu = abap_true.
ls_paadr-data-postal-datax-country = abap_true.
ls_paadr-data-postal-datax-region = abap_true.
ls_paadr-data-postal-datax-city = abap_true.
ls_paadr-data-postal-datax-street = abap_true.
ls_paadr-data-postal-datax-str_suppl1 = abap_true.
ls_paadr-data-postal-datax-c_o_name = abap_true.
ls_paadr-data-postal-datax-postl_cod1 = abap_true.
ls_addressusage-task = 'I'.
ls_addressusage-data_key-addresstype = 'SHIP_TO'.
APPEND ls_addressusage TO lt_addressusage.
ls_paadr-data-addr_usage-current_state = 'X'.
ls_paadr-data-addr_usage-addr_usages = lt_addressusage.
"联系人电话
IF ls_adrc-sh_tel_number IS NOT INITIAL .
IF input-is_bpmbh-zbs = 'I'.
ls_phone-contact-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_phone-contact-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_phone-contact-data-country = ls_adrc-sh_country.
ls_phone-contact-data-r_3_user = '2'. "标识符:电话是移动电话
ls_phone-contact-data-telephone = ls_adrc-sh_tel_number.
ls_phone-contact-datax-country = 'X'.
ls_phone-contact-datax-telephone = 'X'.
APPEND ls_phone TO lt_phone.
ls_paadr-data-communication-phone-phone = lt_phone.
ENDIF.
APPEND ls_paadr TO ls_data-partner-central_data-address-addresses.
CLEAR: ls_phone , lt_phone .
ENDLOOP.
*----------------- PARTNER / CENTRAL DATA / BANK -----------------*
* 银行数据
LOOP AT input-it_knbk INTO ls_knbk.
* 查找银行主数据,若不存在,则先创建银行
SELECT SINGLE * FROM bnka
INTO @DATA(ls_bnka)
WHERE banks = @ls_knbk-banks
AND banka = @ls_knbk-bankl
AND loevm = ''.
IF sy-subrc <> 0.
ls_bank_address-bank_name = ls_knbk-accname. "银行名称
CALL FUNCTION 'BAPI_BANK_CREATE'
EXPORTING
bank_ctry = ls_knbk-banks
bank_key = ls_knbk-bankl
bank_address = ls_bank_address
i_xupdate = 'X'
IMPORTING
return = ls_bank_return
bankkey = ls_bnka-bankl.
IF ls_bnka-bankl IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
lv_msg = '银行主数据创建失败:' && ls_bank_return-message.
CONTINUE.
ENDIF.
ENDIF.
IF input-is_bpmbh-zbs = 'I'.
ls_bank-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_bank-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_bank-data_key = ls_knbk-bkvid. "银行标识
ls_bank-data-bank_ctry = ls_knbk-banks. "银行国家
ls_bank-data-bank_key = ls_knbk-bankl. "银行代码
ls_bank-data-bank_acct = ls_knbk-account+0(18). "银行账号
ls_bank-data-bank_ref = ls_knbk-account+18(20). "银行细目的参考明细
ls_bank-data-accountholder = ls_knbk-koinh. "账户持有人
ls_bank-data-bankaccountname = ls_knbk-accname. "账户名称
ls_bank-datax-bank_ctry = abap_true.
ls_bank-datax-bank_key = abap_true.
ls_bank-datax-bank_acct = abap_true.
ls_bank-datax-bank_ref = abap_true.
ls_bank-datax-accountholder = abap_true.
ls_bank-datax-bankaccountname = abap_true.
APPEND ls_bank TO ls_data-partner-central_data-bankdetail-bankdetails.
ls_data-partner-central_data-bankdetail-current_state = abap_true.
ENDLOOP.
*--------------- Customer / Company data -------------------------*
LOOP AT input-it_knb1 INTO ls_knb1.
IF line_exists( ls_data-customer-company_data-company[ data_key-bukrs = ls_knb1-bukrs ] ).
CONTINUE.
ENDIF.
IF input-is_bpmbh-zbs = 'I'.
ls_company-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_company-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_company-data_key-bukrs = ls_knb1-bukrs. " company code
ls_company-data-zterm = ls_knb1-zterm. " terms of payment
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_knb1-akont
IMPORTING
output = ls_company-data-akont.
ls_company-datax-zterm = 'X'.
ls_company-datax-akont = 'X'.
APPEND ls_company TO ls_data-customer-company_data-company.
CLEAR: ls_company.
ENDLOOP.
**---------------SALES ORG AND DIST & DIVISION MANDATORY FIELDS-----*
LOOP AT input-it_knvv INTO ls_knvv.
SELECT COUNT(*) FROM knvv WHERE kunnr = input-is_kna1-partner
AND vkorg = ls_knvv-vkorg AND vtweg = ls_knvv-vtweg AND spart = ls_knvv-spart.
IF sy-subrc <> 0.
ls_sales-task = 'I'.
ELSE.
ls_sales-task = 'U'.
ENDIF.
ls_sales-data_key-vkorg = ls_knvv-vkorg. "销售组织
ls_sales-data_key-vtweg = ls_knvv-vtweg. "分销渠道
ls_sales-data_key-spart = '00'. "产品组:默认00
ls_sales-data-vkbur = ls_knvv-vkbur. "销售部门
ls_sales-data-vkgrp = ls_knvv-vkgrp. "销售组
ls_sales-data-kdgrp = ls_knvv-kdgrp. "客户组
ls_sales-data-waers = ls_knvv-waers. "货币
ls_sales-data-zterm = ls_knvv-zterm. "付款条件代码
ls_sales-data-ktgrd = '01'. "客户科目分类:默认值01
ls_sales-data-vwerk = ls_knvv-vwerk. "交货工厂
ls_sales-data-vsbed = ls_knvv-vsbed. "装运条件
ls_sales-data-konda = ls_knvv-konda. "发票类型
ls_sales-data-kkber = 'XQ00'. "用于定价过程确定的客户分类
ls_sales-data-kalks = '1'. "用于定价过程确定的客户分类
IF input-is_bpmbh-zbs = 'B'.
ls_sales-data-loevm = 'X'. "客户的删除标记 (销售级别)
ENDIF.
ls_sales-datax-vkbur = abap_true. "销售部门
ls_sales-datax-vkgrp = abap_true. "销售组
ls_sales-datax-kdgrp = abap_true. "客户组
ls_sales-datax-waers = abap_true. "货币
ls_sales-datax-zterm = abap_true. "付款条件代码
ls_sales-datax-ktgrd = abap_true. "客户科目分类:默认值01
ls_sales-datax-vwerk = abap_true. "交货工厂
ls_sales-datax-vsbed = abap_true. "装运条件
ls_sales-datax-konda = abap_true. "发票类型
ls_sales-datax-kkber = abap_true. "发票类型
ls_sales-datax-kalks = abap_true. "用于定价过程确定的客户分类
IF input-is_bpmbh-zbs = 'B'.
ls_sales-datax-loevm = abap_true. "客户的删除标记 (销售级别)
ENDIF.
**------------------- Business Partner Details -------------------*
ls_functions_s-data_key-parvw = 'AG'.
ls_functions_s-data-defpa = 'X'.
ls_functions_s-datax-defpa = abap_true.
APPEND ls_functions_s TO ls_functions_t.
CLEAR: ls_functions_s.
ls_functions_s-data_key-parvw = 'RE'.
ls_functions_s-data-defpa = 'X'.
ls_functions_s-datax-defpa = abap_true.
APPEND ls_functions_s TO ls_functions_t.
CLEAR: ls_functions_s.
ls_functions_s-data_key-parvw = 'RG'.
ls_functions_s-data-defpa = 'X'.
ls_functions_s-datax-defpa = abap_true.
APPEND ls_functions_s TO ls_functions_t.
CLEAR: ls_functions_s.
ls_functions_s-data_key-parvw = 'WE'.
ls_functions_s-data-defpa = 'X'.
ls_functions_s-datax-defpa = abap_true.
APPEND ls_functions_s TO ls_functions_t.
CLEAR: ls_functions_s.
**------------------- Business Partner Details -------------------*
LOOP AT input-it_knvp INTO ls_knvp WHERE vkorg = ls_knvv-vkorg AND vtweg = ls_knvv-vtweg.
ls_functions_s-data_key-parvw = ls_knvp-parvw.
ls_functions_s-data-partner = ls_knvp-kunn2.
ls_functions_s-datax-partner = abap_true.
APPEND ls_functions_s TO ls_functions_t.
CLEAR: ls_functions_s.
ENDLOOP.
ls_sales-functions-functions = ls_functions_t.
ls_sales-functions-current_state = 'X'.
APPEND ls_sales TO ls_data-customer-sales_data-sales.
CLEAR: ls_functions_t, lt_tax.
ENDLOOP.
*--------------- Customer / TAX -------------------------*
IF input-is_bpmbh-zbs = 'I'.
ls_tax-task = 'I'. "创建/修改/冻结标识
ELSEIF input-is_bpmbh-zbs = 'M'.
ls_tax-task = 'U'. "创建/修改/冻结标识
ENDIF.
ls_tax-data_key-aland = input-is_kna1-country. "启运国家
ls_tax-data_key-tatyp = 'MWST'. "税类别(营业税,联邦营业税,...)
ls_tax-data-taxkd = input-is_kna1-taxkd.
ls_tax-datax-taxkd = 'X'.
APPEND ls_tax TO lt_tax.
ls_data-customer-central_data-tax_ind-tax_ind = lt_tax.
**-----------Finally fill the main data structure-----------*
APPEND ls_data TO lt_data.
**----------------validating BP data------------------------*
CALL METHOD cl_md_bp_maintain=>validate_single
EXPORTING
i_data = ls_data "lt_data
* i_data_db =
* iv_suppress_taxjur_check = 'X'
IMPORTING
et_return_map = lt_return_map. "lt_return.
**------------------Creating BP ----------------------------*
IF lt_return_map IS INITIAL.
CALL METHOD cl_md_bp_maintain=>maintain
EXPORTING
i_data = lt_data
* i_test_run = 'X'
IMPORTING
e_return = lt_return.
**------------------Commit BAPI ----------------------------*
LOOP AT lt_return INTO DATA(ls_return).
LOOP AT ls_return-object_msg INTO DATA(ls_retmsg) WHERE type CA 'EXA'.
CLEAR: lv_text.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_retmsg-id
msgnr = ls_retmsg-number
msgv1 = ls_retmsg-message_v1
msgv2 = ls_retmsg-message_v2
msgv3 = ls_retmsg-message_v3
msgv4 = ls_retmsg-message_v4
IMPORTING
message_text_output = lv_text.
CONCATENATE output-item-ev_msg lv_text INTO output-item-ev_msg.
ENDLOOP.
ENDLOOP.
IF lv_text IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
DO 10 TIMES.
SELECT SINGLE partner INTO output-item-ev_partner
FROM but000 WHERE partner_guid = lv_guid.
IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
ENDIF.
IF output-item-ev_partner IS NOT INITIAL .
output-return-msgty = ' S.'.
output-return-msgtx = ' 客户创建成功.'.
output-item-ev_type = 'S'.
output-item-ev_msg = '客户创建成功'.
ELSE.
output-return-msgty = ' E.'.
output-return-msgtx = ' 客户创建失败.'.
output-item-ev_type = 'E'.
RETURN.
ENDIF.
"ADD TAX
IF input-is_kna1-taxnumxl IS NOT INITIAL.
CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
EXPORTING
businesspartner = output-item-ev_partner
taxtype = input-is_kna1-taxtype
taxnumber = input-is_kna1-taxnumxl
TABLES
return = lt_return_tax.
CLEAR: lv_text.
LOOP AT lt_return_tax WHERE type CA 'AXE'.
CONCATENATE lv_text lt_return_tax-message INTO lv_text SEPARATED BY ','.
ENDLOOP.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
output-return-msgtx = output-return-msgtx && '税号添加失败:' && lv_text && '.'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
ELSE.
LOOP AT lt_return_map INTO DATA(ls_return_map).
CLEAR: lv_text.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_return_map-id
msgnr = ls_return_map-number
msgv1 = ls_return_map-message_v1
msgv2 = ls_return_map-message_v2
msgv3 = ls_return_map-message_v3
msgv4 = ls_return_map-message_v4
IMPORTING
message_text_output = lv_text.
CONCATENATE output-item-ev_msg lv_text INTO output-item-ev_msg.
ENDLOOP.
output-return-msgty = ' E.'.
output-return-msgtx = ' 客户创建失败.'.
output-item-ev_type = 'E'.
ENDIF.
ENDFUNCTION.