CL_MD_BP_MAINTAIN=>MAINTAIN创建供应商主数据

问题1:此方法创建税号国家CN0会被替换为CN5,需要后面单独用BAPI创建。

问题2:独立地址通讯使用方法没找到传入的位置,单独调用BAPI创建。

FUNCTION ZFM_MM_BP_MAIN.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IS_HEAD) TYPE  ZSSRM0002
*"     VALUE(I_TESTRUN) TYPE  CHAR1 OPTIONAL
*"  EXPORTING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  STRING
*"     VALUE(E_LIFNR) TYPE  LIFNR
*"  TABLES
*"      IT_KNB1 STRUCTURE  ZSSRM0003
*"----------------------------------------------------------------------
  DATA LV_TASK TYPE BUS_EI_OBJECT_TASK.

  DATA:
    LV_TABIX            TYPE SY-TABIX,
    LT_DATA             TYPE CVIS_EI_EXTERN_T,
    LS_DATA             TYPE CVIS_EI_EXTERN,
    LT_RETURN           TYPE BAPIRETM,
    LS_RETURN           TYPE BAPIRETI,
    LS_MSG              TYPE BAPIRETC,
    LS_PARTNER          TYPE BUS_EI_EXTERN,
    LS_VENDOR           TYPE VMDS_EI_EXTERN,
    LT_ROLES            TYPE BUS_EI_BUPA_ROLES_T,
    LS_ROLES            TYPE BUS_EI_BUPA_ROLES,
    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_FAX              TYPE BUS_EI_BUPA_FAX_T,
*    LS_FAX              TYPE BUS_EI_BUPA_FAX,

    LT_MAIL             TYPE BUS_EI_BUPA_SMTP_T,
    LS_MAIL             TYPE BUS_EI_BUPA_SMTP,

    LT_TAXNUMBER        TYPE BUS_EI_BUPA_TAXNUMBER_T,
    LS_TAXNUMBER        TYPE BUS_EI_BUPA_TAXNUMBER,
    LS_STRUC_TAX        TYPE BUS_EI_STRUC_TAX,

    LT_REMARKS          TYPE BUS_EI_BUPA_COMREM_T,
    LS_REMARKS          TYPE BUS_EI_BUPA_COMREM,
    LT_BANK             TYPE BUS_EI_BUPA_BANKDETAIL_T,
    LS_BANK             TYPE BUS_EI_BUPA_BANKDETAIL,
    LT_COMPANY          TYPE VMDS_EI_COMPANY_T,
    LS_COMPANY          TYPE VMDS_EI_COMPANY,
    LT_PURCHASING       TYPE VMDS_EI_PURCHASING_T,
    LS_PURCHASING       TYPE VMDS_EI_PURCHASING,
    LT_FUNCTIONS        TYPE VMDS_EI_FUNCTIONS_T,
    LS_FUNCTIONS        TYPE VMDS_EI_FUNCTIONS,
    LV_PARTNER_GUID     TYPE BU_PARTNER_GUID,
    LS_CVIS_ERROR       TYPE CVIS_ERROR,
    LT_BAPIRET2         TYPE BAPIRET2_T,
    LS_BAPIRET2         TYPE BAPIRET2,
* 根据伙伴GUID取出供应商编号
    LT_PARTNERGUID_LIST TYPE BU_PARTNER_GUID_T,
    LS_PARTNERGUID_LIST TYPE BU_PARTNER_GUID,
    LT_VENDOR_LIST      TYPE CVIS_VEND_LINK_T,
    LS_VENDOR_LIST      TYPE CVI_VEND_LINK..

  IF IS_HEAD IS INITIAL.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD抬头数据为空!'.
    RETURN.
  ENDIF.

*  IF IT_KNB1[] IS INITIAL.
*    E_CODE = 'E'.
*    E_MSG = 'IT_KNB1表数据为空!'.
*    RETURN.
*  ENDIF.

*  IF IS_HEAD-LIFNR IS INITIAL.
*    E_CODE = 'E'.
*    E_MSG = 'IS_HEAD-LIFNR供应商编码必填!'.
*    RETURN.
*  ELSE.
*    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
*      EXPORTING
*        INPUT  = IS_HEAD-LIFNR
*      IMPORTING
*        OUTPUT = IS_HEAD-LIFNR.
*  ENDIF.

  CASE IS_HEAD-ZTYPE.
    WHEN 1.
      LV_TASK = 'I'.
    WHEN 2.
      LV_TASK = 'U'.
    WHEN OTHERS.
      E_CODE = 'E'.
      IF IS_HEAD-ZTYPE IS INITIAL.
        E_MSG = 'IS_HEAD-ZTYPE业务类型必填!'.
      ELSE.
        E_MSG = 'IS_HEAD-ZTYPE传入了错误的业务类型!'.
      ENDIF.
      RETURN.
  ENDCASE.

  IF IS_HEAD-LTYPE IS INITIAL AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-LTYPE供应商类型必填!'.
    RETURN.
    RETURN.
  ENDIF.

  IF IS_HEAD-KTOKK IS INITIAL AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-KTOKK账户组必填!'.
    RETURN.
  ELSEIF IS_HEAD-KTOKK NE 'Z005' AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-KTOKK账户组仅允许默认值:Z005!'.
    RETURN.
  ENDIF.

  IF IS_HEAD-ROLE IS INITIAL AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-ROLEBP角色必填!'.
    RETURN.
  ELSEIF IS_HEAD-ROLE NE 'ZV01' AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-ROLEBP角色仅允许默认值:Z005!'.
    RETURN.
  ENDIF.

  IF IS_HEAD-NAME1 IS INITIAL AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-NAME1供应商名称必填!'.
    RETURN.
  ENDIF.

  IF IS_HEAD-BU_SORT1 IS INITIAL AND LV_TASK EQ 'I'.
    E_CODE = 'E'.
    E_MSG = 'IS_HEAD-BU_SORT1供应商简称必填!'.
    RETURN.
  ENDIF.

  IF IS_HEAD-STCEG IS INITIAL.
    E_CODE = 'E'.
    E_MSG  = 'IS_HEAD-STCEG 税号必填!'.
    RETURN.
  ELSE.
    SELECT SINGLE PARTNER FROM DFKKBPTAXNUM
     WHERE TAXNUM EQ @IS_HEAD-STCEG
       AND TAXTYPE EQ 'CN0'
      INTO @E_LIFNR.
    IF SY-SUBRC EQ 0.
      E_CODE = 'E'.
      E_MSG  = '当前客户税号:' && IS_HEAD-STCEG && '已经存在,BP号:' && E_LIFNR.
      RETURN.
    ENDIF.
  ENDIF.

  CASE LV_TASK.
    WHEN 'I'.
      TRY .
          LV_PARTNER_GUID = CL_UUID_FACTORY=>CREATE_SYSTEM_UUID( )->CREATE_UUID_X16( ).
        CATCH CX_UUID_ERROR.
      ENDTRY.

    WHEN 'U'.
      SELECT SINGLE BUT000~PARTNER_GUID
        INTO @LV_PARTNER_GUID
        FROM BUT000
       WHERE PARTNER EQ @IS_HEAD-LIFNR.
      IF SY-SUBRC NE 0 .
        E_CODE = 'E'.
        E_MSG = '业务伙伴编号不存在,不能更新!'.
        RETURN.
      ENDIF.

  ENDCASE.

  "基本信息
  LS_PARTNER-HEADER-OBJECT_TASK                  = LV_TASK.
*LS_PARTNER-HEADER-OBJECT_INSTANCE-BPARTNER     = LV_LIFNR."i_data-lifnr.
  LS_PARTNER-HEADER-OBJECT_INSTANCE-BPARTNERGUID = LV_PARTNER_GUID.
****业务合作伙伴数据的中心数据***********************************
  IF LV_TASK EQ 'I'.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CONTROL-CATEGORY         = 2.                     "业务伙伴类别
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CONTROL-GROUPING         = 'Z005'.  "业务伙伴分组
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CENTRALDATA-TITLE_KEY    = '0003'.                "称谓
  ENDIF.

  IF IS_HEAD-BU_SORT1 IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CENTRALDATA-SEARCHTERM1  = IS_HEAD-BU_SORT1.  "检索项1
    LS_PARTNER-CENTRAL_DATA-COMMON-DATAX-BP_CENTRALDATA-SEARCHTERM1 = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-BU_SORT2 IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_CENTRALDATA-SEARCHTERM2  = IS_HEAD-BU_SORT2.  "检索项2
    LS_PARTNER-CENTRAL_DATA-COMMON-DATAX-BP_CENTRALDATA-SEARCHTERM2 = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-NAME1 IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_ORGANIZATION-NAME1       = IS_HEAD-NAME1. "名称
    LS_PARTNER-CENTRAL_DATA-COMMON-DATAX-BP_ORGANIZATION-NAME1      = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-NAME2 IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_ORGANIZATION-NAME2       = IS_HEAD-NAME2. "名称
    LS_PARTNER-CENTRAL_DATA-COMMON-DATAX-BP_ORGANIZATION-NAME2      = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-NAME3 IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_ORGANIZATION-NAME3       = IS_HEAD-NAME3. "名称
    LS_PARTNER-CENTRAL_DATA-COMMON-DATAX-BP_ORGANIZATION-NAME3      = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-NAME4 IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-COMMON-DATA-BP_ORGANIZATION-NAME4       = IS_HEAD-NAME4. "名称
    LS_PARTNER-CENTRAL_DATA-COMMON-DATAX-BP_ORGANIZATION-NAME4      = ABAP_TRUE.
  ENDIF.


*角色
  IF LV_TASK = 'I'.
    CLEAR LS_ROLES.
    LS_ROLES-TASK = LV_TASK.
    LS_ROLES-DATA_KEY = 'FLVN00'.
    LS_ROLES-DATA-ROLECATEGORY = 'FLVN00'.
    LS_ROLES-DATA-VALID_FROM = SY-DATUM.
    LS_ROLES-DATAX-VALID_FROM = ABAP_TRUE.
    LS_ROLES-DATA-VALID_TO = '99991231'.
    LS_ROLES-DATAX-VALID_TO = ABAP_TRUE.
    LS_ROLES-CURRENTLY_VALID = ABAP_TRUE.
    APPEND LS_ROLES TO LS_PARTNER-CENTRAL_DATA-ROLE-ROLES.

    CLEAR LS_ROLES.
    LS_ROLES-TASK = LV_TASK.
    LS_ROLES-DATA_KEY = 'FLVN01'.
    LS_ROLES-DATA-ROLECATEGORY = 'FLVN01'.
    LS_ROLES-DATA-VALID_FROM = SY-DATUM.
    LS_ROLES-DATAX-VALID_FROM = ABAP_TRUE.
    LS_ROLES-DATA-VALID_TO = '99991231'.
    LS_ROLES-DATAX-VALID_TO = ABAP_TRUE.
    LS_ROLES-CURRENTLY_VALID = ABAP_TRUE.
    APPEND LS_ROLES TO LS_PARTNER-CENTRAL_DATA-ROLE-ROLES.
  ENDIF.

**税号(CN0会变成CN5???)
*  IF IS_HEAD-STCEG IS NOT INITIAL.
*    LS_TAXNUMBER-TASK = LV_TASK.
*    LS_STRUC_TAX-TAXTYPE = 'CN0'.
*    LS_STRUC_TAX-TAXNUMBER = IS_HEAD-STCEG.
*    LS_STRUC_TAX-TAXNUMXL  = '1234567890'.
*    LS_TAXNUMBER-DATA_KEY  = LS_STRUC_TAX.
*    APPEND LS_TAXNUMBER TO LT_TAXNUMBER.
*    LS_PARTNER-CENTRAL_DATA-TAXNUMBER-CURRENT_STATE = ABAP_TRUE.
*    LS_PARTNER-CENTRAL_DATA-TAXNUMBER-TAXNUMBERS = LT_TAXNUMBER.
*  ENDIF.

  "地址信息
  CLEAR LT_ADDRESSES.
  LS_ADDRESSES-TASK                          = LV_TASK.
  LS_ADDRESSES-DATA_KEY-GUID                 = LV_PARTNER_GUID.

  IF IS_HEAD-STREET IS NOT INITIAL.
    LS_ADDRESSES-DATA-POSTAL-DATA-STREET       = IS_HEAD-STREET.            "街道地址
    LS_ADDRESSES-DATA-POSTAL-DATAX-STREET      = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-POST_CODE1 IS NOT INITIAL.
    LS_ADDRESSES-DATA-POSTAL-DATA-POSTL_COD1   = IS_HEAD-POST_CODE1.        "邮编
    LS_ADDRESSES-DATA-POSTAL-DATAX-POSTL_COD1  = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-CITY1 IS NOT INITIAL.
    LS_ADDRESSES-DATA-POSTAL-DATA-CITY         = IS_HEAD-CITY1.        "城市
    LS_ADDRESSES-DATA-POSTAL-DATAX-CITY        = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-LAND1 IS NOT INITIAL.
    LS_ADDRESSES-DATA-POSTAL-DATA-COUNTRY      = IS_HEAD-LAND1.         "国家
    LS_ADDRESSES-DATA-POSTAL-DATAX-COUNTRY     = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-POST_CODE1 IS NOT INITIAL.
    LS_ADDRESSES-DATA-POSTAL-DATA-LANGU        = '1'.             "语言
    LS_ADDRESSES-DATA-POSTAL-DATAX-LANGU       = ABAP_TRUE.
  ENDIF.

  IF IS_HEAD-TEL_EXTENS1 IS NOT INITIAL.
    LS_ADDRESSES-DATA-POSTAL-DATA-HOUSE_NO     = IS_HEAD-TEL_EXTENS1.            "门牌号
    LS_ADDRESSES-DATA-POSTAL-DATAX-HOUSE_NO    = ABAP_TRUE.
  ENDIF.

*  IF IS_HEAD-POST_CODE1 IS NOT INITIAL.
*    LS_ADDRESSES-DATA-POSTAL-DATA-STR_SUPPL1   = IS_HEAD-POST_CODE1.        "街道2
*    LS_ADDRESSES-DATA-POSTAL-DATAX-STR_SUPPL1  = ABAP_TRUE.
*  ENDIF.

*  IF IS_HEAD-POST_CODE1 IS NOT INITIAL.
*  LS_ADDRESSES-DATA-POSTAL-DATA-REGION       = '190'.          "省份
*  LS_ADDRESSES-DATA-POSTAL-DATAX-REGION      = ABAP_TRUE.
*  ENDIF.

  LS_ADDRESSES-DATA-REMARK-CURRENT_STATE     = ABAP_TRUE.


*手机
  IF IS_HEAD-TEL_NUMBER1 IS NOT INITIAL.
    LS_PHONE-CONTACT-TASK            = LV_TASK.
    LS_PHONE-CONTACT-DATA-TELEPHONE  = IS_HEAD-TEL_NUMBER1.    "移动电话
    LS_PHONE-CONTACT-DATA-R_3_USER   = '3'.       "移动电话
    LS_PHONE-CONTACT-DATAX-TELEPHONE = ABAP_TRUE.
    LS_PHONE-CONTACT-DATAX-R_3_USER  = ABAP_TRUE.
    LS_PHONE-CONTACT-DATAX-TEL_NO    = ABAP_TRUE.
    APPEND LS_PHONE TO LT_PHONE.
    CLEAR: LS_PHONE.
    LS_ADDRESSES-DATA-COMMUNICATION-PHONE-PHONE = LT_PHONE.
  ENDIF.

*邮箱
  IF IS_HEAD-E_MAIL IS NOT INITIAL.
    LS_MAIL-CONTACT-TASK         = LV_TASK.
    LS_MAIL-CONTACT-DATA-E_MAIL  = IS_HEAD-E_MAIL.    "电子邮件地址
    LS_MAIL-CONTACT-DATAX-E_MAIL = ABAP_TRUE.
    APPEND LS_MAIL TO LT_MAIL.
    CLEAR: LS_MAIL.
    LS_ADDRESSES-DATA-COMMUNICATION-SMTP-CURRENT_STATE = ABAP_TRUE.
    LS_ADDRESSES-DATA-COMMUNICATION-SMTP-SMTP = LT_MAIL.
    APPEND LS_ADDRESSES TO LS_PARTNER-CENTRAL_DATA-ADDRESS-ADDRESSES.
    CLEAR: LS_ADDRESSES.
  ENDIF.

  "银行数据(电汇)
  DATA LV_BKVID TYPE BU_BKVID VALUE '0001'.
  IF IS_HEAD-ZBKVID EQ 'A'.
    LS_BANK-TASK                = LV_TASK.

    IF IS_HEAD-ZBANKS IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-ZBANKS银行国家(电汇)必填!'.
      RETURN.
    ENDIF.

    IF IS_HEAD-YBANKL IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-YBANKL银行代码(电汇)必填!'.
      RETURN.
    ENDIF.

    IF IS_HEAD-ZACCNAME IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-ZACCNAME银行账户(电汇)必填!'.
      RETURN.
    ENDIF.

    IF IS_HEAD-ZBANKN IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-ZBANKN银行账号(电汇)必填!'.
      RETURN.
    ENDIF.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LV_BKVID
      IMPORTING
        OUTPUT = LV_BKVID.

    LS_BANK-DATA_KEY            = LV_BKVID. "银行标识
    LS_BANK-DATA-BANK_CTRY      = IS_HEAD-ZBANKS.  "开户行国家
    LS_BANK-DATA-BANK_KEY       = IS_HEAD-ZBANKL.  "银行代码
    LS_BANK-DATA-ACCOUNTHOLDER  = IS_HEAD-ZACCNAME. "开户名称
    LS_BANK-DATA-BANK_ACCT      = IS_HEAD-ZBANKN+0(18). "银行帐号
    LS_BANK-DATA-BANK_REF       = IS_HEAD-ZBANKN+18(12). "银行帐号超长
    LS_BANK-DATA-ACCOUNTHOLDER  = IS_HEAD-ZACCNAME. "开户名称
*LS_BANK-DATA-BANKACCOUNTNAME  = LS_ZTSD0082-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.
    APPEND LS_BANK TO LT_BANK.
    CLEAR LS_BANK.
    LV_BKVID = LV_BKVID + 1.
  ENDIF.

  "银行数据(承兑)
  IF IS_HEAD-YBKVID EQ 'B'.
    LS_BANK-TASK                = LV_TASK.

    IF IS_HEAD-YBANKS IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-YBANKS银行国家(承兑)必填!'.
      RETURN.
    ENDIF.

    IF IS_HEAD-YBANKL IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-YBANKL银行代码(承兑)必填!'.
      RETURN.
    ENDIF.

    IF IS_HEAD-YBANKN IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-YBANKN银行账号(承兑)必填!'.
      RETURN.
    ENDIF.

    IF IS_HEAD-YACCNAME IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IS_HEAD-YACCNAME银行账户(承兑)必填!'.
      RETURN.
    ENDIF.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LV_BKVID
      IMPORTING
        OUTPUT = LV_BKVID.

    LS_BANK-DATA_KEY            = LV_BKVID. "银行标识
    LS_BANK-DATA-BANK_CTRY      = IS_HEAD-YBANKS.  "开户行国家
    LS_BANK-DATA-BANK_KEY       = IS_HEAD-YBANKL. "银行代码
    LS_BANK-DATA-BANK_ACCT      = IS_HEAD-YBANKN+0(18). "银行帐号
    LS_BANK-DATA-BANK_REF       = IS_HEAD-YBANKN+18(12). "银行帐号超长
    LS_BANK-DATA-ACCOUNTHOLDER  = IS_HEAD-YACCNAME. "开户名称
*LS_BANK-DATA-BANKACCOUNTNAME  = LS_ZTSD0082-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.
    APPEND LS_BANK TO LT_BANK.
    CLEAR LS_BANK.
  ENDIF.

  IF LT_BANK[] IS NOT INITIAL.
    LS_PARTNER-CENTRAL_DATA-BANKDETAIL-BANKDETAILS = LT_BANK.
*LS_VENDOR-HEADER-OBJECT_INSTANCE-LIFNR = LV_LIFNR."i_data-lifnr.
    LS_VENDOR-HEADER-OBJECT_TASK           = LV_TASK.
  ENDIF.

****公司代码数据************************************************
  LOOP AT IT_KNB1.

    IF IT_KNB1-BUKRS IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IT_KNB1-BUKRS公司代码必填!'.
      RETURN.
    ENDIF.

    IF IT_KNB1-AKONT IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IT_KNB1-AKONT统驭科目必填!'.
      RETURN.
    ENDIF.

    IF IT_KNB1-ZTERM IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IT_KNB1-ZTERM付款条件必填!'.
      RETURN.
    ENDIF.

    IF IT_KNB1-REPRF IS INITIAL.
      E_CODE = 'E'.
      E_MSG = 'IT_KNB1-REPRF检查重复发票必填!'.
      RETURN.
    ENDIF.
    CLEAR:LT_COMPANY.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'   " 统驭科目补零
      EXPORTING
        INPUT  = IT_KNB1-AKONT
      IMPORTING
        OUTPUT = IT_KNB1-AKONT.

    LS_COMPANY-TASK           = LV_TASK.
    LS_COMPANY-DATA_KEY-BUKRS = IT_KNB1-BUKRS."i_data-bukrs.         "公司代码
    LS_COMPANY-DATA-AKONT     = IT_KNB1-AKONT."i_data-akont.         "统驭科目
*    ls_company-data-zuawa     = i_data-zuawa.         "排序码
    LS_COMPANY-DATA-ZTERM     = IT_KNB1-ZTERM."i_data-zterm.         "付款条件
    LS_COMPANY-DATA-REPRF     = IT_KNB1-REPRF.         "检查重复发票
    LS_COMPANY-DATAX-AKONT    = ABAP_TRUE.
    LS_COMPANY-DATAX-ZUAWA    = ABAP_TRUE.
    LS_COMPANY-DATAX-ZTERM    = ABAP_TRUE.
    LS_COMPANY-DATAX-REPRF    = ABAP_TRUE.
    APPEND LS_COMPANY TO LT_COMPANY.
    CLEAR LS_COMPANY.
  ENDLOOP.

  LS_VENDOR-COMPANY_DATA-COMPANY = LT_COMPANY.

****采购数据****************************************************
  CLEAR:LT_PURCHASING.
  LS_PURCHASING-TASK           = LV_TASK.
  LS_PURCHASING-DATA_KEY-EKORG = '1000'.  "采购组织
  LS_PURCHASING-DATA-WAERS     = 'CNY'.  "货币
  LS_PURCHASING-DATA-WEBRE     = ABAP_TRUE.  "基于收货的发票校验
  LS_PURCHASING-DATA-ZTERM     = '0001'.  "付款条件
*    ls_purchasing-data-ekgrp     = i_data-ekgrp.
  LS_PURCHASING-DATAX-WAERS    = ABAP_TRUE.
  LS_PURCHASING-DATAX-WEBRE    = ABAP_TRUE.
  LS_PURCHASING-DATAX-ZTERM    = ABAP_TRUE.
*    ls_purchasing-datax-ekgrp    = abap_true.

  APPEND LS_PURCHASING TO LT_PURCHASING.
  LS_VENDOR-PURCHASING_DATA-PURCHASING = LT_PURCHASING.

  LS_DATA-PARTNER = LS_PARTNER.
  LS_DATA-VENDOR  = LS_VENDOR.
  IF LV_TASK EQ 'I'.
    LS_DATA-ENSURE_CREATE-CREATE_VENDOR = ABAP_TRUE.
  ENDIF.

  APPEND LS_DATA TO LT_DATA.

*  DATA LS_000 TYPE BURS_EI_EXTERN.

*  APPEND LS_PR2 TO LS_000-CENTRAL_DATA-ADDRESS.
*-CENTRAL_DATA-ADDRESS-ADDRESSES.


*call bapi创建供应商主数据
  CL_MD_BP_MAINTAIN=>MAINTAIN(
    EXPORTING
      I_DATA     = LT_DATA
      I_TEST_RUN = I_TESTRUN
    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'.
      E_MSG = E_MSG && LS_MSG-MESSAGE.
    ENDLOOP.
    CLEAR LS_RETURN.
  ENDLOOP.

  IF LS_MSG IS INITIAL.

    IF I_TESTRUN IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = ABAP_TRUE.

* 根据伙伴GUID取出供应商编号
      CLEAR: LT_PARTNERGUID_LIST,LT_VENDOR_LIST.
      LS_PARTNERGUID_LIST = LS_PARTNER-HEADER-OBJECT_INSTANCE-BPARTNERGUID.
      APPEND LS_PARTNERGUID_LIST TO LT_PARTNERGUID_LIST.
      LT_VENDOR_LIST = CVI_MAPPER=>GET_INSTANCE( )->GET_ASSIGNED_VENDORS_FOR_BPS(
                                                I_PARTNER_GUIDS = LT_PARTNERGUID_LIST ).
      IF LT_VENDOR_LIST IS NOT INITIAL.
        READ TABLE LT_VENDOR_LIST INTO LS_VENDOR_LIST INDEX 1 .
        IF SY-SUBRC EQ 0.
          CONCATENATE '供应商' LS_VENDOR_LIST-VENDOR '创建成功!' INTO E_MSG.
        ENDIF.

        E_CODE = 'S'.
        E_LIFNR = LS_VENDOR_LIST-VENDOR.
      ELSE.
        "可能创建成功了BP,但未创建成功Vendor

        LS_CVIS_ERROR = CVI_MAPPER=>GET_INSTANCE( )->UNDO_ASSIGNMENTS(
                                                I_FOR_PARTNERS = LT_PARTNERGUID_LIST ).
        E_CODE = 'E'.
        E_MSG  = '供应商创建出错,供应商部分数据出错,请检查是否是BP伙伴功能问题!'.
      ENDIF.

    ELSE.

      E_CODE = 'E'.
      E_MSG  = '数据校验通过!'.
      RETURN.
    ENDIF.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
*   RETURN        =
      .
    E_CODE = 'E'.
  ENDIF.

  IF E_CODE EQ 'S' AND I_TESTRUN IS INITIAL.
*税号
    IF IS_HEAD-STCEG IS NOT INITIAL.
      DATA:
        LV_TAXTYPE   TYPE  BAPIBUS1006TAX-TAXTYPE,
        LV_TAXNUMBER TYPE  BAPIBUS1006TAX-TAXNUMBER.

      DATA:LS_RET_TAX TYPE BAPIRET2,
           LT_RET_TAX TYPE TABLE OF BAPIRET2.

      LV_TAXTYPE   = 'CN0'.
      LV_TAXNUMBER = IS_HEAD-STCEG.

      CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
        EXPORTING
          BUSINESSPARTNER = E_LIFNR
          TAXTYPE         = LV_TAXTYPE
          TAXNUMBER       = LV_TAXNUMBER
        TABLES
          RETURN          = LT_RET_TAX.
      IF NOT LINE_EXISTS( LT_RET_TAX[ TYPE = 'E' ] ).
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
        E_MSG = E_MSG && '税号写入成功!'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        E_MSG = E_MSG && '税号写入失败,请手工处理!'.
      ENDIF.
    ENDIF.

    IF IS_HEAD-TEL_NUMBER2 IS NOT INITIAL OR IS_HEAD-MOB_NUMBER2 IS NOT INITIAL
      OR IS_HEAD-FAX_NUMBER2 IS NOT INITIAL OR IS_HEAD-SMTP_ADDR2 IS NOT INITIAL.

      DATA:LS_TEL     TYPE BAPIADTEL,
           LT_TEL     TYPE TABLE OF BAPIADTEL,
           LS_TELX    TYPE BAPIADTELX,
           LT_TELX    TYPE TABLE OF BAPIADTELX,

           LS_FAX     TYPE BAPIADFAX,
           LT_FAX     TYPE TABLE OF BAPIADFAX,
           LS_FAXX    TYPE BAPIADFAXX,
           LT_FAXX    TYPE TABLE OF BAPIADFAXX,

           LS_MAIL_DL TYPE BAPIADSMTP,
           LT_MAIL_DL TYPE TABLE OF BAPIADSMTP,
           LS_MAILX   TYPE BAPIADSMTX,
           LT_MAILX   TYPE TABLE OF BAPIADSMTX,

           LS_RETURN2 TYPE BAPIRET2,
           LT_RETURN2 TYPE TABLE OF BAPIRET2.

      IF IS_HEAD-TEL_NUMBER2 IS NOT INITIAL.
        LS_TEL-COUNTRY = 'CN'.
        LS_TELX-COUNTRY = ABAP_TRUE.

        LS_TEL-TELEPHONE = IS_HEAD-TEL_NUMBER2.
        LS_TELX-TELEPHONE = ABAP_TRUE.

        LS_TEL-R_3_USER  = '1'.
        LS_TELX-R_3_USER = ABAP_TRUE.

        LS_TEL-STD_NO  = ABAP_TRUE.
        LS_TELX-STD_NO = ABAP_TRUE.

        APPEND LS_TEL TO LT_TEL.
        APPEND LS_TELX TO LT_TELX.
        CLEAR:LS_TEL,LS_TELX.
      ENDIF.

      IF IS_HEAD-MOB_NUMBER2 IS NOT INITIAL.
        LS_TEL-COUNTRY = 'CN'.
        LS_TELX-COUNTRY = ABAP_TRUE.
        LS_TEL-TELEPHONE = IS_HEAD-MOB_NUMBER2.
        LS_TELX-TELEPHONE = ABAP_TRUE.

        LS_TEL-R_3_USER = '3'.
        LS_TELX-R_3_USER = ABAP_TRUE.

        LS_TEL-STD_NO  = ABAP_TRUE.
        LS_TELX-STD_NO = ABAP_TRUE.
        APPEND LS_TEL TO LT_TEL.
        APPEND LS_TELX TO LT_TELX.
        CLEAR:LS_TEL,LS_TELX.
      ENDIF.

      IF IS_HEAD-FAX_NUMBER2 IS NOT INITIAL.
        LS_FAX-COUNTRY = 'CN'.
        LS_FAXX-COUNTRY = ABAP_TRUE.

        LS_FAX-FAX = IS_HEAD-FAX_NUMBER2.
        LS_FAXX-FAX = ABAP_TRUE.
        APPEND LS_FAX TO LT_FAX.
        APPEND LS_FAXX TO LT_FAXX.
        CLEAR:LS_FAX,LS_FAXX.
      ENDIF.

      IF IS_HEAD-SMTP_ADDR2 IS NOT INITIAL..
        LS_MAIL_DL-E_MAIL  = IS_HEAD-SMTP_ADDR2.
        LS_MAILX-E_MAIL = ABAP_TRUE.
        APPEND LS_MAIL_DL TO LT_MAIL_DL.
        APPEND LS_MAILX TO LT_MAILX.
        CLEAR:LS_MAIL_DL,LS_MAILX.
      ENDIF.

      CALL FUNCTION 'BAPI_BUPA_CENTRAL_CHANGE'
        EXPORTING
          BUSINESSPARTNER        = E_LIFNR
*         CENTRALDATA            =
*         CENTRALDATAPERSON      =
*         CENTRALDATAORGANIZATION             =
*         CENTRALDATAGROUP       =
*         CENTRALDATA_X          =
*         CENTRALDATAPERSON_X    =
*         CENTRALDATAORGANIZATION_X           =
*         CENTRALDATAGROUP_X     =
*         VALID_DATE             = SY-DATLO
*         DUPLICATE_MESSAGE_TYPE =
*         DUPLICATE_CHECK_ADDRESS             =
        TABLES
          TELEFONDATANONADDRESS  = LT_TEL
          FAXDATANONADDRESS      = LT_FAX
*         TELETEXDATANONADDRESS  =
*         TELEXDATANONADDRESS    =
          E_MAILDATANONADDRESS   = LT_MAIL_DL
*         RMLADDRESSDATANONADDRESS            =
*         X400ADDRESSDATANONADDRESS           =
*         RFCADDRESSDATANONADDRESS            =
*         PRTADDRESSDATANONADDRESS            =
*         SSFADDRESSDATANONADDRESS            =
*         URIADDRESSDATANONADDRESS            =
*         PAGADDRESSDATANONADDRESS            =
*         COMMUNICATIONNOTESNONADDRESS        =
*         COMMUNICATIONUSAGENONADDRESS        =
          TELEFONDATANONADDRESSX = LT_TELX
          FAXDATANONADDRESSX     = LT_FAXX
*         TELETEXDATANONADDRESSX =
*         TELEXDATANONADDRESSX   =
          E_MAILDATANONADDRESSX  = LT_MAILX
*         RMLADDRESSDATANONADDRESSX           =
*         X400ADDRESSDATANONADDRESSX          =
*         RFCADDRESSDATANONADDRESSX           =
*         PRTADDRESSDATANONADDRESSX           =
*         SSFADDRESSDATANONADDRESSX           =
*         URIADDRESSDATANONADDRESSX           =
*         PAGADDRESSDATANONADDRESSX           =
*         COMMUNICATIONNOTESNONADDRESSX       =
*         COMMUNICATIONUSAGENONADDRESSX       =
          RETURN                 = LT_RETURN2
*         ADDRESSDUPLICATES      =
        .

      DATA LV_MSG TYPE STRING.
      IF LINE_EXISTS( LT_RETURN2[ TYPE = 'E' ] ).
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.  "如包含E类型,则判断为失败,回滚数据

        LOOP AT LT_RETURN2 INTO LS_RETURN2 WHERE TYPE EQ 'E'.
          LV_MSG = LV_MSG && LS_RETURN2-MESSAGE.
          CLEAR:LS_RETURN2.
        ENDLOOP.
        E_MSG = E_MSG && '独立地址通讯扩展失败,请手工处理!' && LV_MSG.
      ELSE.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.

        E_MSG = E_MSG && '独立地址通讯扩展成功!'.
      ENDIF.
    ENDIF.
  ENDIF.

ENDFUNCTION.


关键词: ABAP MM

网友评论

发表评论