=> 注意事项
- 批量创建时不能用 commit work and wait;必须用 CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’;真操蛋!!!
1. 代码
DATA: lt_bp_data TYPE cvis_ei_extern_t,
ls_bp_data TYPE cvis_ei_extern,
lt_bp_return TYPE bapiretm,
ls_bp_return TYPE bapireti,
ls_bapiretc TYPE bapiretc.
DATA: lv_runmode TYPE flag, "是否创建模式
lv_ktokk TYPE ktokk, "供应商帐户组
lv_vendor TYPE but000-partner,
lv_guid TYPE but000-partner_guid, "BP GUID
lv_object_task TYPE bus_ei_object_task.
DATA: lt_zmmt004_conf TYPE TABLE OF zmmt004_conf,
ls_zmmt003_conf TYPE zmmt003_conf,
ls_zmmt004_conf TYPE zmmt004_conf,
lt_zmmt003_log TYPE TABLE OF zmmt003_log,
ls_but020 TYPE but020.
FIELD-SYMBOLS: <fs_response> TYPE zsif_mm_o008_res_0004,
<fs_sup_linkmans> TYPE zsif_mm_o008_res_0006.
DATA: lv_date TYPE sy-datum,
lv_time TYPE sy-uzeit,
lv_tabix TYPE sy-tabix.
DATA: ls_return TYPE bapiret2.
DATA: ls_bp_address TYPE bus_ei_bupa_address.
"统一日期时间参数
lv_date = sy-datum.
lv_time = sy-uzeit.
"获取BP供应商公司主数据扩充公司配置表
SELECT * FROM zmmt004_conf INTO TABLE lt_zmmt004_conf.
"日志记录GUID
gv_uuid = zcl_abap_comm=>get_system_uuid( ).
LOOP AT ps_response_data-list ASSIGNING <fs_response>.
IF <fs_response>-sup_id IS INITIAL. "外部给号,必须存在编码才能执行
CONTINUE.
ENDIF.
"BP是否存在
READ TABLE gt_zmmt003_conf INTO ls_zmmt003_conf WITH KEY sup_id = <fs_response>-sup_id BINARY SEARCH.
IF sy-subrc = 0.
lv_ktokk = 'Z009'. "业务合作伙伴组
lv_vendor = ls_zmmt003_conf-lifnr. "关联公司BP编码替换
ELSE.
lv_ktokk = 'V001'.
lv_vendor = <fs_response>-sup_id.
ENDIF.
lv_vendor = |{ lv_vendor ALPHA = IN }|.
SELECT SINGLE partner_guid INTO lv_guid FROM but000 WHERE partner = lv_vendor.
IF sy-subrc = 0.
lv_runmode = 'U'.
SELECT SINGLE * FROM but020 INTO ls_but020 WHERE partner = lv_vendor.
ELSE.
lv_runmode = 'I'.
lv_guid = zcl_abap_comm=>get_system_uuid( ).
ENDIF.
"BP GUID
ls_bp_data-partner-header = VALUE #( object_task = lv_runmode "task
object_instance = VALUE #( bpartner = lv_vendor "供应商编码
bpartnerguid = lv_guid ) ). "BP GUID
"BP Central common
ls_bp_data-partner-central_data-common = VALUE #( data = VALUE #( bp_control = VALUE #( grouping = lv_ktokk "业务伙伴分组
category = '2' ) "业务伙伴类别
bp_centraldata = VALUE #( "searchterm1 = <fs_response>-sup_abbreviation "搜索项1
title_key = '0003' ) "称谓
bp_organization = VALUE #( name1 = <fs_response>-sup_name ) "名称
zzcusr = <fs_response>-create_user_name "创建人
zzcdat = <fs_response>-create_date "创建时间
zzuusr = <fs_response>-update_user_name "更新人
zzudat = <fs_response>-update_date "更新时间
zzasn_flag = SWITCH #( <fs_response>-asn_flag WHEN 'Y' THEN 'X' ELSE '' ) ) "ASN标识
datax = VALUE #( bp_centraldata = VALUE #( "searchterm1 = abap_true
title_key = abap_true
partnerlanguage = abap_true )
bp_organization = VALUE #( name1 = abap_true )
zzcusr = abap_true
zzcdat = abap_true
zzuusr = abap_true
zzudat = abap_true
zzasn_flag = abap_true ) ).
"BP Central bank
* ls_bp_data-partner-central_data-bankdetail = VALUE #( ).
"BP Central tax
ls_bp_data-partner-central_data-taxnumber-current_state = abap_true.
ls_bp_data-partner-central_data-taxnumber-taxnumbers = VALUE #( ( task = SWITCH #( lv_runmode WHEN 'I' THEN 'I' ELSE 'M' )
data_key = VALUE #( taxtype = 'CN0' "税号类别
taxnumber = <fs_response>-sup_registration_number ) ) ). "业务合作伙伴税号
"BP communication 电话&邮件信息
LOOP AT <fs_response>-link_man_info_dto_list ASSIGNING FIELD-SYMBOL(<fs_link_man_info_dto_list>).
IF <fs_link_man_info_dto_list>-linkman_mobile IS NOT INITIAL.
APPEND VALUE #( contact = VALUE #( task = lv_runmode
data = VALUE #( country = 'CN' "电话/传真号所属的国家/地区
std_no = SWITCH #( <fs_link_man_info_dto_list>-linkman_flag WHEN 'Y' THEN 'X' ELSE '' ) "标准
telephone = <fs_link_man_info_dto_list>-linkman_mobile "电话号码:区号 + 号码
r_3_user = '2' ) "标识符:电话是固定电话
datax = VALUE #( std_no = abap_true country = abap_true telephone = abap_true ) ) "r_3_user = abap_true
remark-remarks = VALUE #( ( task = lv_runmode
data = VALUE #( langu = '1'
comm_notes = <fs_link_man_info_dto_list>-linkman_name )
datax = VALUE #( langu = abap_true comm_notes = abap_true ) ) )
) TO ls_bp_data-partner-central_data-communication-phone-phone.
ls_bp_data-partner-central_data-communication-phone-current_state = abap_true.
ENDIF.
IF <fs_link_man_info_dto_list>-linkman_telephone IS NOT INITIAL.
APPEND VALUE #( contact = VALUE #( task = lv_runmode
data = VALUE #( country = 'CN' "电话/传真号所属的国家/地区
std_no = SWITCH #( <fs_link_man_info_dto_list>-linkman_flag WHEN 'Y' THEN 'X' ELSE '' ) "标准
telephone = <fs_link_man_info_dto_list>-linkman_telephone "电话号码:区号 + 号码
r_3_user = '1' ) "标识符:电话是固定电话
datax = VALUE #( std_no = abap_true country = abap_true telephone = abap_true ) ) "r_3_user = abap_true
remark-remarks = VALUE #( ( task = lv_runmode
data = VALUE #( langu = '1'
comm_notes = <fs_link_man_info_dto_list>-linkman_name )
datax = VALUE #( langu = abap_true comm_notes = abap_true ) ) )
) TO ls_bp_data-partner-central_data-communication-phone-phone.
ls_bp_data-partner-central_data-communication-phone-current_state = abap_true.
ENDIF.
APPEND VALUE #( contact = VALUE #( task = lv_runmode
data = VALUE #( country = 'CN' "电话/传真号所属的国家/地区
consnumber = sy-tabix
std_no = SWITCH #( <fs_link_man_info_dto_list>-linkman_flag WHEN 'Y' THEN 'X' ELSE '' ) "标准
telex_no = <fs_link_man_info_dto_list>-linkman_position ) "职位
datax = VALUE #( std_no = abap_true telex_no = abap_true consnumber = abap_true ) )
remark-remarks = VALUE #( ( task = lv_runmode
data = VALUE #( langu = '1'
comm_notes = <fs_link_man_info_dto_list>-linkman_name )
datax = VALUE #( langu = abap_true comm_notes = abap_true ) ) )
) TO ls_bp_data-partner-central_data-communication-tlx-tlx.
ls_bp_data-partner-central_data-communication-tlx-current_state = abap_true.
APPEND VALUE #( contact = VALUE #( task = lv_runmode
data = VALUE #( std_no = SWITCH #( <fs_link_man_info_dto_list>-linkman_flag WHEN 'Y' THEN 'X' ELSE '' ) "标准
e_mail = <fs_link_man_info_dto_list>-linkman_email ) "邮箱
datax = VALUE #( std_no = abap_true e_mail = abap_true ) )
remark-remarks = VALUE #( ( task = SWITCH #( lv_runmode WHEN 'I' THEN 'I' ELSE 'M' )
data = VALUE #( langu = '1'
comm_notes = <fs_link_man_info_dto_list>-linkman_name )
datax = VALUE #( langu = abap_true comm_notes = abap_true ) ) )
) TO ls_bp_data-partner-central_data-communication-smtp-smtp.
ls_bp_data-partner-central_data-communication-smtp-current_state = abap_true.
ENDLOOP.
"BP Central Address
ls_bp_address = VALUE #( task = SWITCH #( lv_runmode WHEN 'I' THEN 'I' ELSE 'M' )
data_key-guid = ls_but020-address_guid
* data_key-operation = 'XXDFLT'
data-postal-data = VALUE #( langu = '1'
country = 'CN'
street = <fs_response>-sup_registration_address "地址
city = 'INIT'
postl_cod1 = '000000' ) "SWITCH #( <fs_response>-sup_office_zip_code
" WHEN space THEN '000000'
" ELSE <fs_response>-sup_office_zip_code ) ) "邮编
data-postal-datax = VALUE #( langu = abap_true
country = abap_true
street = abap_true
city = abap_true
postl_cod1 = abap_true ) ).
"URI信息
LOOP AT <fs_response>-type_det_info_dto_list ASSIGNING FIELD-SYMBOL(<fs_type_det_info_dto_list>).
APPEND VALUE #( contact = VALUE #( task = lv_runmode
data = VALUE #( std_no = SWITCH #( <fs_type_det_info_dto_list>-main_flag WHEN 'Y' THEN 'X' ELSE '' )
uri_type = 'HPG'
uri = |{ <fs_type_det_info_dto_list>-one_det_id }/{ <fs_type_det_info_dto_list>-two_det_id }/| && "一级分类/二级分类/三级分类/四级分类
|{ <fs_type_det_info_dto_list>-three_det_id }/{ <fs_type_det_info_dto_list>-four_det_id }| )
datax = VALUE #( std_no = abap_true uri_type = abap_true uri = abap_true ) )
remark-remarks = VALUE #( ( task = lv_runmode
data = VALUE #( langu = '1'
comm_notes = |{ <fs_type_det_info_dto_list>-one_det_name }/{ <fs_type_det_info_dto_list>-two_det_name }/| && "一级分类描述/二级分类描述/三级分类描述/四级分类描述
|{ <fs_type_det_info_dto_list>-three_det_name }/{ <fs_type_det_info_dto_list>-four_det_name }| )
datax = VALUE #( langu = abap_true comm_notes = abap_true ) ) )
) TO ls_bp_address-data-communication-uri-uri.
ls_bp_data-partner-central_data-communication-uri-current_state = abap_true.
ENDLOOP.
ls_bp_data-partner-central_data-address-current_state = abap_true.
APPEND ls_bp_address TO ls_bp_data-partner-central_data-address-addresses.
CLEAR: ls_bp_address.
IF lv_ktokk NE 'Z009'.
"BP Central Role
ls_bp_data-partner-central_data-role-roles = VALUE #( ( task = lv_runmode data_key = 'FLVN00' data-valid_from = sy-datum data-valid_to = '99991231' datax-valid_from = abap_true datax-valid_to = abap_true )
( task = lv_runmode data_key = 'FLVN01' data-valid_from = sy-datum data-valid_to = '99991231' datax-valid_from = abap_true datax-valid_to = abap_true ) ).
ls_bp_data-vendor-header = VALUE #( object_instance-lifnr = lv_vendor
object_task = lv_runmode ).
ls_bp_data-vendor-central_data-central = VALUE #( data = VALUE #( stcd5 = <fs_response>-sup_registration_number ktokk = lv_ktokk )
datax = VALUE #( stcd5 = abap_true ktokk = abap_true ) ).
"bp_ven_company
LOOP AT lt_zmmt004_conf INTO ls_zmmt004_conf.
APPEND VALUE #( task = SWITCH #( lv_runmode WHEN 'I' THEN 'I' ELSE 'M' )
data_key-bukrs = ls_zmmt004_conf-bukrs "公司代码
data = VALUE #( akont = '0002121001' "总帐中的统驭科目
waers = 'CNY'
reprf = abap_true )
datax = VALUE #( akont = abap_true
reprf = abap_true ) )
TO ls_bp_data-vendor-company_data-company.
ENDLOOP.
ls_bp_data-vendor-company_data-current_state = abap_true.
"BP_PURCHASING
ls_bp_data-vendor-purchasing_data-purchasing = VALUE #( ( task = SWITCH #( lv_runmode WHEN 'I' THEN 'I' ELSE 'M' )
data_key-ekorg = '1000' "采购组织
data = VALUE #( ekgrp = 'A01' "采购组
waers = 'CNY'
webre = abap_true
bstae = SWITCH #( <fs_response>-asn_flag WHEN 'Y' THEN '0004' ELSE '' ) ) "基于收货的发票校验
datax = VALUE #( ekgrp = abap_true
waers = abap_true
webre = abap_true
bstae = abap_true ) ) ).
ls_bp_data-vendor-purchasing_data-current_state = abap_true.
ENDIF.
APPEND ls_bp_data TO lt_bp_data.
"单条处理
cl_md_bp_maintain=>maintain(
EXPORTING
i_data = lt_bp_data
IMPORTING
e_return = lt_bp_return ).
IF line_exists( ls_bp_return-object_msg[ type = 'A' ] ) OR
line_exists( ls_bp_return-object_msg[ type = 'E' ] ) OR
line_exists( ls_bp_return-object_msg[ type = 'X' ] ).
LOOP AT ls_bp_return-object_msg INTO ls_bapiretc WHERE type = 'A' OR type = 'E' OR type = 'X'.
APPEND VALUE #( zif_guid = gv_uuid lifnr = lv_vendor zdate = lv_date ztime = lv_time zuser = sy-uname
zmsgty = ls_bapiretc-type zmsgid = ls_bapiretc-id zmsgno = ls_bapiretc-number
zmsgtx = ls_bapiretc-message ) TO lt_zmmt003_log.
EXIT.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
IMPORTING
return = ls_return.
ELSE.
APPEND VALUE #( zif_guid = gv_uuid lifnr = lv_vendor zdate = lv_date ztime = lv_time zuser = sy-uname
zmsgty = 'S' zmsgtx = TEXT-t02 ) TO lt_zmmt003_log.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true
IMPORTING
return = ls_return.
ENDIF.
CLEAR: ls_bp_data,lt_bp_data,lv_runmode,lv_object_task,lv_ktokk,lv_vendor,lv_guid,ls_zmmt003_conf,ls_zmmt004_conf,ls_but020,lt_bp_return.
ENDLOOP.
IF lt_zmmt003_log IS NOT INITIAL.
MODIFY zmmt003_log FROM TABLE lt_zmmt003_log.
ENDIF.