BP批到函数

发布时间 2023-05-30 14:21:51作者: ABAP-武汉-寒夜

供应商;

FUNCTION z_rfc_oa_mm_supplier_add.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(SUPPLIER) TYPE  ZZDT_OA_ERP_SUPPLIER_ADD_REQ
*"  EXPORTING
*"     VALUE(ES_RETURN) TYPE  ZZDT_OA_ERP_SUPPLIER_ADD_RESP
*"----------------------------------------------------------------------

**initialize logger. It should be always on the top of the FUNCTION.
  /afl/log_init.

**optional, you can specify at most 3 fields for search.
  /afl/set_custom_fields supplier-is_head-partner   supplier-is_head-name_org1  supplier-is_head-bu_sort1.


************************Data Declarations**************************
  DATA: ls_return_map TYPE mdg_bs_bp_msgmap_t,
        lt_data       TYPE cvis_ei_extern_t,
        lt_return     TYPE bapiretm,
        ls_return     TYPE bapireti,
        ls_retmsg     TYPE LINE OF bapiretct,
        lv_text       TYPE string,
        lt_errors     TYPE STANDARD TABLE OF bapiret2,
        ls_errors     TYPE bapiret2,
        ls_data_new   TYPE REF TO data,
        lv_flag       TYPE char1,
        lv_mess       TYPE string,
        lv_msg        TYPE string.

  DATA: ls_data               LIKE LINE OF lt_data,
        ls_role               TYPE bus_ei_bupa_roles,
        ls_relation           TYPE burs_ei_extern,
        ls_company            TYPE vmds_ei_company,
        ls_addr               TYPE bus_ei_bupa_address,
        lt_phone              TYPE bus_ei_bupa_telephone_t,
        lt_fax                TYPE bus_ei_bupa_fax_t,
        lt_email              TYPE bus_ei_bupa_smtp_t,
        lt_tax                TYPE bus_ei_bupa_taxnumber_t,
        lt_ident              TYPE  bus_ei_bupa_identification_t,
        lt_bank               TYPE  bus_ei_bupa_bankdetail_t,
*        lt_tax1               TYPE vmds_ei_tax_ind_t,
        ls_purchasing_central TYPE vmds_ei_vmd_central,
        ls_zmmt001            TYPE zmmt001,
        lt_zmmt001            TYPE TABLE OF zmmt001.

  DATA: lv_guid        TYPE guid_32,
        lv_pguid       TYPE but000-partner_guid,
        lv_adguid      TYPE but020-address_guid,
        lv_adrnr       TYPE but020-addrnumber,
        lv_partner     LIKE ls_data-partner-header-object_instance-bpartner,
        lv_task        TYPE char1,
        lv_exist       TYPE char1,
        lv_tel_number1 TYPE adr2-tel_number,
        lv_tel_number3 TYPE adr2-tel_number,
        lv_consnumber1 TYPE adr2-consnumber,
        lv_consnumber3 TYPE adr2-consnumber,
        lv_tel_del     TYPE char1.

  DATA: lt_role_cat     TYPE fsbp_tb003a_tty,
        lt_cvi_role_cat TYPE cvis_role_category_t,
        ls_cvi_role_cat TYPE cvis_role_category.

  DATA: ls_functions_st       TYPE vmds_ei_functions,
        ls_functions_t        TYPE vmds_ei_functions_t,
        ls_functions          TYPE vmds_ei_vmd_functions,
        ls_purchasing_data_st TYPE vmds_ei_purchasing,
        ls_purchasing_data    TYPE vmds_ei_vmd_purchasing,
        ls_company_code_st    TYPE vmds_ei_company,
        ls_company_code       TYPE vmds_ei_vmd_company.


  CLEAR: lv_pguid, lv_guid, lv_task, lv_partner.
  CLEAR: ls_data.
  REFRESH: lt_data.

  IF supplier-is_head-partner IS NOT INITIAL.
    lv_partner = supplier-is_head-partner.
    lv_partner = |{ lv_partner ALPHA = IN }|.
    SELECT SINGLE partner_guid INTO lv_pguid FROM but000
      WHERE partner  = lv_partner.
    IF sy-subrc = 0.
      lv_task =  'U'.
    ENDIF.
  ENDIF.
  IF lv_task =  'U'.
    ls_data-partner-header-object_task = 'U'.
    ls_data-partner-header-object_instance-bpartner = lv_partner.
    ls_data-partner-header-object_instance-bpartnerguid = lv_pguid.
  ELSE.
******************************Guid*********************************
    CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
      RECEIVING
        uuid = lv_guid.

******************************Create VENDOR**********************
    ls_data-partner-header-object_task = 'I'.
    ls_data-partner-header-object_instance-bpartnerguid = lv_guid.
    lv_pguid = lv_guid.
  ENDIF.

***************** Partner / Central data / common *****************
  ls_data-partner-central_data-common-data-bp_control-category = '2'. "3group "2 Organization
  ls_data-partner-central_data-common-data-bp_control-grouping = supplier-is_head-bu_group. "Grouping

  ls_data-partner-central_data-common-data-bp_centraldata-searchterm1 = supplier-is_head-bu_sort1.
  ls_data-partner-central_data-common-data-bp_centraldata-searchterm2 = supplier-is_head-bu_sort2.
  ls_data-partner-central_data-common-data-bp_centraldata-centralblock = supplier-is_head-xblck.
*  ls_data-partner-central_data-common-data-bp_centraldata-title_key = SUPPLIER-is_head-anred.
  ls_data-partner-central_data-common-data-bp_centraldata-authorizationgroup = supplier-is_head-augrp.
  ls_data-partner-central_data-common-datax-bp_centraldata-searchterm1 = abap_true.
  ls_data-partner-central_data-common-datax-bp_centraldata-searchterm2 = abap_true.
  ls_data-partner-central_data-common-datax-bp_centraldata-centralblock = abap_true.
*  ls_data-partner-central_data-common-datax-bp_centraldata-title_key = abap_true.
  ls_data-partner-central_data-common-datax-bp_centraldata-authorizationgroup = abap_true.

  ls_data-partner-central_data-common-data-bp_organization-name1 = supplier-is_head-name_org1.
*  ls_data-partner-central_data-common-data-bp_organization-name2 = supplier-is_head-name_org2.
  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 *****************
  CLEAR: ls_addr.
  CLEAR: lv_adguid, lv_adrnr.
  SELECT SINGLE address_guid addrnumber INTO ( lv_adguid, lv_adrnr ) FROM but020
    WHERE partner  = lv_partner.
  IF sy-subrc = 0.
    ls_addr-task = 'U'.
    ls_addr-data_key-guid = lv_adguid.
  ELSE.
    ls_addr-task = lv_task."'I'.
  ENDIF.
  ls_addr-data_key-operation = 'XXDFLT'.
  ls_addr-data-postal-data-extaddressnumber = supplier-is_head-adext.      " 旧客商编码
  ls_addr-data-postal-data-city = supplier-is_head-city1.
  ls_addr-data-postal-data-postl_cod1 = supplier-is_head-post_code1.
  ls_addr-data-postal-data-street = supplier-is_head-street.
  ls_addr-data-postal-data-country = supplier-is_head-land1.
  ls_addr-data-postal-data-region = supplier-is_head-bezei.
  ls_addr-data-postal-data-languiso = supplier-is_head-spras.

  ls_addr-data-postal-datax-extaddressnumber = abap_true.
  ls_addr-data-postal-datax-city = abap_true.
  ls_addr-data-postal-datax-postl_cod1 = abap_true.
  ls_addr-data-postal-datax-street = abap_true.
  ls_addr-data-postal-datax-country = abap_true.
  ls_addr-data-postal-datax-region = abap_true.
  ls_addr-data-postal-datax-langu_iso = abap_true.

***-------------------Telephone number--------------------------***
  REFRESH: lt_phone.
  CLEAR: lv_tel_del, lv_tel_number1, lv_tel_number3, lv_consnumber1, lv_consnumber3.
  SELECT SINGLE tel_number consnumber INTO ( lv_tel_number1, lv_consnumber1 ) FROM adr2
    WHERE addrnumber = lv_adrnr AND r3_user = '1'.
  SELECT SINGLE tel_number consnumber INTO ( lv_tel_number3, lv_consnumber3 ) FROM adr2
    WHERE addrnumber = lv_adrnr AND r3_user = '3'.
  IF lv_tel_number1 IS INITIAL AND lv_tel_number3 IS INITIAL.
    IF supplier-is_head-tel_number <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING FIELD-SYMBOL(<ls_phone>).
      <ls_phone>-contact-task = 'I'.

      <ls_phone>-contact-data-telephone = supplier-is_head-tel_number.
      <ls_phone>-contact-data-consnumber = '001'.
      <ls_phone>-contact-data-r_3_user = '1'.

      <ls_phone>-contact-datax-telephone = abap_true.
      <ls_phone>-contact-datax-r_3_user = abap_true.
      <ls_phone>-contact-datax-consnumber = abap_true.
      UNASSIGN <ls_phone>.
    ENDIF.
    IF supplier-is_head-telf2 <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'I'.

      <ls_phone>-contact-data-telephone = supplier-is_head-telf2.
      <ls_phone>-contact-data-consnumber = '002'.
      <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-consnumber = abap_true.
      UNASSIGN <ls_phone>.
    ENDIF.
  ELSEIF lv_tel_number1 IS NOT INITIAL AND lv_tel_number3 IS NOT INITIAL.
    IF supplier-is_head-tel_number <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'U'.

      <ls_phone>-contact-data-telephone = supplier-is_head-tel_number.
      <ls_phone>-contact-data-consnumber = lv_consnumber1.
      <ls_phone>-contact-data-r_3_user = '1'.

      <ls_phone>-contact-datax-telephone = abap_true.
      <ls_phone>-contact-datax-r_3_user = abap_true.
      <ls_phone>-contact-datax-consnumber = abap_true.
      UNASSIGN <ls_phone>.
*    ELSE.
*      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      <ls_phone>-contact-task = 'D'.
*      <ls_phone>-contact-data-consnumber = lv_consnumber1.
*      <ls_phone>-contact-data-r_3_user = '1'.
*
*      <ls_phone>-contact-datax-r_3_user = abap_true.
*      <ls_phone>-contact-datax-consnumber = abap_true.
*      UNASSIGN <ls_phone>.
    ENDIF.
    IF supplier-is_head-telf2 <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'U'.

      <ls_phone>-contact-data-telephone = supplier-is_head-telf2.
      <ls_phone>-contact-data-consnumber = lv_consnumber3.
      <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-consnumber = abap_true.
      UNASSIGN <ls_phone>.
*    ELSE.
*      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      <ls_phone>-contact-task = 'D'.
*      <ls_phone>-contact-data-consnumber = lv_consnumber3.
*      <ls_phone>-contact-data-r_3_user = '3'.
*
*      <ls_phone>-contact-datax-r_3_user = abap_true.
*      <ls_phone>-contact-datax-consnumber = abap_true.
*      UNASSIGN <ls_phone>.
    ENDIF.
  ELSE.
    ""先删除再重新写入,否则第二个电话 002 写不进去
    IF lv_tel_number1 <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'D'.
      <ls_phone>-contact-data-consnumber = lv_consnumber1.
      <ls_phone>-contact-data-r_3_user = '1'.

      <ls_phone>-contact-datax-r_3_user = abap_true.
      <ls_phone>-contact-datax-consnumber = abap_true.
      UNASSIGN <ls_phone>.
    ENDIF.
    IF lv_tel_number3 <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'D'.
      <ls_phone>-contact-data-consnumber = lv_consnumber3.
      <ls_phone>-contact-data-r_3_user = '3'.

      <ls_phone>-contact-datax-r_3_user = abap_true.
      <ls_phone>-contact-datax-consnumber = abap_true.
      UNASSIGN <ls_phone>.

    ENDIF.

    IF supplier-is_head-tel_number <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'I'.

      <ls_phone>-contact-data-telephone = supplier-is_head-tel_number.
      <ls_phone>-contact-data-consnumber = '001'.
      <ls_phone>-contact-data-r_3_user = '1'.

      <ls_phone>-contact-datax-telephone = abap_true.
      <ls_phone>-contact-datax-r_3_user = abap_true.
      <ls_phone>-contact-datax-consnumber = abap_true.
      UNASSIGN <ls_phone>.
    ENDIF.
    IF supplier-is_head-telf2 <> ''.
      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
      <ls_phone>-contact-task = 'I'.

      <ls_phone>-contact-data-telephone = supplier-is_head-telf2.
      <ls_phone>-contact-data-consnumber = '002'.
      <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-consnumber = abap_true.
      UNASSIGN <ls_phone>.
    ENDIF.

  ENDIF.

****---------------------- fax number------------------------***
  IF supplier-is_head-fax_number IS NOT INITIAL.
    APPEND INITIAL LINE TO lt_fax ASSIGNING FIELD-SYMBOL(<ls_fax>).
    SELECT SINGLE telfx FROM lfa1 INTO @DATA(lv_telfx)
      WHERE lifnr = @lv_partner.
    IF sy-subrc = 0.
      <ls_fax>-contact-task = 'U'.
    ELSE.
      <ls_fax>-contact-task = 'I'.
    ENDIF.
    <ls_fax>-contact-data-fax  = supplier-is_head-fax_number.
    <ls_fax>-contact-data-r_3_user = 'X'.
    <ls_fax>-contact-datax-fax = abap_true.
    <ls_fax>-contact-datax-r_3_user = abap_true.
    <ls_fax>-currently_valid = abap_true.
  ENDIF.
****--------------------------Email------------------------***
  IF supplier-is_head-smtp_addr IS NOT INITIAL.
    APPEND INITIAL LINE TO lt_email ASSIGNING FIELD-SYMBOL(<ls_email>).
    SELECT COUNT(*) FROM adr6
      WHERE addrnumber = lv_adrnr.
    IF sy-subrc = 0.
      <ls_email>-contact-task = 'U'.
    ELSE.
      <ls_email>-contact-task = 'I'.
    ENDIF.
    <ls_email>-contact-data-e_mail = supplier-is_head-smtp_addr.
    <ls_email>-contact-datax-e_mail = abap_true.
    <ls_email>-currently_valid = abap_true.
  ENDIF.

  ls_addr-data-communication-phone-phone = lt_phone.
  ls_addr-data-communication-fax-fax = lt_fax.
  ls_addr-data-communication-smtp-smtp = lt_email.

  ls_addr-currently_valid = abap_false.

  APPEND ls_addr TO ls_data-partner-central_data-address-addresses.

**--------------------------Tax----------------------------***
  REFRESH: lt_tax.
  IF supplier-is_head-taxnumxl <> ''.
    APPEND INITIAL LINE TO lt_tax ASSIGNING FIELD-SYMBOL(<ls_tax>).
    SELECT SINGLE @abap_true INTO @lv_exist FROM dfkkbptaxnum WHERE partner = @lv_partner AND taxtype = @supplier-is_head-taxtype.
    IF lv_exist = abap_true.
      <ls_tax>-task = 'U'.
    ELSE.
      <ls_tax>-task = 'I'.
    ENDIF.
    <ls_tax>-data_key-taxtype = supplier-is_head-taxtype. "'IN2'.
    <ls_tax>-data_key-taxnumber = supplier-is_head-taxnumxl.  "'12345678956'.
    <ls_tax>-data_key-taxnumxl = supplier-is_head-taxnumxl.  "'12345678956'.

    ls_data-partner-central_data-taxnumber-taxnumbers = lt_tax.

    UNASSIGN <ls_tax>.
  ENDIF.
***--------------------------Ident Number----------------------------***
  REFRESH: lt_ident.
  IF supplier-is_head-type <> '' AND supplier-is_head-idnumber <> ''.
    APPEND INITIAL LINE TO lt_ident ASSIGNING FIELD-SYMBOL(<ls_ident>).
    SELECT SINGLE @abap_true INTO @lv_exist FROM but0id WHERE partner = @lv_partner AND type = @supplier-is_head-type." AND idnumber = @supplier-is_head-idnumber.
    IF lv_exist = abap_true.
      <ls_ident>-task = 'U'.
    ELSE.
      <ls_ident>-task = 'I'.
    ENDIF.
    <ls_ident>-data_key-identificationcategory = supplier-is_head-type. "ZBUP01
    <ls_ident>-data_key-identificationnumber = supplier-is_head-idnumber.  "'12345678956'.

    ls_data-partner-central_data-ident_number-ident_numbers = lt_ident.

    UNASSIGN <ls_ident>.
  ENDIF.

***--------------------------Bank----------------------------***
  REFRESH: lt_bank.
  DATA: lv_bkvid(4) TYPE n.
  SELECT MAX( bkvid ) FROM but0bk
    INTO @DATA(lv_bkvid_c)
   WHERE partner = @lv_partner.
  IF sy-subrc <> 0.
    lv_bkvid = 0.
  ELSE.
    lv_bkvid = lv_bkvid_c.
  ENDIF.
  IF lv_task NE 'U'.
    LOOP AT supplier-it_bank INTO DATA(ls_bank).
      IF ls_bank IS INITIAL.
        CONTINUE.
      ENDIF.
      APPEND INITIAL LINE TO lt_bank ASSIGNING FIELD-SYMBOL(<ls_bank>).

*    SELECT SINGLE bkvid INTO @ls_bank-bkvid FROM but0bk
*      WHERE partner = @lv_partner AND bankn = @ls_bank-bankn.
*    IF sy-subrc = 0.
*      <ls_bank>-task = 'U'.
*      <ls_bank>-data_key = ls_bank-bkvid.
*    ELSE.
*      <ls_bank>-task = 'I'.
*      lv_bkvid = lv_bkvid + 1.
*      <ls_bank>-data_key = lv_bkvid.
*    ENDIF.
      IF ls_bank-bkvid(1) EQ 'D'.
        <ls_bank>-task = 'D'.
*      <ls_bank>-data_key = ls_bank-bkvid+1.
        <ls_bank>-data_key = ls_bank-bkvid+1(4).
      ELSE.
        SELECT SINGLE bkvid INTO @ls_bank-bkvid FROM but0bk
          WHERE partner = @lv_partner AND bkvid = @ls_bank-bkvid.
        IF sy-subrc = 0.
          <ls_bank>-task = 'U'.
          <ls_bank>-data_key = ls_bank-bkvid.
        ELSE.
          <ls_bank>-task = 'I'.
          lv_bkvid = lv_bkvid + 1.
          <ls_bank>-data_key = lv_bkvid.
        ENDIF.
      ENDIF.

      <ls_bank>-data-bank_ctry = ls_bank-banks.
      <ls_bank>-datax-bank_ctry = 'X'.
      <ls_bank>-data-bank_key = ls_bank-bankl.
      <ls_bank>-datax-bank_key = 'X'.
      <ls_bank>-data-bank_acct = ls_bank-bankn.
      <ls_bank>-datax-bank_acct = 'X'.
      <ls_bank>-data-bank_ref = ls_bank-bkref.
      <ls_bank>-datax-bank_ref = 'X'.
      <ls_bank>-data-accountholder = ls_bank-koinh.
      <ls_bank>-datax-accountholder = 'X'.
      <ls_bank>-data-bankaccountname = ls_bank-accname.
      <ls_bank>-datax-bankaccountname = 'X'.

      ls_data-partner-central_data-bankdetail-bankdetails = lt_bank.

      UNASSIGN <ls_bank>.
    ENDLOOP.
  ENDIF.
********************* Partner / Central data / role****************
  CLEAR: ls_role.
  SELECT SINGLE mandt INTO @DATA(lv_mandt) FROM but100
    WHERE partner = @lv_partner
    AND rltyp = 'FLVN01'.
  IF sy-subrc NE 0.
    ls_role-task = 'I'.
    ls_role-data_key = 'FLVN01'.
    ls_role-data-rolecategory = 'FLVN01'.
    ls_role-data-valid_from = sy-datum.
    ls_role-data-valid_to = '99991231'.
    ls_role-currently_valid = abap_true.

    ls_role-datax-valid_from = abap_true.
    ls_role-datax-valid_to = abap_true.

    APPEND ls_role TO ls_data-partner-central_data-role-roles.
    ls_data-partner-central_data-role-current_state = abap_false.
  ENDIF.

  SELECT SINGLE mandt INTO lv_mandt FROM but100
    WHERE partner = lv_partner
    AND rltyp = 'FLVN00'.
  IF sy-subrc NE 0.
    CLEAR: ls_role.
    ls_role-task = 'I'.
    ls_role-data_key = 'FLVN00'.
    ls_role-data-rolecategory = 'FLVN00'.
    ls_role-data-valid_from = sy-datum.
    ls_role-data-valid_to = '99991231'.
    ls_role-currently_valid = abap_true.

    ls_role-datax-valid_from = abap_true.
    ls_role-datax-valid_to = abap_true.

    APPEND ls_role TO ls_data-partner-central_data-role-roles.
    ls_data-partner-central_data-role-current_state = abap_false.
  ENDIF.

*  IF supplier-is_head-bu_group = 'Z002'.
*    SELECT SINGLE mandt INTO lv_mandt FROM but100
*      WHERE partner = lv_partner
*      AND rltyp = 'UKM000'.
*    IF sy-subrc NE 0.
*      CLEAR: ls_role.
*      ls_role-task = 'I'.
*      ls_role-data_key = 'UKM000'.
*      ls_role-data-rolecategory = 'UKM000'.
*      ls_role-data-valid_from = sy-datum.
*      ls_role-data-valid_to = '99991231'.
*      ls_role-currently_valid = abap_true.
*
*      ls_role-datax-valid_from = abap_true.
*      ls_role-datax-valid_to = abap_true.
*
*      APPEND ls_role TO ls_data-partner-central_data-role-roles.
*      ls_data-partner-central_data-role-current_state = abap_false.
*    ENDIF.
*  ENDIF.

*******************Partner relation / header **********************
*  IF ls_ukm000-partner1 IS NOT INITIAL AND ls_ukm000-dftval IS NOT INITIAL.
*    CLEAR: ls_relation.
*    ls_relation-header-object_instance-partner1-bpartnerguid = lv_pguid.
*    ls_relation-header-object_instance-partner2-bpartner = ls_ukm000-partner1.
*    ls_relation-header-object_instance-partner2-bpartner = |{ ls_relation-header-object_instance-partner2-bpartner ALPHA = IN }|.
*    ls_relation-header-object_instance-relat_category = 'UKM001'.
*    ls_relation-header-object_instance-difftypevalue = ls_ukm000-dftval.
*    CLEAR: lv_exist.
*    SELECT SINGLE @abap_true INTO @lv_exist
*       FROM but050
*       WHERE partner1 = @lv_partner
*         AND partner2 = @ls_ukm000-partner1.
*    IF lv_exist = abap_true.
*      ls_relation-header-object_task = 'U'.
*    ELSE.
*      ls_relation-header-object_task = 'I'.
*    ENDIF.
*    APPEND ls_relation TO ls_data-partner_relation.
*  ENDIF.

************************* VENDOR / Header ***********************
  SELECT SINGLE vendor INTO @DATA(lv_lifnr)
     FROM cvi_vend_link
     WHERE partner_guid = @lv_pguid.
  IF sy-subrc = 0.
    ls_data-vendor-header-object_task = 'U'.
    ls_data-vendor-header-object_instance-lifnr = lv_lifnr.
  ELSE.
    ls_data-vendor-header-object_task = 'I'.
    ls_data-ensure_create-create_vendor = abap_true.
  ENDIF.

******************** VENDOR / Company data **********************
  LOOP AT supplier-it_company INTO DATA(ls_comp).
    IF ls_comp IS INITIAL.
      CONTINUE.
    ENDIF.
    CLEAR: ls_company.
*    SELECT SINGLE @abap_true INTO @lv_exist FROM knb1 WHERE LIFNR = @<fs_data>-LIFNR AND bukrs = @<fs_data>-bukrs.
*    IF lv_exist = abap_true.
*      ls_company-task = 'U'.
*    ELSE.
    ls_company-task = 'M'.
*    ENDIF.
    ls_company-data_key = ls_comp-bukrs.  "'6000' . " company code
    ls_company-data-akont = ls_comp-akont.  "'0000031020'.
    ls_company-data-zterm = ls_comp-zterm.  "'0001'. " terms of payment
    ls_company-data-altkn = ls_comp-altkn.
    ls_company-data-reprf = ls_comp-reprf.
    ls_company-data-sperr = ls_comp-sperr.

    ls_company-datax-akont = abap_true.
    ls_company-datax-zterm = abap_true.
    ls_company-datax-altkn = abap_true.
    ls_company-datax-reprf = abap_true.
    ls_company-datax-sperr = abap_true.
    APPEND ls_company TO ls_data-vendor-company_data-company.
  ENDLOOP.
*************PURCHASING ORG AND DIST & DIVISION MANDATORY FIELDS********
  CLEAR: ls_purchasing_data.

  LOOP AT supplier-it_purchase INTO DATA(ls_purchasing).
    IF ls_purchasing IS INITIAL.
      CONTINUE.
    ENDIF.
    CLEAR: ls_purchasing_data_st.
    ls_purchasing_data_st-task = 'M'.
    ls_purchasing_data_st-data_key-ekorg = ls_purchasing-ekorg.   "''ZTM1'.
    ls_purchasing_data_st-data-ekgrp = ls_purchasing-ekgrp.
    ls_purchasing_data_st-data-waers = ls_purchasing-waers.  "'USD'.
    ls_purchasing_data_st-data-webre = ls_purchasing-webre.
    ls_purchasing_data_st-data-lfabc = ls_purchasing-lfabc.
    ls_purchasing_data_st-data-zterm = ls_purchasing-zterm.
    ls_purchasing_data_st-data-sperm = ls_purchasing-sperm.

    ls_purchasing_data_st-datax-ekgrp = abap_true.
    ls_purchasing_data_st-datax-waers = abap_true.
    ls_purchasing_data_st-datax-webre = abap_true.
    ls_purchasing_data_st-datax-lfabc = abap_true.
    ls_purchasing_data_st-datax-zterm = abap_true.
    ls_purchasing_data_st-datax-sperm = abap_true.

***--------------------------Partner Roles----------------------------***
*    IF ls_purchasing-parvw IS NOT INITIAL AND ls_purchasing-kunn2 IS NOT INITIAL.
*      CLEAR: ls_purchasing_data_st, ls_purchasing_data.
*      ls_purchasing_data_st-task = 'M'.
*      ls_purchasing_data_st-data_key-vkorg = ls_purchasing-vkorg.   "''ZTM1'.
*      ls_purchasing_data_st-data_key-vtweg = ls_purchasing-vtweg.  "'TM'.
*      ls_purchasing_data_st-data_key-spart = ls_purchasing-spart.  "'TM'.
*
*      CLEAR: ls_functions,ls_functions_st.
*      REFRESH: ls_functions_t.
*      ls_functions_st-task = 'I'.
*      ls_functions_st-data_key-parvw = ls_purchasing-parvw.
*      ls_functions_st-data-partner = ls_purchasing-kunn2.
*      ls_functions_st-data-partner = |{ ls_functions_st-data-partner ALPHA = IN }|.
*      ls_functions_st-datax-partner = abap_true.
*      APPEND ls_functions_st TO ls_functions_t.
*
*      ls_functions-functions = ls_functions_t.
*    ENDIF.
*    ls_purchasing_data_st-functions = ls_functions.

    APPEND ls_purchasing_data_st TO ls_purchasing_data-purchasing.
  ENDLOOP.
  ls_data-vendor-purchasing_data = ls_purchasing_data.

*********************** GL Account ledger *************************
*    ls_company_code_st-task = 'I'.
*    APPEND ls_company_code_st TO ls_company_code-company.

**********************Account Group Assignemnt ******************
*  IF ls_purchasing-taxkd <> ''.
*    REFRESH: lt_tax1.
*    APPEND INITIAL LINE TO lt_tax1 ASSIGNING FIELD-SYMBOL(<fs_tax1>).
*    <fs_tax1>-task = 'M'.
*    <fs_tax1>-data_key-aland = 'CN'.
*    <fs_tax1>-data_key-tatyp = 'MWST'.
*    <fs_tax1>-data-taxkd = ls_purchasing-taxkd.  "'1'.
*    <fs_tax1>-datax-taxkd = abap_true.
*    ls_data-vendor-central_data-tax_ind-tax_ind = lt_tax1.
*    UNASSIGN <fs_tax1>.
*  ENDIF.

  CLEAR: ls_purchasing_central.
  ls_purchasing_central-data-zzcczt = supplier-is_head-zzcczt."供应商状态
  ls_purchasing_central-datax-zzcczt = abap_true.
  ls_data-vendor-central_data-central = ls_purchasing_central.

******************************



*********************** End of PURCHASING data *************************

*****************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
*     iv_suppress_taxjur_check = 'X'
    IMPORTING
      et_return_map = ls_return_map. "lt_return.

*****************************Creating BP **************************
  IF ls_return_map IS  INITIAL.

    CALL METHOD cl_md_bp_maintain=>maintain
      EXPORTING
        i_data   = lt_data
      IMPORTING
        e_return = lt_return.

    READ TABLE lt_return INTO ls_return INDEX 1.
    IF sy-subrc = 0.
      DATA(lt_mess) = ls_return-object_msg.
    ENDIF.
    CLEAR lv_flag.
    LOOP AT lt_mess INTO DATA(lw_mess) WHERE type CA 'EA'.
      lv_flag = 'X'.
      CLEAR: lv_msg.
      MESSAGE ID lw_mess-id TYPE lw_mess-type NUMBER lw_mess-number
                WITH lw_mess-message_v1 lw_mess-message_v2 lw_mess-message_v3 lw_mess-message_v4 INTO lv_msg.
      CONCATENATE lv_mess lv_msg INTO lv_mess.
    ENDLOOP.

    IF lv_flag = 'X'.
      es_return-type = 'E'.
      es_return-mess = 'Error:' && lv_mess.
      es_return-partner = lv_partner.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    ELSE.

***************************** Commit BAPI *************************
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.                " Use of Command `COMMIT AND WAIT`

      "ADD  BY    ZY  由于银行的问题添加代码
      IF lv_partner IS NOT INITIAL AND lv_task EQ 'U'.
        WAIT UP TO 1 SECONDS.
        PERFORM craet_bank      TABLES supplier-it_bank USING  lv_partner.
      ENDIF.
      "AD   BY   ZY
      es_return-type = 'S'.
      es_return-mess = 'OK'.
      es_return-partner = lv_partner.
      IF lv_partner IS INITIAL.
        DO 200000 TIMES.
          SELECT SINGLE b~lifnr
            FROM but000 AS a
            JOIN lfa1 AS b ON a~partner = b~lifnr
            INTO es_return-partner
            WHERE a~partner_guid = lv_pguid.
          IF sy-subrc = 0.
            EXIT.
          ENDIF.
          WAIT UP TO 1 SECONDS.
        ENDDO.
      ENDIF.
*      IF supplier-is_head-zzcczt is not INITIAL."供应商状态
*        UPDATE lfa1 set zzcczt = supplier-is_head-zzcczt
*          WHERE lifnr = es_return-partner.
*        COMMIT WORK.
*      ENDIF.

      REFRESH: lt_zmmt001.
      LOOP AT supplier-it_001 INTO DATA(ls_001).
        CLEAR: ls_zmmt001.
        MOVE-CORRESPONDING ls_001 TO ls_zmmt001.

        SELECT SINGLE zce_name
          FROM zmmt004
          INTO ls_zmmt001-zce_name
         WHERE zce_num = ls_zmmt001-zce_name.

        ls_zmmt001-lifnr = es_return-partner.
        APPEND ls_zmmt001 TO lt_zmmt001.
      ENDLOOP.
      IF lt_zmmt001[] IS NOT INITIAL.
        MODIFY zmmt001 FROM TABLE lt_zmmt001.
        COMMIT WORK.
      ENDIF.
    ENDIF.

  ELSE.

    CLEAR: lv_mess.
    LOOP AT ls_return_map INTO DATA(ls_check_return).
      lv_flag = 'X'.
      CONCATENATE lv_mess ls_check_return-message INTO lv_mess.
    ENDLOOP.
    IF lv_flag = 'X'.
      es_return-type = 'E'.
      es_return-mess = 'Error:' && lv_mess.
      es_return-partner = lv_partner.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    ENDIF.

  ENDIF.

  es_return-partner = |{ es_return-partner ALPHA = OUT }|.
  CONDENSE es_return-partner NO-GAPS.

**optional, you can save a status code and message text for search.
  /afl/set_status es_return-type es_return-mess.

**save logs. It should be always on the bottom of the FUNCTION.
  /afl/save.

ENDFUNCTION.

 

 

客户:

FUNCTION z_rfc_sd_customer_maintain.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(CUSTOMER) TYPE  ZZDT_OA_ERP_CUSTOMER_ADD_MOD_6
*"  EXPORTING
*"     VALUE(ES_RETURN) TYPE  ZZDT_OA_ERP_CUSTOMER_ADD_MOD_4
*"----------------------------------------------------------------------
**initialize logger. It should be always on the top of the FUNCTION.
  /afl/log_init.

**optional, you can specify at most 3 fields for search.
  /afl/set_custom_fields customer-is_head-kunnr customer-is_head-name1  customer-is_head-sortl.

  DATA: l_datum TYPE sy-datum,
        l_uzeit TYPE sy-uzeit.
  l_datum = sy-datum.
  l_uzeit = sy-uzeit.
************************Data Declarations**************************
  DATA: ls_return_map TYPE mdg_bs_bp_msgmap_t,
        lt_data       TYPE cvis_ei_extern_t,
        lt_return     TYPE bapiretm,
        ls_return     TYPE bapireti,
        ls_retmsg     TYPE LINE OF bapiretct,
        lv_text       TYPE string,
        lt_errors     TYPE STANDARD TABLE OF bapiret2,
        ls_errors     TYPE bapiret2,
        ls_data_new   TYPE REF TO data,
        lv_flag       TYPE char1,
        lv_mess       TYPE string,
        lv_msg        TYPE string.

  DATA: ls_data          LIKE LINE OF lt_data,
        ls_role          TYPE bus_ei_bupa_roles,
        ls_relation      TYPE burs_ei_extern,
        ls_company       TYPE cmds_ei_company,
        ls_addr          TYPE bus_ei_bupa_address,
        lt_phone         TYPE bus_ei_bupa_telephone_t,
        lt_fax           TYPE bus_ei_bupa_fax_t,
        lt_email         TYPE bus_ei_bupa_smtp_t,
        lt_tax           TYPE bus_ei_bupa_taxnumber_t,
        lt_ident         TYPE  bus_ei_bupa_identification_t,
        lt_tax1          TYPE cmds_ei_tax_ind_t,
        ls_sales_central TYPE cmds_ei_cmd_central,
        ls_segment       TYPE ukm_ei_bp_cms_sgm.

  DATA: lv_guid        TYPE guid_32,
        lv_pguid       TYPE but000-partner_guid,
        lv_adguid      TYPE but020-address_guid,
        lv_adrnr       TYPE but020-addrnumber,
        lv_partner     LIKE ls_data-partner-header-object_instance-bpartner,
        lv_task        TYPE char1,
        lv_tel_number1 TYPE adr2-tel_number,
        lv_tel_number3 TYPE adr2-tel_number,
        lv_consnumber1 TYPE adr2-consnumber,
        lv_consnumber3 TYPE adr2-consnumber,
        lv_exist       TYPE char1.

  DATA: lt_role_cat     TYPE fsbp_tb003a_tty,
        lt_cvi_role_cat TYPE cvis_role_category_t,
        ls_cvi_role_cat TYPE cvis_role_category.

  DATA: ls_functions_st    TYPE cmds_ei_functions,
        ls_functions_t     TYPE cmds_ei_functions_t,
        ls_functions       TYPE cmds_ei_cmd_functions,
        ls_sales_data_st   TYPE cmds_ei_sales,
        ls_sales_data      TYPE cmds_ei_cmd_sales,
        ls_company_code_st TYPE cmds_ei_company,
        ls_company_code    TYPE cmds_ei_cmd_company.

  CLEAR: lv_pguid, lv_guid, lv_task, lv_partner.
  CLEAR: ls_data.
  REFRESH: lt_data.

  IF customer-is_head-kunnr IS NOT INITIAL.
    lv_partner = customer-is_head-kunnr.
    lv_partner = |{ lv_partner ALPHA = IN }|.
    SELECT SINGLE partner_guid INTO lv_pguid FROM but000
      WHERE partner  = lv_partner.
    IF sy-subrc = 0.
      lv_task =  'U'.
    ENDIF.
  ENDIF.

  IF customer-is_head-sortl = ''.
    es_return-type = 'E'.
    es_return-mess = 'Error: 搜索项 1/2 必填'.
    es_return-partner = customer-is_head-kunnr.
    lv_flag = 'X'.
  ENDIF.

  IF lv_flag = ''.
    IF lv_task =  'U'.
      ls_data-partner-header-object_task = 'U'.
      ls_data-partner-header-object_instance-bpartner = lv_partner.
      ls_data-partner-header-object_instance-bpartnerguid = lv_pguid.
    ELSE.
******************************Guid*********************************
      CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
        RECEIVING
          uuid = lv_guid.

******************************Create customer**********************
      ls_data-partner-header-object_task = 'I'.
      ls_data-partner-header-object_instance-bpartnerguid = lv_guid.
      lv_pguid = lv_guid.
    ENDIF.

***************** Partner / Central data / common *****************
    ls_data-partner-central_data-common-data-bp_control-category = '2'. "3group "2 Organization
    ls_data-partner-central_data-common-data-bp_control-grouping = customer-is_head-kukla. "Grouping

    ls_data-partner-central_data-common-data-bp_centraldata-searchterm1 = customer-is_head-sortl.
*  ls_data-partner-central_data-common-data-bp_centraldata-title_key = customer-is_head-anred.
    ls_data-partner-central_data-common-data-bp_centraldata-authorizationgroup = customer-is_head-augrp.
    ls_data-partner-central_data-common-datax-bp_centraldata-searchterm1 = abap_true.
*  ls_data-partner-central_data-common-datax-bp_centraldata-title_key = abap_true.
    ls_data-partner-central_data-common-datax-bp_centraldata-authorizationgroup = abap_true.

    ls_data-partner-central_data-common-data-bp_organization-name1 = customer-is_head-name1.
    ls_data-partner-central_data-common-data-bp_organization-name2 = customer-is_head-name2.
    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 *****************
    CLEAR: ls_addr.
    CLEAR: lv_adguid, lv_adrnr.
    SELECT SINGLE address_guid addrnumber INTO ( lv_adguid, lv_adrnr ) FROM but020
      WHERE partner  = lv_partner.
    IF sy-subrc = 0.
      ls_addr-task = 'U'.
      ls_addr-data_key-guid = lv_adguid.
    ELSE.
      ls_addr-task = lv_task."'I'.
    ENDIF.
    ls_addr-data_key-operation = 'XXDFLT'.
    ls_addr-data-postal-data-city = customer-is_head-ort01.
    ls_addr-data-postal-data-postl_cod1 = customer-is_head-pstlz.
    ls_addr-data-postal-data-street = customer-is_head-stras.
    ls_addr-data-postal-data-country = customer-is_head-land1.
    ls_addr-data-postal-data-region = customer-is_head-regio.
    ls_addr-data-postal-data-languiso = customer-is_head-spras.

    ls_addr-data-postal-datax-city = abap_true.
    ls_addr-data-postal-datax-postl_cod1 = abap_true.
    ls_addr-data-postal-datax-street = abap_true.
    ls_addr-data-postal-datax-country = abap_true.
    ls_addr-data-postal-datax-region = abap_true.
    ls_addr-data-postal-datax-langu_iso = abap_true.

***-------------------Telephone number--------------------------***
*    REFRESH: lt_phone.
*    IF customer-is_head-telf1 <> ''.
*      APPEND INITIAL LINE TO  lt_phone ASSIGNING FIELD-SYMBOL(<ls_phone>).
*      CLEAR: lv_exist.
*      SELECT SINGLE @abap_true INTO @lv_exist FROM adr2 WHERE addrnumber = @lv_adrnr AND consnumber = '001'.
*      IF lv_exist = abap_true.
*        <ls_phone>-contact-task = 'D'."先删除再重新写入,否则第二个电话 002 写不进去
*        <ls_phone>-contact-data-consnumber = '001'.
*
*        <ls_phone>-contact-datax-consnumber = abap_true.
*        <ls_phone>-currently_valid = abap_false.
*        UNASSIGN <ls_phone>.
*        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      ENDIF.
*      <ls_phone>-contact-task = 'I'.
*      <ls_phone>-contact-data-telephone = customer-is_head-telf1.
*      <ls_phone>-contact-data-r_3_user = '1'.
*      <ls_phone>-contact-data-home_flag = 'X'.
*      <ls_phone>-contact-data-consnumber = '001'.
*
*      <ls_phone>-contact-datax-telephone = abap_true.
*      <ls_phone>-contact-datax-r_3_user = abap_true.
*      <ls_phone>-contact-datax-home_flag = abap_true.
*      <ls_phone>-contact-datax-consnumber = abap_true.
*      <ls_phone>-currently_valid = abap_false.
*      UNASSIGN <ls_phone>.
*    ENDIF.
*    IF customer-is_head-telf2 <> ''.
*      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      CLEAR: lv_exist.
*      SELECT SINGLE @abap_true INTO @lv_exist FROM adr2 WHERE addrnumber = @lv_adrnr AND consnumber = '002'.
*      IF lv_exist = abap_true.
*        <ls_phone>-contact-task = 'D'."先删除再重新写入,否则第二个电话 002 写不进去
*        <ls_phone>-contact-data-consnumber = '002'.
*
*        <ls_phone>-contact-datax-consnumber = abap_true.
*        <ls_phone>-currently_valid = abap_false.
*        UNASSIGN <ls_phone>.
*        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      ENDIF.
*      <ls_phone>-contact-task = 'I'.
*      <ls_phone>-contact-data-telephone = customer-is_head-telf2.
*      <ls_phone>-contact-data-r_3_user = '3'.
*      <ls_phone>-contact-data-consnumber = '002'.
*
*      <ls_phone>-contact-datax-telephone = abap_true.
*      <ls_phone>-contact-datax-r_3_user = abap_true.
*      <ls_phone>-contact-datax-consnumber = abap_true.
*      <ls_phone>-currently_valid = abap_false.
*      UNASSIGN <ls_phone>.
*    ENDIF.
    REFRESH: lt_phone.
    CLEAR: lv_tel_number1, lv_tel_number3, lv_consnumber1, lv_consnumber3.
    SELECT SINGLE tel_number consnumber INTO ( lv_tel_number1, lv_consnumber1 ) FROM adr2
      WHERE addrnumber = lv_adrnr AND r3_user = '1'.
    SELECT SINGLE tel_number consnumber INTO ( lv_tel_number3, lv_consnumber3 ) FROM adr2
      WHERE addrnumber = lv_adrnr AND r3_user = '3'.
    IF lv_tel_number1 IS INITIAL AND lv_tel_number3 IS INITIAL.
      IF customer-is_head-telf1 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING FIELD-SYMBOL(<ls_phone>).
        <ls_phone>-contact-task = 'I'.

        <ls_phone>-contact-data-telephone = customer-is_head-telf1.
        <ls_phone>-contact-data-consnumber = '001'.
        <ls_phone>-contact-data-r_3_user = '1'.

        <ls_phone>-contact-datax-telephone = abap_true.
        <ls_phone>-contact-datax-r_3_user = abap_true.
        <ls_phone>-contact-datax-consnumber = abap_true.
        UNASSIGN <ls_phone>.
      ENDIF.
      IF customer-is_head-telf2 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'I'.

        <ls_phone>-contact-data-telephone = customer-is_head-telf2.
        <ls_phone>-contact-data-consnumber = '002'.
        <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-consnumber = abap_true.
        UNASSIGN <ls_phone>.
      ENDIF.
    ELSEIF lv_tel_number1 IS NOT INITIAL AND lv_tel_number3 IS NOT INITIAL.
      IF customer-is_head-telf1 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'U'.

        <ls_phone>-contact-data-telephone = customer-is_head-telf1.
        <ls_phone>-contact-data-consnumber = lv_consnumber1.
        <ls_phone>-contact-data-r_3_user = '1'.

        <ls_phone>-contact-datax-telephone = abap_true.
        <ls_phone>-contact-datax-r_3_user = abap_true.
        <ls_phone>-contact-datax-consnumber = abap_true.
        UNASSIGN <ls_phone>.
*    ELSE.
*      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      <ls_phone>-contact-task = 'D'.
*      <ls_phone>-contact-data-consnumber = lv_consnumber1.
*      <ls_phone>-contact-data-r_3_user = '1'.
*
*      <ls_phone>-contact-datax-r_3_user = abap_true.
*      <ls_phone>-contact-datax-consnumber = abap_true.
*      UNASSIGN <ls_phone>.
      ENDIF.
      IF customer-is_head-telf2 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'U'.

        <ls_phone>-contact-data-telephone = customer-is_head-telf2.
        <ls_phone>-contact-data-consnumber = lv_consnumber3.
        <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-consnumber = abap_true.
        UNASSIGN <ls_phone>.
*    ELSE.
*      APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
*      <ls_phone>-contact-task = 'D'.
*      <ls_phone>-contact-data-consnumber = lv_consnumber3.
*      <ls_phone>-contact-data-r_3_user = '3'.
*
*      <ls_phone>-contact-datax-r_3_user = abap_true.
*      <ls_phone>-contact-datax-consnumber = abap_true.
*      UNASSIGN <ls_phone>.
      ENDIF.
    ELSE.
      ""先删除再重新写入,否则第二个电话 002 写不进去
      IF lv_tel_number1 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'D'.
        <ls_phone>-contact-data-consnumber = lv_consnumber1.
        <ls_phone>-contact-data-r_3_user = '1'.

        <ls_phone>-contact-datax-r_3_user = abap_true.
        <ls_phone>-contact-datax-consnumber = abap_true.
        UNASSIGN <ls_phone>.
      ENDIF.
      IF lv_tel_number3 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'D'.
        <ls_phone>-contact-data-consnumber = lv_consnumber3.
        <ls_phone>-contact-data-r_3_user = '3'.

        <ls_phone>-contact-datax-r_3_user = abap_true.
        <ls_phone>-contact-datax-consnumber = abap_true.
        UNASSIGN <ls_phone>.

      ENDIF.

      IF customer-is_head-telf1 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'I'.

        <ls_phone>-contact-data-telephone = customer-is_head-telf1.
        <ls_phone>-contact-data-consnumber = '001'.
        <ls_phone>-contact-data-r_3_user = '1'.

        <ls_phone>-contact-datax-telephone = abap_true.
        <ls_phone>-contact-datax-r_3_user = abap_true.
        <ls_phone>-contact-datax-consnumber = abap_true.
        UNASSIGN <ls_phone>.
      ENDIF.
      IF customer-is_head-telf2 <> ''.
        APPEND INITIAL LINE TO  lt_phone ASSIGNING <ls_phone>.
        <ls_phone>-contact-task = 'I'.

        <ls_phone>-contact-data-telephone = customer-is_head-telf2.
        <ls_phone>-contact-data-consnumber = '002'.
        <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-consnumber = abap_true.
        UNASSIGN <ls_phone>.
      ENDIF.

    ENDIF.
****---------------------- fax number------------------------***
*    APPEND INITIAL LINE TO lt_fax ASSIGNING FIELD-SYMBOL(<ls_fax>).
*    <ls_fax>-contact-task = 'I'.
*    <ls_fax>-contact-data-fax  = <fs_data>-fax.
*    <ls_fax>-contact-data-country  = 'IN'.
*    <ls_fax>-contact-data-countryiso = '40'.
*    <ls_fax>-contact-data-r_3_user = 'X'.
*    <ls_fax>-contact-data-consnumber = '001'.
*
*    <ls_fax>-contact-datax-country = abap_true.
*    <ls_fax>-contact-datax-fax = abap_true.
*    <ls_fax>-contact-datax-countryiso = abap_true.
*    <ls_fax>-contact-datax-r_3_user = abap_true.
*    <ls_fax>-contact-datax-consnumber = abap_true.
*    <ls_fax>-currently_valid = abap_true.
*
****--------------------------Email------------------------***
*    APPEND INITIAL LINE TO lt_email ASSIGNING FIELD-SYMBOL(<ls_email>).
*    <ls_email>-contact-task = 'I'.
*    <ls_email>-contact-data-e_mail = <fs_data>-email.
*    <ls_email>-contact-data-consnumber = '001'.
*
*    <ls_email>-contact-datax-e_mail = abap_true.
*    <ls_email>-contact-datax-consnumber = abap_true.
*    <ls_email>-currently_valid = abap_true.

    ls_addr-data-communication-phone-phone = lt_phone.
*    ls_addr-data-communication-fax-fax = lt_fax.
*    ls_addr-data-communication-smtp-smtp = lt_email.

    ls_addr-currently_valid = abap_false.

    APPEND ls_addr TO ls_data-partner-central_data-address-addresses.

**--------------------------Tax----------------------------***
    REFRESH: lt_tax.
    IF customer-is_head-taxnum <> ''.
      APPEND INITIAL LINE TO lt_tax ASSIGNING FIELD-SYMBOL(<ls_tax>).
      SELECT SINGLE @abap_true INTO @lv_exist FROM dfkkbptaxnum WHERE partner = @lv_partner AND taxtype = @customer-is_head-taxtype.
      IF lv_exist = abap_true.
        <ls_tax>-task = 'U'.
      ELSE.
        <ls_tax>-task = 'I'.
      ENDIF.
      <ls_tax>-data_key-taxtype = customer-is_head-taxtype. "'IN2'.
      <ls_tax>-data_key-taxnumber = customer-is_head-taxnum.  "'12345678956'.
      <ls_tax>-data_key-taxnumxl = customer-is_head-taxnum.  "'12345678956'.

      ls_data-partner-central_data-taxnumber-taxnumbers = lt_tax.

      UNASSIGN <ls_tax>.
    ENDIF.
***--------------------------Ident Number----------------------------***
    REFRESH: lt_ident.
    IF customer-is_head-type <> '' AND customer-is_head-idnumber <> ''.
      APPEND INITIAL LINE TO lt_ident ASSIGNING FIELD-SYMBOL(<ls_ident>).
      SELECT SINGLE @abap_true INTO @lv_exist FROM but0id WHERE partner = @lv_partner AND type = @customer-is_head-type AND idnumber = @customer-is_head-idnumber.
      IF lv_exist = abap_true.
        <ls_ident>-task = 'U'.
      ELSE.
        <ls_ident>-task = 'I'.
      ENDIF.
      <ls_ident>-data_key-identificationcategory = customer-is_head-type. "ZBUP01
      <ls_ident>-data_key-identificationnumber = customer-is_head-idnumber.  "'12345678956'.

      ls_data-partner-central_data-ident_number-ident_numbers = lt_ident.

      UNASSIGN <ls_ident>.
    ENDIF.
********************* Partner / Central data / role****************
    CLEAR: ls_role.
    SELECT SINGLE mandt INTO @DATA(lv_mandt) FROM but100
      WHERE partner = @lv_partner
      AND rltyp = 'FLCU01'.
    IF sy-subrc NE 0.
      ls_role-task = 'I'.
      ls_role-data_key = 'FLCU01'.
      ls_role-data-rolecategory = 'FLCU01'.
      ls_role-data-valid_from = sy-datum.
      ls_role-data-valid_to = '99991231'.
      ls_role-currently_valid = abap_true.

      ls_role-datax-valid_from = abap_true.
      ls_role-datax-valid_to = abap_true.

      APPEND ls_role TO ls_data-partner-central_data-role-roles.
      ls_data-partner-central_data-role-current_state = abap_false.
    ENDIF.

    SELECT SINGLE mandt INTO lv_mandt FROM but100
      WHERE partner = lv_partner
      AND rltyp = 'FLCU00'.
    IF sy-subrc NE 0.
      CLEAR: ls_role.
      ls_role-task = 'I'.
      ls_role-data_key = 'FLCU00'.
      ls_role-data-rolecategory = 'FLCU00'.
      ls_role-data-valid_from = sy-datum.
      ls_role-data-valid_to = '99991231'.
      ls_role-currently_valid = abap_true.

      ls_role-datax-valid_from = abap_true.
      ls_role-datax-valid_to = abap_true.

      APPEND ls_role TO ls_data-partner-central_data-role-roles.
      ls_data-partner-central_data-role-current_state = abap_false.
    ENDIF.

    IF customer-is_head-kukla = 'Z002'.
      SELECT SINGLE mandt INTO lv_mandt FROM but100
        WHERE partner = lv_partner
        AND rltyp = 'UKM000'.
      IF sy-subrc NE 0.
        CLEAR: ls_role.
        ls_role-task = 'I'.
        ls_role-data_key = 'UKM000'.
        ls_role-data-rolecategory = 'UKM000'.
        ls_role-data-valid_from = sy-datum.
        ls_role-data-valid_to = '99991231'.
        ls_role-currently_valid = abap_true.

        ls_role-datax-valid_from = abap_true.
        ls_role-datax-valid_to = abap_true.

        APPEND ls_role TO ls_data-partner-central_data-role-roles.
        ls_data-partner-central_data-role-current_state = abap_false.
      ENDIF.
    ENDIF.
*******************Partner / UKMBP_DATA **********************
    LOOP AT customer-it_ukm000 INTO DATA(ls_ukm000).
      IF ls_ukm000-limit_rule IS NOT INITIAL.
        IF sy-tabix = 1.
          ls_data-partner-ukmbp_data-profile-data-limit_rule = ls_ukm000-limit_rule.
          ls_data-partner-ukmbp_data-profile-data-check_rule = ls_ukm000-check_rule.
          ls_data-partner-ukmbp_data-profile-data-risk_class = ls_ukm000-risk_class.
          ls_data-partner-ukmbp_data-profile-data-credit_group = '1'.

          ls_data-partner-ukmbp_data-profile-datax-limit_rule = abap_true.
          ls_data-partner-ukmbp_data-profile-datax-check_rule = abap_true.
          ls_data-partner-ukmbp_data-profile-datax-risk_class = abap_true.
          ls_data-partner-ukmbp_data-profile-datax-credit_group = abap_true.
        ENDIF.

        CLEAR: ls_segment.
        CLEAR: lv_exist.
        SELECT SINGLE @abap_true
          FROM ukmbp_cms_sgm
          INTO @lv_exist
          WHERE partner = @lv_partner
            AND credit_sgmnt = @ls_ukm000-credit_sgmnt.
        IF lv_exist = abap_true.
          ls_segment-task = 'U'.
        ELSE.
          ls_segment-task = 'I'.
        ENDIF.
        ls_segment-data_key-partner = lv_partner.
        ls_segment-data_key-credit_sgmnt = ls_ukm000-credit_sgmnt.
        ls_segment-data-credit_limit = ls_ukm000-credit_limit.
        ls_segment-datax-credit_limit = abap_true.
        APPEND ls_segment TO ls_data-partner-ukmbp_data-segments-segments.
      ENDIF.
*******************Partner relation / header **********************
      IF ls_ukm000-partner1 IS NOT INITIAL AND ls_ukm000-dftval IS NOT INITIAL.
        CLEAR: ls_relation.
        ls_relation-header-object_instance-partner1-bpartnerguid = lv_pguid.
        ls_relation-header-object_instance-partner2-bpartner = ls_ukm000-partner1.
        ls_relation-header-object_instance-partner2-bpartner = |{ ls_relation-header-object_instance-partner2-bpartner ALPHA = IN }|.
        ls_relation-header-object_instance-relat_category = 'UKM001'.
        ls_relation-header-object_instance-difftypevalue = ls_ukm000-dftval.
        CLEAR: lv_exist.
        SELECT SINGLE @abap_true INTO @lv_exist
           FROM but050
           WHERE partner1 = @lv_partner
             AND partner2 = @ls_ukm000-partner1.
        IF lv_exist = abap_true.
          ls_relation-header-object_task = 'U'.
        ELSE.
          ls_relation-header-object_task = 'I'.
        ENDIF.
        APPEND ls_relation TO ls_data-partner_relation.
      ENDIF.
    ENDLOOP.

************************* Customer / Header ***********************
    SELECT SINGLE customer INTO @DATA(lv_kunnr)
       FROM cvi_cust_link
       WHERE partner_guid = @lv_pguid.
    IF sy-subrc = 0.
      ls_data-customer-header-object_task = 'U'.
      ls_data-customer-header-object_instance-kunnr = lv_kunnr.
    ELSE.
      ls_data-customer-header-object_task = 'I'.
      ls_data-ensure_create-create_customer = abap_true.
    ENDIF.

******************** Customer / Company data **********************
    LOOP AT customer-it_company INTO DATA(ls_comp).
      CLEAR: ls_company.
*    SELECT SINGLE @abap_true INTO @lv_exist FROM knb1 WHERE kunnr = @<fs_data>-kunnr AND bukrs = @<fs_data>-bukrs.
*    IF lv_exist = abap_true.
*      ls_company-task = 'U'.
*    ELSE.
      ls_company-task = 'M'.
*    ENDIF.
      ls_company-data_key = ls_comp-bukrs.  "'6000' . " company code
      ls_company-data-akont = ls_comp-akont.  "'0000031020'.
      ls_company-data-zterm = ls_comp-zterm.  "'0001'. " terms of payment
      ls_company-data-altkn = ls_comp-altkn.

      ls_company-datax-akont = abap_true.
      ls_company-datax-zterm = abap_true.
      ls_company-datax-altkn = abap_true.
      APPEND ls_company TO ls_data-customer-company_data-company.
    ENDLOOP.
*************SALES ORG AND DIST & DIVISION MANDATORY FIELDS********
    LOOP AT customer-it_sales INTO DATA(ls_sales).
      CLEAR: ls_sales_data_st, ls_sales_data.
      ls_sales_data_st-task = 'M'.
      ls_sales_data_st-data_key-vkorg = ls_sales-vkorg.   "''ZTM1'.
      ls_sales_data_st-data_key-vtweg = ls_sales-vtweg.  "'TM'.
      ls_sales_data_st-data_key-spart = ls_sales-spart.  "'TM'.
      ls_sales_data_st-data-bzirk = ls_sales-bzirk.
      ls_sales_data_st-data-vkbur = ls_sales-vkbur.
      ls_sales_data_st-data-vkgrp = ls_sales-vkgrp.
      ls_sales_data_st-data-inco1 = ls_sales-inco1.  "'CIF'.
      ls_sales_data_st-data-inco2_l = ls_sales-inco2_l.  "'Costs,Insurance&Freight'.
      ls_sales_data_st-data-waers = ls_sales-waers.  "'USD'.
      ls_sales_data_st-data-kalks = ls_sales-kalks.
      ls_sales_data_st-data-vwerk = ls_sales-vwerk.
      ls_sales_data_st-data-vsbed = ls_sales-vsbed.
      ls_sales_data_st-data-zterm = ls_sales-zterm.
      ls_sales_data_st-data-ktgrd = ls_sales-ktgrd.

      ls_sales_data_st-datax-bzirk = abap_true.
      ls_sales_data_st-datax-vkbur = abap_true.
      ls_sales_data_st-datax-vkgrp = abap_true.
      ls_sales_data_st-datax-inco1 = abap_true.
      ls_sales_data_st-datax-inco2_l = abap_true.
      ls_sales_data_st-datax-waers = abap_true.
      ls_sales_data_st-datax-kalks = abap_true.
      ls_sales_data_st-datax-vwerk = abap_true.
      ls_sales_data_st-datax-vsbed = abap_true.
      ls_sales_data_st-datax-zterm = abap_true.
      ls_sales_data_st-datax-ktgrd = abap_true.

**--------------------------Partner Roles----------------------------***
      REFRESH: ls_functions_t.
      LOOP AT ls_sales-knvp INTO DATA(ls_knvp).
        CLEAR: ls_functions,ls_functions_st.
        ls_functions_st-task = 'M'.
        ls_functions_st-data_key-parvw = ls_knvp-parvw.
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = ls_knvp-parvw
          IMPORTING
            output = ls_functions_st-data_key-parvw.

        ls_functions_st-data-partner = ls_knvp-kunn2.
        ls_functions_st-data-partner = |{ ls_functions_st-data-partner ALPHA = IN }|.
        ls_functions_st-datax-partner = abap_true.
        APPEND ls_functions_st TO ls_functions_t.

      ENDLOOP.

      ls_functions-functions = ls_functions_t.

      ls_sales_data_st-functions = ls_functions.

      APPEND ls_sales_data_st TO ls_sales_data-sales.
    ENDLOOP.
    ls_data-customer-sales_data = ls_sales_data.

*********************** GL Account ledger *************************
*    ls_company_code_st-task = 'I'.
*    APPEND ls_company_code_st TO ls_company_code-company.

**********************Account Group Assignemnt ******************
    IF ls_sales-taxkd <> ''.
      REFRESH: lt_tax1.
      APPEND INITIAL LINE TO lt_tax1 ASSIGNING FIELD-SYMBOL(<fs_tax1>).
      <fs_tax1>-task = 'M'.
      <fs_tax1>-data_key-aland = 'CN'.
      <fs_tax1>-data_key-tatyp = 'MWST'.
      <fs_tax1>-data-taxkd = ls_sales-taxkd.  "'1'.
      <fs_tax1>-datax-taxkd = abap_true.
      ls_data-customer-central_data-tax_ind-tax_ind = lt_tax1.
      UNASSIGN <fs_tax1>.
    ENDIF.

    CLEAR: ls_sales_central.
*  ls_sales_central-data-zzu8bm = customer-is_head-zzu8bm.
    ls_sales_central-data-zzjkhbm = customer-is_head-zzjkhbm.
    ls_sales_central-data-zzbasj = customer-is_head-zzbasj.
    ls_sales_central-data-zzkhlx = customer-is_head-zzkhlx.
    ls_sales_central-data-zzkhdj = customer-is_head-zzkhdj.
    ls_sales_central-data-zzzyss = customer-is_head-zzzyss.
    ls_sales_central-data-zzgszt = customer-is_head-zzgszt.
    ls_sales_central-data-zzkplx = customer-is_head-zzkplx.
    ls_sales_central-data-zzkpmc = customer-is_head-zzkpmc.
    ls_sales_central-data-zzkpsh = customer-is_head-zzkpsh.
    ls_sales_central-data-zzkpdz = customer-is_head-zzkpdz.
    ls_sales_central-data-zzkpdh = customer-is_head-zzkpdh.
    ls_sales_central-data-zzkpkhh = customer-is_head-zzkpkhh.
    ls_sales_central-data-zzkpzh = customer-is_head-zzkpzh.

*  ls_sales_central-datax-zzu8bm = abap_true.
    ls_sales_central-datax-zzjkhbm = abap_true.
    ls_sales_central-datax-zzbasj = abap_true.
    ls_sales_central-datax-zzkhlx = abap_true.
    ls_sales_central-datax-zzkhdj = abap_true.
    ls_sales_central-datax-zzzyss = abap_true.
    ls_sales_central-datax-zzgszt = abap_true.
    ls_sales_central-datax-zzkplx = abap_true.
    ls_sales_central-datax-zzkpmc = abap_true.
    ls_sales_central-datax-zzkpsh = abap_true.
    ls_sales_central-datax-zzkpdz = abap_true.
    ls_sales_central-datax-zzkpdh = abap_true.
    ls_sales_central-datax-zzkpkhh = abap_true.
    ls_sales_central-datax-zzkpzh = abap_true.
    ls_data-customer-central_data-central = ls_sales_central.
*********************** End of sales data *************************

*****************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
*       iv_suppress_taxjur_check = 'X'
      IMPORTING
        et_return_map = ls_return_map. "lt_return.

*****************************Creating BP **************************
    IF ls_return_map IS  INITIAL.

      CALL METHOD cl_md_bp_maintain=>maintain
        EXPORTING
          i_data   = lt_data
        IMPORTING
          e_return = lt_return.

      READ TABLE lt_return INTO ls_return INDEX 1.
      IF sy-subrc = 0.
        DATA(lt_mess) = ls_return-object_msg.
      ENDIF.
      CLEAR lv_flag.
      LOOP AT lt_mess INTO DATA(lw_mess) WHERE type CA 'EA'.
        lv_flag = 'X'.
        CLEAR: lv_msg.
        MESSAGE ID lw_mess-id TYPE lw_mess-type NUMBER lw_mess-number
                  WITH lw_mess-message_v1 lw_mess-message_v2 lw_mess-message_v3 lw_mess-message_v4 INTO lv_msg.
        CONCATENATE lv_mess lv_msg INTO lv_mess.
      ENDLOOP.

      IF lv_flag = 'X'.
        es_return-type = 'E'.
        es_return-mess = 'Error:' && lv_mess.
        es_return-partner = lv_partner.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      ELSE.
***************************** Commit BAPI *************************
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.                " Use of Command `COMMIT AND WAIT`

        es_return-type = 'S'.
        es_return-mess = 'OK'.
        es_return-partner = lv_partner.
        IF lv_partner IS INITIAL.
          DO 200000 TIMES.
            SELECT SINGLE b~kunnr
              FROM but000 AS a
              JOIN kna1 AS b ON a~partner = b~kunnr
              INTO es_return-partner
              WHERE a~partner_guid = lv_pguid.
            IF sy-subrc = 0.
              EXIT.
            ENDIF.
            WAIT UP TO 1 SECONDS.
          ENDDO.
        ENDIF.

      ENDIF.

    ELSE.

      CLEAR: lv_mess.
      LOOP AT ls_return_map INTO DATA(ls_check_return).
        lv_flag = 'X'.
        CONCATENATE lv_mess ls_check_return-message INTO lv_mess.
      ENDLOOP.
      IF lv_flag = 'X'.
        es_return-type = 'E'.
        es_return-mess = 'Error:' && lv_mess.
        es_return-partner = lv_partner.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      ENDIF.

    ENDIF.

  ENDIF.
  es_return-partner = |{ es_return-partner ALPHA = OUT }|.
  CONDENSE es_return-partner NO-GAPS.


**optional, you can save a status code and message text for search.
  /afl/set_status es_return-type es_return-mess.

**save logs. It should be always on the bottom of the FUNCTION.
  /afl/save.

ENDFUNCTION.