**
ABAP 创建BP客户主数据
**
推荐使用:CVI_EI_INBOUND_MAIN
创建客户主数据后可以添加信用等其他相关数据。
这个函数的导入导出参数如下:
CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
EXPORTING
I_DATA = LT_DATA
* I_EXT_DATA =
IMPORTING
E_RETURN = LT_RETURN.
LT_DATA中包含PARTNER和CUSTOMER相关数据。
数据填充可以参照以下DEMO:
**定义调用CVI_EI_INBOUND_MAIN创建的输入参数
DATA:LV_BPARTNERGUID TYPE BU_PARTNER_GUID_BAPI.
DATA:LT_RETURN_TAX TYPE TABLE OF BAPIRET2 WITH HEADER LINE,
LT_RETURN_FRG TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA:LT_RETURN_UKMBP TYPE UKM_T_MONITOR_RETURN .
DATA : LS_PARTNER TYPE BUS_EI_EXTERN,
LS_CUSTOMER TYPE CMDS_EI_EXTERN,
LT_ADDRESSES TYPE BUS_EI_BUPA_ADDRESS_T,
LS_ADDRESSES TYPE BUS_EI_BUPA_ADDRESS,
LT_PHONE TYPE BUS_EI_BUPA_TELEPHONE_T,
LS_PHONE TYPE BUS_EI_BUPA_TELEPHONE,
LT_COMPANY TYPE CMDS_EI_COMPANY_T,
LS_COMPANY TYPE CMDS_EI_COMPANY,
LT_SALES TYPE CMDS_EI_SALES_T,
LS_SALES TYPE CMDS_EI_SALES,
LT_TAX_IND TYPE CMDS_EI_TAX_IND_T,
LS_TAX_IND TYPE CMDS_EI_TAX_IND,
LT_ROLES TYPE BUS_EI_BUPA_ROLES_T,
LS_ROLES TYPE BUS_EI_BUPA_ROLES,
LT_FUNCTIONS TYPE CMDS_EI_FUNCTIONS_T,
LS_FUNCTIONS TYPE CMDS_EI_FUNCTIONS,
LT_BANKS TYPE BUS_EI_BUPA_BANKDETAIL_T,
LS_BANKS TYPE BUS_EI_BUPA_BANKDETAIL.
DATA : LS_HEADER TYPE CMDS_EI_HEADER,
LS_CENTRAL_DATA TYPE CMDS_EI_CENTRAL_DATA,
LS_COMPANY_DATA TYPE CMDS_EI_CMD_COMPANY,
LS_SALES_DATA TYPE CMDS_EI_CMD_SALES.
DATA : LS_CENTRAL TYPE CMDS_EI_CMD_CENTRAL.
DATA : LS_DATA TYPE CVIS_EI_EXTERN,
LT_DATA TYPE CVIS_EI_EXTERN_T,
LT_RETURN TYPE BAPIRETM,
LS_RETURN TYPE BAPIRETI,
LS_MSG TYPE BAPIRETC.
* 根据伙伴GUID取出客户编号
DATA : LT_PARTNERGUID_LIST TYPE BU_PARTNER_GUID_T,
LS_PARTNERGUID_LIST LIKE LINE OF LT_PARTNERGUID_LIST.
DATA : LT_CUSTOMER_LIST TYPE CVIS_CUST_LINK_T,
LS_CUSTOMER_LIST TYPE CVI_CUST_LINK.
"创建信用等相关信息
DATA: IO_FACADE TYPE REF TO CL_UKM_FACADE,
IO_BUPA_FACTORY TYPE REF TO CL_UKM_BUPA_FACTORY,
IO_PARTNER TYPE REF TO CL_UKM_BUSINESS_PARTNER,
IO_ACCOUNT TYPE REF TO CL_UKM_ACCOUNT,
LW_BP_CREDIT_SGM TYPE UKM_S_BP_CMS_SGM.
DATA: LWA_UKM_S_BP_CMS TYPE UKM_S_BP_CMS.
DATA: LV_PARTNER TYPE BU_PARTNER,
LV_CREDIT_SGMNT TYPE UKM_CREDIT_SGMNT.
DATA : LTC_RETURN TYPE UKM_T_MONITOR_RETURN,
LSC_RETURN TYPE UKM_S_MONITOR_RETURN,
LV_MSG1 TYPE CHAR100.
****数据处理,开始创建客户主数据*************************************************
"创建伙伴GUID
TRY .
LV_BPARTNERGUID = CL_UUID_FACTORY=>CREATE_SYSTEM_UUID( )->CREATE_UUID_X16( ).
CATCH CX_UUID_ERROR.
"返回消息
EV_ZMSG = '客户GUID创建失败!'.
STATUS = 'S03'.
EV_ZTYPE = 'E'.
EXIT.
ENDTRY.
CHECK LV_BPARTNERGUID IS NOT INITIAL.
LS_PARTNER-HEADER-OBJECT_TASK = 'I'.
LS_PARTNER-HEADER-OBJECT_INSTANCE-BPARTNERGUID = LV_BPARTNERGUID.
*LS_PARTNER-HEADER-OBJECT_INSTANCE-BPARTNER = KUNNR ."客户号 导入的客户代码
LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CONTROL-CATEGORY = 2. "业务伙伴类别
LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CONTROL-GROUPING = KTOKD. " 账户组
LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_ORGANIZATION-NAME1 = NAME1. " 客户名称
LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CENTRALDATA-SEARCHTERM1 = SORTL. "搜素词
*LS_PARTNER-CENTRAL_DATA-BANKDETAIL-DATA-BANK_KEY = BANKL."银行代码
"角色
LS_ROLES-TASK = 'I'.
LS_ROLES-DATA_KEY = 'FLCU01'. "角色
APPEND LS_ROLES TO LT_ROLES.
LS_ROLES-DATA_KEY = 'FLCU00'. "角色
APPEND LS_ROLES TO LT_ROLES.
LS_ROLES-DATA_KEY = 'UKM000'. "角色
APPEND LS_ROLES TO LT_ROLES.
*LS_ROLES-DATA-ROLECATEGORY = 'ZSD001'.
*APPEND LS_ROLES TO LT_ROLES.
LS_PARTNER-CENTRAL_DATA-ROLE-ROLES = LT_ROLES.
****客户地址数据***********************************************
CLEAR : LS_ADDRESSES,LT_ADDRESSES.
LS_ADDRESSES-TASK = 'I'.
LS_ADDRESSES-DATA-POSTAL-DATA-COUNTRY = LAND1. "国家
LS_ADDRESSES-DATA-POSTAL-DATAX-COUNTRY = 'X'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = REGIO
IMPORTING
OUTPUT = REGIO.
LS_ADDRESSES-DATA-POSTAL-DATA-REGION = REGIO. "省份
LS_ADDRESSES-DATA-POSTAL-DATAX-REGION = 'X'.
LS_ADDRESSES-DATA-POSTAL-DATA-STREET = STRAS. "注册地址
LS_ADDRESSES-DATA-POSTAL-DATAX-STREET = 'X'.
LS_ADDRESSES-DATA-POSTAL-DATA-LANGUISO = 'ZH'.
LS_ADDRESSES-DATA-POSTAL-DATA-POSTL_COD1 = PSTLZ . "邮政编码
LS_ADDRESSES-DATA-POSTAL-DATAX-POSTL_COD2 = 'X' .
LS_ADDRESSES-DATA-POSTAL-DATA-CITY = ORT01. "城市
LS_ADDRESSES-DATA-POSTAL-DATAX-CITY = 'X'.
LS_ADDRESSES-DATA-POSTAL-DATA-HOUSE_NO = 'X'. "门牌号
LS_ADDRESSES-DATA-POSTAL-DATAX-HOUSE_NO = HOUSE_NUM1.
CLEAR: LS_PHONE,LT_PHONE.
LS_PHONE-CONTACT-DATA-TELEPHONE = TELF1 ."电话
LS_PHONE-CONTACT-DATAX-TELEPHONE = ABAP_TRUE .
APPEND LS_PHONE TO LT_PHONE.
LS_ADDRESSES-DATA-COMMUNICATION-PHONE-PHONE = LT_PHONE.
APPEND LS_ADDRESSES TO LT_ADDRESSES.
LS_PARTNER-CENTRAL_DATA-ADDRESS-ADDRESSES = LT_ADDRESSES.
****客户数据表头************************************************
LS_HEADER-OBJECT_TASK = 'I'.
LS_CUSTOMER-HEADER = LS_HEADER.
****中心数据****************************************************
LS_CENTRAL-DATA-KUKLA = KUKLA."客户分类
LS_CENTRAL-DATAX-KUKLA = 'X'.
LS_CENTRAL-DATA-BRAN2 = BRAN2."行业代码
LS_CENTRAL-DATAX-BRAN1 = 'X'.
LS_CENTRAL_DATA-CENTRAL = LS_CENTRAL.
LS_CENTRAL-DATA-BAHNE = BAHNE. "社会信用代码
LS_CENTRAL-DATAX-BAHNE = 'X'.
LS_CENTRAL-DATA-BAHNS = BAHNS. "法人电话
LS_CENTRAL-DATAX-BAHNS = 'X'.
LS_CENTRAL-DATA-LOCCO = LOCCO. "法人
LS_CENTRAL-DATAX-LOCCO = 'X'.
LS_CENTRAL-DATA-KATR1 = KATR1. "是否关联客户
LS_CENTRAL-DATAX-KATR1 = 'X'.
LS_CENTRAL-DATA-KATR2 = KATR2. "拦账日
LS_CENTRAL-DATAX-KATR2 = 'X'.
LS_CENTRAL-DATA-KATR3 = KATR3. "对账标识
LS_CENTRAL-DATAX-KATR3 = 'X'.
LS_CENTRAL-DATA-KATR4 = KATR4. "票随货到标识
LS_CENTRAL-DATAX-KATR4 = 'X'.
LS_CENTRAL-DATA-KATR5 = KATR5. "客户与业务员对应标识
LS_CENTRAL-DATAX-KATR5 = 'X'.
LS_CENTRAL-DATA-KATR6 = KATR6. "区域/组代码
LS_CENTRAL-DATAX-KATR6 = 'X'.
LS_CENTRAL-DATA-KATR7 = KATR7. "业务代码
LS_CENTRAL-DATAX-KATR7 = 'X'.
LS_CENTRAL_DATA-CENTRAL = LS_CENTRAL.
"客户销售的出发票
LS_TAX_IND-TASK = 'I'.
LS_TAX_IND-DATA_KEY-ALAND = 'CN'.
LS_TAX_IND-DATA_KEY-TATYP = 'MWST'.
LS_TAX_IND-DATA-TAXKD = TAXKD. "税分类
LS_TAX_IND-DATAX-TAXKD = 'X'.
APPEND LS_TAX_IND TO LT_TAX_IND.
LS_CENTRAL_DATA-TAX_IND-TAX_IND = LT_TAX_IND.
LS_CUSTOMER-CENTRAL_DATA = LS_CENTRAL_DATA.
****公司代码数据************************************************
IF BUKRS IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' " 统驭科目补零
EXPORTING
INPUT = AKONT
IMPORTING
OUTPUT = AKONT.
LS_COMPANY-TASK = 'I'.
LS_COMPANY-DATA_KEY-BUKRS = BUKRS. " 公司代码
LS_COMPANY-DATA-AKONT = AKONT. " 统驭科目
APPEND LS_COMPANY TO LT_COMPANY.
LS_COMPANY_DATA-COMPANY = LT_COMPANY.
LS_CUSTOMER-COMPANY_DATA = LS_COMPANY_DATA.
ENDIF.
*****销售数据****************************************************
IF VKORG IS NOT INITIAL .
LS_SALES-TASK = 'I'.
LS_SALES-DATA_KEY-VKORG = VKORG. " 销售组织
LS_SALES-DATA_KEY-VTWEG = '00'. " 分销渠道
LS_SALES-DATA_KEY-SPART = '00'. " 产品组
LS_SALES-DATA-KDGRP = KDGRP. "客户组
LS_SALES-DATAX-KDGRP = ABAP_TRUE.
LS_SALES-DATA-VKBUR = VKBUR. "销售部门
LS_SALES-DATAX-VKBUR = ABAP_TRUE.
LS_SALES-DATA-VKGRP = VKGRP. "销售组
LS_SALES-DATAX-VKGRP = ABAP_TRUE.
LS_SALES-DATA-KALKS = KALKS. "客户定价过程
LS_SALES-DATAX-KALKS = ABAP_TRUE.
LS_SALES-DATA-VWERK = VWERK. "工厂
LS_SALES-DATAX-VWERK = ABAP_TRUE.
LS_SALES-DATA-VSBED = '01'. "装运条件
LS_SALES-DATAX-VSBED = ABAP_TRUE.
LS_SALES-DATA-WAERS = WAERS."币种
LS_SALES-DATAX-WAERS = ABAP_TRUE.
LS_SALES-DATA-ZTERM = ZTERM."付款条件
LS_SALES-DATAX-ZTERM = ABAP_TRUE.
LS_SALES-DATA-KTGRD = KTGRD."客户科目分配组
LS_SALES-DATAX-KTGRD = ABAP_TRUE.
"Function伙伴功能
PARVW = 'ZP'. "销售员类别
LS_FUNCTIONS-TASK = 'I'.
CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
EXPORTING
INPUT = PARVW "售达方
IMPORTING
OUTPUT = LS_FUNCTIONS-DATA_KEY-PARVW.
CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
EXPORTING
INPUT = KUNN2 "业务合作伙伴
IMPORTING
OUTPUT = LS_FUNCTIONS-DATA-PARTNER.
APPEND LS_FUNCTIONS TO LT_FUNCTIONS.
LS_SALES-FUNCTIONS-FUNCTIONS = LT_FUNCTIONS.
APPEND LS_SALES TO LT_SALES.
LS_SALES_DATA-SALES = LT_SALES.
LS_CUSTOMER-SALES_DATA = LS_SALES_DATA.
ENDIF.
*****银行数据****************************************************
LS_BANKS-DATA-BANK_KEY = BANKL. "银行代码
LS_BANKS-DATAX-BANK_KEY = ABAP_TRUE.
LS_BANKS-DATA-BANKACCOUNTNAME = BANKA. "开户行
LS_BANKS-DATAX-BANKACCOUNTNAME = ABAP_TRUE. "开户行
LS_BANKS-DATA-BANK_ACCT = BANKN. "账号
LS_BANKS-DATAX-BANK_ACCT = ABAP_TRUE. "
LS_BANKS-DATA-BANK_CTRY = 'CN'. "银行国家代码
LS_BANKS-DATAX-BANK_CTRY = ABAP_TRUE. "
APPEND LS_BANKS TO LT_BANKS.
LS_PARTNER-CENTRAL_DATA-BANKDETAIL-BANKDETAILS = LT_BANKS.
"拿到PARTNER和CUSTOMER数据开始创建客户
LS_DATA-PARTNER = LS_PARTNER.
LS_DATA-CUSTOMER = LS_CUSTOMER.
APPEND LS_DATA TO LT_DATA.
CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
EXPORTING
I_DATA = LT_DATA
* I_EXT_DATA =
IMPORTING
E_RETURN = LT_RETURN.
LOOP AT LT_RETURN INTO LS_RETURN.
LOOP AT LS_RETURN-OBJECT_MSG INTO LS_MSG WHERE TYPE = 'E' OR TYPE = 'A'.
CONCATENATE EV_ZMSG LS_MSG-MESSAGE INTO EV_ZMSG.
ENDLOOP.
ENDLOOP.
IF EV_ZMSG IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = ABAP_TRUE.
* 根据伙伴GUID取出客户编号
LS_PARTNERGUID_LIST = LS_PARTNER-HEADER-OBJECT_INSTANCE-BPARTNERGUID.
APPEND LS_PARTNERGUID_LIST TO LT_PARTNERGUID_LIST.
LT_CUSTOMER_LIST = CVI_MAPPER=>GET_INSTANCE( )->GET_ASSIGNED_CUSTOMERS_FOR_BPS(
I_PARTNER_GUIDS = LT_PARTNERGUID_LIST ).
IF LT_CUSTOMER_LIST IS NOT INITIAL.
READ TABLE LT_CUSTOMER_LIST INTO LS_CUSTOMER_LIST INDEX 1 .
IF SY-SUBRC EQ 0.
CONCATENATE '客户' LS_CUSTOMER_LIST-CUSTOMER '创建成功!' INTO EV_ZMSG.
KUNNR = LS_CUSTOMER_LIST-CUSTOMER. "导出KUNNR
EV_ZTYPE = 'S'.
STATUS = 'S02'.
ENDIF.
ENDIF.
ELSE.
* EV_ZMSG = '客户创建出错,客户部分数据出错,请检查是否是BP伙伴功能问题。'.
EV_ZTYPE = 'E'.
STATUS = 'S03'.
EXIT.
ENDIF.
*-------------------------------------------------------------------------------*
"客户创建成功后开始维护税号等数据
DATA :LT_TAXR TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA :LV_TAXMSG TYPE CHAR100.
CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
EXPORTING
businesspartner = KUNNR
taxtype = 'CN5'
taxnumber = TAXNUMXL
TABLES
RETURN = LT_TAXR .
LOOP AT LT_TAXR WHERE TYPE = 'E' OR TYPE = 'A'.
CONCATENATE LV_TAXMSG LT_TAXR-MESSAGE INTO LV_TAXMSG.
ENDLOOP.
IF LV_TAXMSG IS INITIAL .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = ABAP_TRUE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
EV_ZMSG = '客户创建成功,但是税号相关数据创建失败!'.
EV_ZTYPE = 'E'.
STATUS = 'S002'.
EXIT.
ENDIF.
*-------------------------------------------------------------------------------*
"客户创建成功后开始维护信用段数据
* 创建'MAINTAIN'对象
IO_FACADE = CL_UKM_FACADE=>CREATE( I_ACTIVITY = CL_UKM_CNST_EVENTING=>BP_MAINTENANCE ).
IO_BUPA_FACTORY = IO_FACADE->GET_BUPA_FACTORY( ).
LV_PARTNER = KUNNR.
LV_CREDIT_SGMNT = '6666'. "信用段 默认值
IO_PARTNER = IO_BUPA_FACTORY->GET_BUSINESS_PARTNER( LV_PARTNER ).
IO_PARTNER->GET_BP_CMS( IMPORTING ES_BP_CMS = LWA_UKM_S_BP_CMS ).
LWA_UKM_S_BP_CMS-RISK_CLASS = RISK_CLASS. "风险类
LWA_UKM_S_BP_CMS-CHECK_RULE = 'Z1'. "检查规则
LWA_UKM_S_BP_CMS-LIMIT_RULE = 'ZB2B-EXIST'. "信用规则
IO_PARTNER->SET_BP_CMS( LWA_UKM_S_BP_CMS ).
CALL METHOD IO_BUPA_FACTORY->GET_CREDIT_ACCOUNT
EXPORTING
I_PARTNER = LV_PARTNER
I_CREDIT_SGMNT = LV_CREDIT_SGMNT
RECEIVING
RO_CREDIT_ACCOUNT = IO_ACCOUNT.
IO_ACCOUNT->GET_BP_CMS_SGM( IMPORTING ES_BP_CMS_SGM = LW_BP_CREDIT_SGM ).
LW_BP_CREDIT_SGM-CREDIT_LIMIT = CREDIT_LIMIT."信用额度
IO_ACCOUNT->SET_BP_CMS_SGM( EXPORTING IS_BP_CMS_SGM = LW_BP_CREDIT_SGM ).
IO_BUPA_FACTORY->SAVE_ALL( EXPORTING I_UPD_TASK = ABAP_FALSE
RECEIVING ET_RETURN = LTC_RETURN ).
LOOP AT LTC_RETURN INTO LSC_RETURN WHERE MSGTY = 'E' OR MSGTY = 'A'.
CONCATENATE LV_MSG1 LSC_RETURN-MESSAGE INTO LV_MSG1.
ENDLOOP.
IF LV_MSG1 IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = ABAP_TRUE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
EV_ZMSG = '客户创建成功,但是信用相关数据创建失败!'.
EV_ZTYPE = 'S'.
STATUS = 'S002'.
ENDIF.