SAP BP主数据维护BAPI CVI_EI_INBOUND_MAIN

近期有创建BP供应商主数据的需求,想起上次写这个批导还是2018年,当时的我面对这个BAPI还是抗拒的,因为算是相对来说比较复杂的一类BAPI了,当时网上各种搜索,缝缝补补,勉强实现了当时的功能,后来再也没碰到过这个批导的需求,直到最近,于是想偷懒找一些参考代码拿过来改一改,不过发现找到的代码都不太能满足我的需求,要么或多或少都有一些问题,要么写法不规范,要么调用了一些额外的不需要的函数,于是自己从头开始写了一次调用函数。

在此之前,先分享一下目前可以创建供应商客户的一些方式:

  • RFC_CVI_EI_INBOUND_MAIN
    SAP已不推荐使用,已经成为过时函数,虽然还可以使用,但是风险需要自行承担。

  • BAPI_BUPA_CREATE_FROM_DATA
    其他信息都要调用对应的BAPI进行更新,不够便捷。

  • CMD_EI_API=>MAINTAIN_BAPI
    只能创建客户。

  • VMD_EI_API=>MAINTAIN_BAPI
    只能创建供应商。

  • CL_MD_BP_MAINTAIN=>MAINTAIN
    SAP推荐使用的封装类。

  • CVI_EI_INBOUND_MAIN
    SAP推荐使用的函数模块。

本例使用的参考代码为使用的方式为:CVI_EI_INBOUND_MAIN,封装类的参数和该函数类似

以下代码可以同时进行以下功能:

  • 供应商创建及变更
  • 供应商公司代码视图创建修改及扩充
  • 供应商采购组织视图创建修改及扩充
  • 供应商税码创建修改及扩充
  • 客户创建及变更
  • 客户公司代码视图创建修改及扩充
  • 客户销售组织视图创建修改及扩充
  • 客户销项税创建修改及扩充

未实现的功能可以自己参照代码进行补充,基本上前台的所有信息都可以一次性通过该函数进行维护,不需要额外调用BAPI去补充一些信息。

完整源码如下:

*&---------------------------------------------------------------------*
*& Form frm_bapi_vendor_bp
*&---------------------------------------------------------------------*
*& Call BAPI to maintain Business Partners
*&---------------------------------------------------------------------*
*&      --> us_req
*&      <-- cs_resp
*&---------------------------------------------------------------------*
FORM frm_bapi_vendor_bp USING us_req  TYPE zprmmsbpi001_in
                     CHANGING cs_resp TYPE zprbcsrest_out.
  CONSTANTS:
    lc_task_i       TYPE bus_ei_object_task VALUE 'I',
    lc_task_u       TYPE bus_ei_object_task VALUE 'U',
    lc_task_m       TYPE bus_ei_object_task VALUE 'M',
    lc_roles_zflvn0 TYPE bu_partnerrole     VALUE 'ZFLVN0',
    lc_roles_zflvn1 TYPE bu_partnerrole     VALUE 'ZFLVN1',
    lc_roles_zflcu0 TYPE bu_partnerrole     VALUE 'ZFLCU0',
    lc_roles_zflcu1 TYPE bu_partnerrole     VALUE 'ZFLCU1',
    lc_phone_type_3 TYPE ad_flgmob          VALUE '3',
    lc_phone_type_1 TYPE ad_flgmob          VALUE '1',
    lc_na           TYPE char2              VALUE 'N',
    lc_err_type     TYPE char3              VALUE 'EAX',
    lc_colon        TYPE char1              VALUE ':'.

  CONSTANTS:
    lc_parvw_pi TYPE parvw              VALUE 'PI',
    lc_parvw_oa TYPE parvw              VALUE 'OA',
    lc_parvw_vn TYPE parvw              VALUE 'VN',
    lc_parvw_sp TYPE parvw              VALUE 'SP',
    lc_parvw_bp TYPE parvw              VALUE 'BP',
    lc_parvw_py TYPE parvw              VALUE 'PY',
    lc_parvw_sh TYPE parvw              VALUE 'SH'.

* Bapi parameters
  DATA:
    lt_data      TYPE cvis_ei_extern_t,
    ls_data      TYPE cvis_ei_extern,
    lt_return    TYPE bapiretm,
    ls_return    TYPE bapireti,
    lv_partnerno TYPE but000-partner.

* Business partner type
  DATA:
    ls_partner  TYPE bus_ei_extern,
    ls_customer TYPE cmds_ei_extern,
    ls_vendor   TYPE vmds_ei_extern.

* Partner basic data
  DATA:
    ls_header       TYPE bus_ei_header,
    ls_central_data TYPE bus_ei_central_data.

* Partner basic data details
  DATA:
    ls_common          TYPE bus_ei_bupa_central,
    ls_communication   TYPE bus_ei_communication,

*   Roles data
    ls_role            TYPE bus_ei_roles,
    lt_roles           TYPE bus_ei_bupa_roles_t,
    ls_roles           TYPE bus_ei_bupa_roles,

*   Address data
    ls_address         TYPE bus_ei_address,
    lt_bupa_address    TYPE bus_ei_bupa_address_t,
    ls_bupa_address    TYPE bus_ei_bupa_address,

*   Bank data
    ls_bankdetail      TYPE bus_ei_bankdetail,
    lt_bupa_bankdetail TYPE bus_ei_bupa_bankdetail_t,
    ls_bupa_bankdetail TYPE bus_ei_bupa_bankdetail,

*   Tax data
    ls_taxnumber       TYPE bus_ei_taxnumber,
    lt_bupa_taxnumber  TYPE bus_ei_bupa_taxnumber_t,
    ls_bupa_taxnumber  TYPE bus_ei_bupa_taxnumber,

*   Phone data
    ls_phone           TYPE bus_ei_tel_data,
    lt_bupa_phone      TYPE bus_ei_bupa_telephone_t,
    ls_bupa_phone      TYPE bus_ei_bupa_telephone,

*   Remark data
    ls_remark          TYPE bus_ei_comrem,
    lt_bupa_remarks    TYPE bus_ei_bupa_comrem_t,
    ls_bupa_remarks    TYPE bus_ei_bupa_comrem,

*   Fax data
    ls_fax             TYPE bus_ei_fax_data,
    lt_bupa_fax        TYPE bus_ei_bupa_fax_t,
    ls_bupa_fax        TYPE bus_ei_bupa_fax,

*   Telex data
    ls_ttx             TYPE bus_ei_ttx_data,
    lt_bupa_ttx        TYPE bus_ei_bupa_ttx_t,
    ls_bupa_ttx        TYPE bus_ei_bupa_ttx,

*   Telex data
    ls_tlx             TYPE bus_ei_tlx_data,
    lt_bupa_tlx        TYPE bus_ei_bupa_tlx_t,
    ls_bupa_tlx        TYPE bus_ei_bupa_tlx,

*   SMTP data
    ls_smtp            TYPE bus_ei_smtp_data,
    lt_bupa_smtp       TYPE bus_ei_bupa_smtp_t,
    ls_bupa_smtp       TYPE bus_ei_bupa_smtp.

* Vendor data
  DATA:
    ls_header_vmd          TYPE vmds_ei_header,
    ls_central_data_vmd    TYPE vmds_ei_central_data,
    ls_company_data_vmd    TYPE vmds_ei_vmd_company,
    ls_purchasing_data_vmd TYPE vmds_ei_vmd_purchasing.

* Vendor data details
  DATA:
    ls_central_vmd     TYPE vmds_ei_vmd_central,
    lt_company_vmd     TYPE vmds_ei_company_t,
    ls_company_vmd     TYPE vmds_ei_company,
    lt_purchasing_vmd  TYPE vmds_ei_purchasing_t,
    ls_purchasing_vmd  TYPE vmds_ei_purchasing,
    ls_function_vmd    TYPE vmds_ei_vmd_functions,
    lt_functions_vmd   TYPE vmds_ei_functions_t,
    ls_functions_vmd   TYPE vmds_ei_functions,
    ls_bankdetail_vmd  TYPE cvis_ei_bankdetail,
    lt_bankdetails_vmd TYPE cvis_ei_bankdetail_t,
    ls_bankdetails_vmd TYPE cvis_ei_cvi_bankdetail.

* Customer data
  DATA:
    ls_header_cmd       TYPE cmds_ei_header,
    ls_central_data_cmd TYPE cmds_ei_central_data,
    ls_company_data_cmd TYPE cmds_ei_cmd_company,
    ls_sales_data_cmd   TYPE cmds_ei_cmd_sales.

* Customer data details
  DATA:
    ls_central_cmd     TYPE cmds_ei_cmd_central,
    lt_company_cmd     TYPE cmds_ei_company_t,
    ls_company_cmd     TYPE cmds_ei_company,
    lt_sales_cmd       TYPE cmds_ei_sales_t,
    ls_sales_cmd       TYPE cmds_ei_sales,
    ls_function_cmd    TYPE cmds_ei_cmd_functions,
    lt_functions_cmd   TYPE cmds_ei_functions_t,
    ls_functions_cmd   TYPE cmds_ei_functions,
    ls_tax_id_cmd      TYPE cmds_ei_cmd_tax_ind,
    lt_tax_ids_cmd     TYPE cmds_ei_tax_ind_t,
    ls_tax_ids_cmd     TYPE cmds_ei_tax_ind,
    ls_bankdetail_cmd  TYPE cvis_ei_bankdetail,
    lt_bankdetails_cmd TYPE cvis_ei_bankdetail_t,
    ls_bankdetails_cmd TYPE cvis_ei_cvi_bankdetail.

  DATA:
    lv_task         TYPE bus_ei_object_task,
    lv_partner_guid TYPE bu_partner_guid,
    lv_guid_32      TYPE bu_partner_guid_bapi.

* Custom parameters
  DATA:
    ls_bpdata_in      TYPE zprmmsbp_data,
    lt_bank_in        TYPE zprmmtbp_bank,
    lt_company_in     TYPE zprmmtbp_company,
    lt_purchase_in    TYPE zprmmtbp_purchase,
    lt_sales_in       TYPE zprmmtbp_sales,
    lt_company_cus_in TYPE zprsdtcustom_company.

* Get input data
  ls_bpdata_in      = us_req-bpdata.
  lt_bank_in        = us_req-bpdata-zbank.
  lt_company_in     = us_req-bpdata-zbukrs.
  lt_purchase_in    = us_req-bpdata-zekorg.
  lt_sales_in       = us_req-bpdata-zvkorg.
  lt_company_cus_in = us_req-bpdata-zbukrs_cus.

* Delete invalid data
  DELETE lt_bank_in        WHERE bkvid  IS INITIAL
                              OR banks  IS INITIAL
                              OR bankl  IS INITIAL
                              OR bankn  IS INITIAL.
  DELETE lt_company_in     WHERE bukrs  IS INITIAL.
  DELETE lt_purchase_in    WHERE ekorg  IS INITIAL.
  DELETE lt_sales_in       WHERE vkorg  IS INITIAL
                              OR vtweg  IS INITIAL
                              OR spart  IS INITIAL.
  DELETE lt_company_cus_in WHERE bukrsk IS INITIAL.

* Check partner exist
  SELECT SINGLE
         partner_guid                                                   "Partner UUID
    INTO lv_partner_guid
    FROM but000
   WHERE partner = ls_bpdata_in-partner.

  IF lv_partner_guid IS INITIAL.
    lv_task = lc_task_i.

*   Generate UUID for create business partner
    TRY .
        lv_partner_guid = cl_uuid_factory=>create_system_uuid( )->create_uuid_x16( ).
      CATCH cx_uuid_error.
    ENDTRY.
  ELSE.
    lv_task = lc_task_u.
  ENDIF.

**********************************************************************
* Basic data part.
**********************************************************************
  ls_header-object_task = lv_task.

  ls_header-object_instance-bpartner     = ls_bpdata_in-partner.
  ls_header-object_instance-bpartnerguid = lv_partner_guid.

  ls_common-data-bp_control-category = us_req-type.                     "Business Partner Category
  ls_common-data-bp_control-grouping = us_req-bu_group.                 "Business Partner Grouping

  IF ls_bpdata_in-title IS NOT INITIAL.
    ls_common-data-bp_centraldata-title_key  = ls_bpdata_in-title.      "Form-of-Address Key
    ls_common-datax-bp_centraldata-title_key = abap_true.
  ENDIF.

  IF ls_bpdata_in-name1 IS NOT INITIAL.
    ls_common-data-bp_organization-name1  = ls_bpdata_in-name1.         "Name 1 of organization
    ls_common-datax-bp_organization-name1 = abap_true.
  ENDIF.

  IF ls_bpdata_in-name2 IS NOT INITIAL.
    ls_common-data-bp_organization-name2  = ls_bpdata_in-name2.         "Name 2 of organization
    ls_common-datax-bp_organization-name2 = abap_true.
  ENDIF.

  IF ls_bpdata_in-name3 IS NOT INITIAL.
    ls_common-data-bp_organization-name3  = ls_bpdata_in-name3.         "Name 3 of organization
    ls_common-datax-bp_organization-name3 = abap_true.
  ENDIF.

  IF ls_bpdata_in-sort1 IS NOT INITIAL.
    ls_common-data-bp_centraldata-searchterm1  = ls_bpdata_in-sort1.    "Search Term 1 for Business Partner
    ls_common-datax-bp_centraldata-searchterm1 = abap_true.
  ENDIF.

  IF ls_bpdata_in-sort2 IS NOT INITIAL.
    ls_common-data-bp_centraldata-searchterm2  = ls_bpdata_in-sort2.    "Search Term 2 for Business Partner
    ls_common-datax-bp_centraldata-searchterm2 = abap_true.
  ENDIF.

  IF ls_bpdata_in-bpext IS NOT INITIAL.
    ls_common-data-bp_centraldata-partnerexternal  = ls_bpdata_in-bpext."Business Partner Number in External System
    ls_common-datax-bp_centraldata-partnerexternal = abap_true.
  ENDIF.

  IF ls_bpdata_in-title_let IS NOT INITIAL.
    ls_common-data-bp_centraldata-titleletter  = ls_bpdata_in-title_let."Salutation
    ls_common-datax-bp_centraldata-titleletter = abap_true.
  ENDIF.

  ls_central_data-common = ls_common.

**********************************************************************
* Roles data part
**********************************************************************

* Get exists roles
  SELECT partner,                                                       "Partner number
         rltyp                                                          "Roles
    INTO TABLE @DATA(lt_but100)
    FROM but100
   WHERE partner = @ls_bpdata_in-partner
     AND rltyp IN ( @lc_roles_zflvn0,@lc_roles_zflvn1,@lc_roles_zflcu1,@lc_roles_zflcu0 ).

  SORT lt_but100 BY partner ASCENDING
                    rltyp   ASCENDING.

  IF lt_company_in IS NOT INITIAL.
    READ TABLE lt_but100 TRANSPORTING NO FIELDS
      WITH KEY partner = ls_bpdata_in-partner
               rltyp = lc_roles_zflvn0
               BINARY SEARCH.
    IF sy-subrc <> 0.
      ls_roles-task = lc_task_i.
      ls_roles-data_key = lc_roles_zflvn0.                              "Role:ZFLVN0
      APPEND ls_roles TO lt_roles.
      CLEAR ls_roles.
    ENDIF.
  ENDIF.

  IF lt_purchase_in IS NOT INITIAL.
    READ TABLE lt_but100 TRANSPORTING NO FIELDS
      WITH KEY partner = ls_bpdata_in-partner
               rltyp = lc_roles_zflvn1
               BINARY SEARCH.
    IF sy-subrc <> 0.
      ls_roles-task = lc_task_i.
      ls_roles-data_key = lc_roles_zflvn1.                              "Role:ZFLVN1
      APPEND ls_roles TO lt_roles.
      CLEAR ls_roles.
    ENDIF.
  ENDIF.

  IF lt_company_cus_in IS NOT INITIAL.
    READ TABLE lt_but100 TRANSPORTING NO FIELDS
      WITH KEY partner = ls_bpdata_in-partner
               rltyp = lc_roles_zflcu0
               BINARY SEARCH.
    IF sy-subrc <> 0.
      ls_roles-task = lc_task_i.
      ls_roles-data_key = lc_roles_zflcu0.                              "Role:ZFLCU0
      APPEND ls_roles TO lt_roles.
      CLEAR ls_roles.
    ENDIF.
  ENDIF.

  IF lt_sales_in IS NOT INITIAL.
    READ TABLE lt_but100 TRANSPORTING NO FIELDS
      WITH KEY partner = ls_bpdata_in-partner
               rltyp = lc_roles_zflcu1
               BINARY SEARCH.
    IF sy-subrc <> 0.
      ls_roles-task = lc_task_i.                                        "Role:ZFLCU1
      ls_roles-data_key = lc_roles_zflcu1.
      APPEND ls_roles TO lt_roles.
      CLEAR ls_roles.
    ENDIF.
  ENDIF.

  ls_role-roles        = lt_roles.
  ls_central_data-role = ls_role.

**********************************************************************
* Address data part
**********************************************************************
  ls_bupa_address-task = lv_task.

  IF lv_task = lc_task_u.
*   Get address guid
    SELECT SINGLE address_guid
      INTO @DATA(lv_addr_guid)
      FROM but020
     WHERE partner = @ls_bpdata_in-partner.

    ls_bupa_address-data_key-guid = lv_addr_guid.                       "Address guid
  ENDIF.

  IF ls_bpdata_in-postl_cod1 IS NOT INITIAL.
    ls_bupa_address-data-postal-data-postl_cod1  = ls_bpdata_in-postl_cod1. "City postal code
    ls_bupa_address-data-postal-datax-postl_cod1 = abap_true.
  ENDIF.

  IF ls_bpdata_in-city IS NOT INITIAL.
    ls_bupa_address-data-postal-data-city  = ls_bpdata_in-city.         "City
    ls_bupa_address-data-postal-datax-city = abap_true.
  ENDIF.

  IF ls_bpdata_in-street IS NOT INITIAL.
    ls_bupa_address-data-postal-data-street  = ls_bpdata_in-street.     "Street
    ls_bupa_address-data-postal-datax-street = abap_true.
  ENDIF.

  IF ls_bpdata_in-str_suppl1 IS NOT INITIAL.
    ls_bupa_address-data-postal-data-str_suppl1  = ls_bpdata_in-str_suppl1. "Street 2
    ls_bupa_address-data-postal-datax-str_suppl1 = abap_true.
  ENDIF.

  IF ls_bpdata_in-str_suppl2 IS NOT INITIAL.
    ls_bupa_address-data-postal-data-str_suppl2  = ls_bpdata_in-str_suppl2. "Street 3
    ls_bupa_address-data-postal-datax-str_suppl2 = abap_true.
  ENDIF.

  IF ls_bpdata_in-regio IS NOT INITIAL.
    ls_bupa_address-data-postal-data-region  = ls_bpdata_in-regio.      "Region (State, Province, County)
    ls_bupa_address-data-postal-datax-region = abap_true.
  ENDIF.

  IF ls_bpdata_in-country IS NOT INITIAL.
    ls_bupa_address-data-postal-data-country  = ls_bpdata_in-country.   "Country Key
    ls_bupa_address-data-postal-datax-country = abap_true.
  ENDIF.

  IF ls_bpdata_in-languiso IS NOT INITIAL.
    ls_bupa_address-data-postal-data-languiso   = ls_bpdata_in-languiso."2-Character SAP Language Code
    ls_bupa_address-data-postal-datax-langu_iso = abap_true.
  ENDIF.

  IF ls_bpdata_in-district IS NOT INITIAL.
    ls_bupa_address-data-postal-data-district  = ls_bpdata_in-district. "District
    ls_bupa_address-data-postal-datax-district = abap_true.
  ENDIF.

  APPEND ls_bupa_address TO lt_bupa_address.
  CLEAR ls_bupa_address.

  ls_address-addresses    = lt_bupa_address.
  ls_central_data-address = ls_address.

**********************************************************************
* Tax data part
**********************************************************************
  IF ls_bpdata_in-taxtype IS NOT INITIAL OR ls_bpdata_in-taxnum IS NOT INITIAL.
    ls_bupa_taxnumber-task = lv_task.

    IF ls_bpdata_in-taxtype IS NOT INITIAL.
      ls_bupa_taxnumber-data_key-taxtype = ls_bpdata_in-taxtype.        "Tax type
    ENDIF.

    IF ls_bpdata_in-taxnum IS NOT INITIAL.
      ls_bupa_taxnumber-data_key-taxnumber = ls_bpdata_in-taxnum.       "Tax number
    ENDIF.

    APPEND ls_bupa_taxnumber TO lt_bupa_taxnumber.
    CLEAR ls_bupa_taxnumber.
  ENDIF.

  ls_taxnumber-taxnumbers   = lt_bupa_taxnumber.
  ls_central_data-taxnumber = ls_taxnumber.

**********************************************************************
* Phone data part
**********************************************************************

* Get exists phone details
  SELECT a~partner,
         a~addrcomm,
         b~persnumber,
         b~date_from,
         b~consnumber,
         b~tel_number,
         b~r3_user
    INTO TABLE @DATA(lt_adr2)
    FROM but000 AS a
   INNER JOIN adr2 AS b
      ON a~addrcomm = b~addrnumber
   WHERE a~partner = @ls_bpdata_in-partner.

  SORT lt_adr2 BY partner ASCENDING
                  r3_user ASCENDING.

*--------------------------------------------------------------------*
* If there are multiple phone numbers, you should add multiple records
* to the phone table,and then the records will be saved in adr2 table.
*--------------------------------------------------------------------*

  IF ls_bpdata_in-telf1 IS NOT INITIAL.
    READ TABLE lt_adr2 INTO DATA(ls_adr2)
      WITH KEY r3_user = lc_phone_type_1 BINARY SEARCH.
    IF ls_adr2-tel_number IS INITIAL.
      ls_bupa_phone-contact-task = lc_task_i.
    ELSE.
      ls_bupa_phone-contact-task = lc_task_u.
    ENDIF.

    ls_bupa_phone-contact-data-telephone  = ls_bpdata_in-telf1.         "Telephone no.: dialling code+number
    ls_bupa_phone-contact-datax-telephone = abap_true.

    IF ls_bpdata_in-te_exten IS NOT INITIAL.
      ls_bupa_phone-contact-data-extension  = ls_bpdata_in-te_exten.    "Telephone no.: Extension
      ls_bupa_phone-contact-datax-extension = abap_true.
    ENDIF.

    ls_bupa_phone-contact-data-r_3_user  = lc_phone_type_1.             "Telephone is Landline Telephone
    ls_bupa_phone-contact-datax-r_3_user = abap_true.

    IF ls_bpdata_in-remark IS NOT INITIAL.
      ls_bupa_remarks-task = lv_task.

      ls_bupa_remarks-data-comm_notes  = ls_bpdata_in-remark.           "Communication link notes
      ls_bupa_remarks-datax-comm_notes = abap_true.

      ls_bupa_remarks-data-langu  = sy-langu.                           "Language Key
      ls_bupa_remarks-datax-langu = abap_true.

      APPEND ls_bupa_remarks TO lt_bupa_remarks.
      CLEAR ls_bupa_remarks.

      ls_remark-remarks = lt_bupa_remarks.

      ls_bupa_phone-remark = ls_remark.
    ENDIF.

    APPEND ls_bupa_phone TO lt_bupa_phone.
    CLEAR ls_bupa_phone.
  ENDIF.

  IF ls_bpdata_in-telf2 IS NOT INITIAL.
    CLEAR ls_adr2.
    READ TABLE lt_adr2 INTO ls_adr2
      WITH KEY r3_user = lc_phone_type_3 BINARY SEARCH.
    IF ls_adr2-tel_number IS INITIAL.
      ls_bupa_phone-contact-task = lc_task_i.
    ELSE.
      ls_bupa_phone-contact-task = lc_task_u.
    ENDIF.

    ls_bupa_phone-contact-data-telephone  = ls_bpdata_in-telf2.
    ls_bupa_phone-contact-datax-telephone = abap_true.

    ls_bupa_phone-contact-data-r_3_user  = lc_phone_type_3.             "Telephone is Default Mobile Telephone
    ls_bupa_phone-contact-datax-r_3_user = abap_true.

    APPEND ls_bupa_phone TO lt_bupa_phone.
    CLEAR ls_bupa_phone.
  ENDIF.

*--------------------------------------------------------------------*
* Ensure that the inserted entry 'I' must be entered after the updated entry 'U' in the table.
* You can get more infomations in note 2437000
*--------------------------------------------------------------------*
  SORT lt_bupa_phone BY contact-task DESCENDING.

  ls_phone-phone = lt_bupa_phone.

**********************************************************************
  ls_bupa_fax-contact-task = lv_task.

  IF ls_bpdata_in-telfx IS NOT INITIAL.
    ls_bupa_fax-contact-data-fax  = ls_bpdata_in-telfx.                 "Fax number: dialling code+number
    ls_bupa_fax-contact-datax-fax = abap_true.
  ENDIF.

  IF ls_bpdata_in-fx_exten IS NOT INITIAL.
    ls_bupa_fax-contact-data-extension  = ls_bpdata_in-fx_exten.        "Fax no.: Extension
    ls_bupa_fax-contact-datax-extension = abap_true.
  ENDIF.

  APPEND ls_bupa_fax TO lt_bupa_fax.
  CLEAR ls_bupa_fax.

  ls_fax-fax = lt_bupa_fax.

**********************************************************************
  ls_bupa_smtp-contact-task = lv_task.

  IF ls_bpdata_in-smtp_addr IS NOT INITIAL.
    ls_bupa_smtp-contact-data-e_mail  = ls_bpdata_in-smtp_addr.         "E-Mail Address
    ls_bupa_smtp-contact-datax-e_mail = abap_true.
  ENDIF.

  APPEND ls_bupa_smtp TO lt_bupa_smtp.
  CLEAR ls_bupa_smtp.

  ls_smtp-smtp = lt_bupa_smtp.

  ls_central_data-communication-phone = ls_phone.                       "Phone
  ls_central_data-communication-fax   = ls_fax.                         "Fax
  ls_central_data-communication-smtp  = ls_smtp.                        "SMTP

**********************************************************************
* Bank data part
**********************************************************************
  IF lt_bank_in IS NOT INITIAL.
*   Get exists Bank details ID
    SELECT partner,
           bkvid
      INTO TABLE @DATA(lt_but0bk)
      FROM but0bk
       FOR ALL ENTRIES IN @lt_bank_in
     WHERE partner = @ls_bpdata_in-partner
       AND bkvid   = @lt_bank_in-bkvid.

    SORT lt_but0bk BY partner ASCENDING
                      bkvid   ASCENDING.

    LOOP AT lt_bank_in INTO DATA(ls_bank_in).
      READ TABLE lt_but0bk TRANSPORTING NO FIELDS
        WITH KEY bkvid = ls_bank_in-bkvid BINARY SEARCH.
      IF sy-subrc = 0.
        ls_bupa_bankdetail-task = lc_task_u.
      ELSE.
        ls_bupa_bankdetail-task = lc_task_i.
      ENDIF.

      ls_bupa_bankdetail-data_key = ls_bank_in-bkvid.                   "Bank details ID

      IF ls_bank_in-banks IS NOT INITIAL.
        ls_bupa_bankdetail-data-bank_ctry  = ls_bank_in-banks.          "Bank Country Key
        ls_bupa_bankdetail-datax-bank_ctry = abap_true.
      ENDIF.

      IF ls_bank_in-bankn IS NOT INITIAL.
        ls_bupa_bankdetail-data-bank_acct  = ls_bank_in-bankn.          "Bank Account Number
        ls_bupa_bankdetail-datax-bank_acct = abap_true.
      ENDIF.

      IF ls_bank_in-bkref IS NOT INITIAL.
        ls_bupa_bankdetail-data-bank_ref  = ls_bank_in-bkref.           "Reference Details for Bank Details
        ls_bupa_bankdetail-datax-bank_ref = abap_true.
      ENDIF.

      IF ls_bank_in-bankl IS NOT INITIAL.
        ls_bupa_bankdetail-data-bank_key  = ls_bank_in-bankl.           "Bank Key
        ls_bupa_bankdetail-datax-bank_key = abap_true.
      ENDIF.

      IF ls_bank_in-koinh IS NOT INITIAL.
        ls_bupa_bankdetail-data-accountholder  = ls_bank_in-koinh.      "Account Holder Name
        ls_bupa_bankdetail-datax-accountholder = abap_true.
      ENDIF.

      APPEND ls_bupa_bankdetail TO lt_bupa_bankdetail.
      CLEAR ls_bupa_bankdetail.
    ENDLOOP.

    ls_bankdetail-bankdetails  = lt_bupa_bankdetail.
    ls_central_data-bankdetail = ls_bankdetail.
  ENDIF.

**********************************************************************
* Vendor data part
**********************************************************************
  SELECT SINGLE lifnr
    INTO @DATA(lv_lfa1_lifnr)
    FROM lfa1
   WHERE lifnr = @ls_bpdata_in-partner.

  IF lv_lfa1_lifnr IS INITIAL.
    ls_header_vmd-object_task = lc_task_i.
  ELSE.
    ls_header_vmd-object_task = lc_task_u.
  ENDIF.

  ls_header_vmd-object_instance-lifnr = ls_bpdata_in-partner.

**********************************************************************
* Copy bank data to LFBK
**********************************************************************

* Get exists Bank details
  SELECT lifnr,
         banks,
         bankl,
         bankn
    INTO TABLE @DATA(lt_lfbk)
    FROM lfbk
     FOR ALL ENTRIES IN @lt_bank_in
   WHERE lifnr = @ls_bpdata_in-partner
     AND banks   = @lt_bank_in-banks
     AND bankl   = @lt_bank_in-bankl
     AND bankn   = @lt_bank_in-bankn.

  SORT lt_lfbk BY lifnr ASCENDING
                  banks ASCENDING
                  bankl ASCENDING
                  bankn ASCENDING.

  LOOP AT lt_bank_in INTO ls_bank_in.
    READ TABLE lt_lfbk TRANSPORTING NO FIELDS
      WITH KEY banks = ls_bank_in-banks
               bankl = ls_bank_in-bankl
               bankn = ls_bank_in-bankn
               BINARY SEARCH.
    IF sy-subrc = 0.
      ls_bankdetails_vmd-task = lc_task_u.
    ELSE.
      ls_bankdetails_vmd-task = lc_task_i.
    ENDIF.

    ls_bankdetails_vmd-data_key-banks = ls_bank_in-banks.               "Bank Country Key
    ls_bankdetails_vmd-data_key-bankl = ls_bank_in-bankl.               "Bank Key
    ls_bankdetails_vmd-data_key-bankn = ls_bank_in-bankn.               "Bank Account Number

    IF ls_bank_in-bkref IS NOT INITIAL.
      ls_bankdetails_vmd-data-bkref  = ls_bank_in-bkref.                "Reference Details for Bank Details
      ls_bankdetails_vmd-datax-bkref = abap_true.
    ENDIF.

    IF ls_bank_in-koinh IS NOT INITIAL.
      ls_bankdetails_vmd-data-koinh  = ls_bank_in-koinh.                "Account Holder Name
      ls_bankdetails_vmd-datax-koinh = abap_true.
    ENDIF.

    APPEND ls_bankdetails_vmd TO lt_bankdetails_vmd.
    CLEAR ls_bankdetails_vmd.
  ENDLOOP.

  ls_bankdetail_vmd-bankdetails  = lt_bankdetails_vmd.

  ls_central_data_vmd-bankdetail = ls_bankdetail_vmd.

**********************************************************************
* Vendor Company code data
**********************************************************************
  IF lt_company_in IS NOT INITIAL.
*   Get exists company code data
    SELECT lifnr,
           bukrs
      INTO TABLE @DATA(lt_lfb1)
      FROM lfb1
       FOR ALL ENTRIES IN @lt_company_in
     WHERE lifnr = @ls_bpdata_in-partner
       AND bukrs = @lt_company_in-bukrs.

    SORT lt_lfb1 BY lifnr ASCENDING
                    bukrs ASCENDING.

    LOOP AT lt_company_in INTO DATA(ls_company_in).
      READ TABLE lt_lfb1 TRANSPORTING NO FIELDS
        WITH KEY bukrs = ls_company_in-bukrs BINARY SEARCH.
      IF sy-subrc = 0.
        ls_company_vmd-task = lc_task_u.
      ELSE.
        ls_company_vmd-task = lc_task_i.
      ENDIF.

      ls_company_vmd-data_key-bukrs = ls_company_in-bukrs.              "Company code

      IF ls_company_in-akont IS NOT INITIAL.
        ls_company_vmd-data-akont  = ls_company_in-akont.               "Reconciliation Account in General Ledger
        ls_company_vmd-datax-akont = abap_true.
      ENDIF.

      IF ls_company_in-zuawa IS NOT INITIAL.
        ls_company_vmd-data-zuawa  = ls_company_in-zuawa.               "Key for sorting according to assignment numbers
        ls_company_vmd-datax-zuawa = abap_true.
      ENDIF.

      IF ls_company_in-zterm IS NOT INITIAL.
        ls_company_vmd-data-zterm  = ls_company_in-zterm.               "Terms of payment key
        ls_company_vmd-datax-zterm = abap_true.
      ENDIF.

      IF ls_company_in-reprf IS NOT INITIAL.
        IF ls_company_in-reprf = lc_na.
          ls_company_vmd-data-reprf  = space.                           "Check Flag for Double Invoices or Credit Memos
          ls_company_vmd-datax-reprf = abap_true.
        ELSE.
          ls_company_vmd-data-reprf  = ls_company_in-reprf.             "Check Flag for Double Invoices or Credit Memos
          ls_company_vmd-datax-reprf = abap_true.
        ENDIF.
      ENDIF.

      IF ls_company_in-zwels IS NOT INITIAL.
        ls_company_vmd-data-zwels  = ls_company_in-zwels.               "List of Respected Payment Methods
        ls_company_vmd-datax-zwels = abap_true.
      ENDIF.

      IF ls_company_in-altkn IS NOT INITIAL.
        ls_company_vmd-data-altkn  = ls_company_in-altkn.               "Previous Master Record Number
        ls_company_vmd-datax-altkn = abap_true.
      ENDIF.

      IF ls_company_in-zobject IS NOT INITIAL.
        ls_company_vmd-data-zobject  = ls_company_in-zobject.           "Delegate object type
        ls_company_vmd-datax-zobject = abap_true.
      ENDIF.

      IF ls_company_in-zdecision IS NOT INITIAL.
        ls_company_vmd-data-zdecision  = ls_company_in-zdecision.       "Decision table
        ls_company_vmd-datax-zdecision = abap_true.
      ENDIF.

      IF ls_company_in-zcapitalist IS NOT INITIAL.
        ls_company_vmd-data-zcapitalist  = ls_company_in-zcapitalist.   "Capital fund
        ls_company_vmd-datax-zcapitalist = abap_true.
      ENDIF.

      IF ls_company_in-zcurrency IS NOT INITIAL.
        ls_company_vmd-data-zcurrency  = ls_company_in-zcurrency.       "Currency
        ls_company_vmd-datax-zcurrency = abap_true.
      ENDIF.

      IF ls_company_in-zbankde IS NOT INITIAL.
        ls_company_vmd-data-zbankde  = ls_company_in-zbankde.           "Payment details required
        ls_company_vmd-datax-zbankde = abap_true.
      ENDIF.

      IF ls_company_in-sperr IS NOT INITIAL.
        IF ls_company_in-sperr = lc_na.
          ls_company_vmd-data-sperr  = space.                           "Posting block for company code
          ls_company_vmd-datax-sperr = abap_true.
        ELSE.
          ls_company_vmd-data-sperr  = ls_company_in-sperr.             "Posting block for company code
          ls_company_vmd-datax-sperr = abap_true.
        ENDIF.
      ENDIF.

      IF ls_company_in-togrr IS NOT INITIAL.
        ls_company_vmd-data-togrr  = ls_company_in-togrr.               "Tolerance Group in Invoice Verification
        ls_company_vmd-datax-togrr = abap_true.
      ENDIF.

      IF ls_company_in-loevm IS NOT INITIAL.
        IF ls_company_in-loevm = lc_na.
          ls_company_vmd-data-loevm  = space.                           "Deletion Flag for Master Record (Company Code Level)
          ls_company_vmd-datax-loevm = abap_true.
        ELSE.
          ls_company_vmd-data-loevm  = ls_company_in-loevm.             "Deletion Flag for Master Record (Company Code Level)
          ls_company_vmd-datax-loevm = abap_true.
        ENDIF.
      ENDIF.

      APPEND ls_company_vmd TO lt_company_vmd.
      CLEAR ls_company_vmd.
    ENDLOOP.

    ls_company_data_vmd-company = lt_company_vmd.
  ENDIF.

**********************************************************************
* Vendor Purchasing data
**********************************************************************
  IF lt_purchase_in IS NOT INITIAL.
*   Get exists purchasing data
    SELECT lifnr,
           ekorg
      INTO TABLE @DATA(lt_lfm1)
      FROM lfm1
       FOR ALL ENTRIES IN @lt_purchase_in
     WHERE lifnr = @ls_bpdata_in-partner
       AND ekorg = @lt_purchase_in-ekorg.

    SORT lt_lfm1 BY lifnr ASCENDING
                    ekorg ASCENDING.

    LOOP AT lt_purchase_in INTO DATA(ls_purchase_in).
      READ TABLE lt_lfm1 TRANSPORTING NO FIELDS
        WITH KEY ekorg = ls_purchase_in-ekorg BINARY SEARCH.
      IF sy-subrc = 0.
        ls_purchasing_vmd-task = lc_task_u.
      ELSE.
        ls_purchasing_vmd-task = lc_task_i.
      ENDIF.

      ls_purchasing_vmd-data_key-ekorg = ls_purchase_in-ekorg.          "Purchasing organization

      IF ls_purchase_in-waers IS NOT INITIAL.
        ls_purchasing_vmd-data-waers  = ls_purchase_in-waers.           "Purchase order currency
        ls_purchasing_vmd-datax-waers = abap_true.
      ENDIF.

      IF ls_purchase_in-webre IS NOT INITIAL.
        IF ls_purchase_in-webre = lc_na.
          ls_purchasing_vmd-data-webre  = space.                        "Indicator: GR-Based Invoice Verification
          ls_purchasing_vmd-datax-webre = abap_true.
        ELSE.
          ls_purchasing_vmd-data-webre  = ls_purchase_in-webre.         "Indicator: GR-Based Invoice Verification
          ls_purchasing_vmd-datax-webre = abap_true.
        ENDIF.
      ENDIF.

      IF ls_purchase_in-ztermc IS NOT INITIAL.
        ls_purchasing_vmd-data-zterm  = ls_purchase_in-ztermc.          "Terms of payment key
        ls_purchasing_vmd-datax-zterm = abap_true.
      ENDIF.

      IF ls_purchase_in-ekgrp IS NOT INITIAL.
        ls_purchasing_vmd-data-ekgrp  = ls_purchase_in-ekgrp.           "Purchasing Group
        ls_purchasing_vmd-datax-ekgrp = abap_true.
      ENDIF.

      IF ls_purchase_in-telf1c IS NOT INITIAL.
        ls_purchasing_vmd-data-telf1  = ls_purchase_in-telf1c.          "Supplier's Telephone Number
        ls_purchasing_vmd-datax-telf1 = abap_true.
      ENDIF.

      IF ls_purchase_in-sperm IS NOT INITIAL.
        IF ls_purchase_in-sperm = lc_na.
          ls_purchasing_vmd-data-sperm  = space.                        "Purchasing block at purchasing organization level
          ls_purchasing_vmd-datax-sperm = abap_true.
        ELSE.
          ls_purchasing_vmd-data-sperm  = ls_purchase_in-sperm.         "Purchasing block at purchasing organization level
          ls_purchasing_vmd-datax-sperm = abap_true.
        ENDIF.
      ENDIF.

      IF ls_purchase_in-verkf IS NOT INITIAL.
        ls_purchasing_vmd-data-verkf  = ls_purchase_in-verkf.           "Responsible Salesperson at Supplier's Office
        ls_purchasing_vmd-datax-verkf = abap_true.
      ENDIF.

      IF ls_purchase_in-lfabc IS NOT INITIAL.
        IF ls_purchase_in-lfabc = lc_na.
          ls_purchasing_vmd-data-lfabc  = space.                        "ABC indicator
          ls_purchasing_vmd-datax-lfabc = abap_true.
        ELSE.
          ls_purchasing_vmd-data-lfabc  = ls_purchase_in-lfabc.         "ABC indicator
          ls_purchasing_vmd-datax-lfabc = abap_true.
        ENDIF.
      ENDIF.

      IF ls_purchase_in-kalsk IS NOT INITIAL.
        ls_purchasing_vmd-data-kalsk  = ls_purchase_in-kalsk.           "Group for Calculation Schema (Supplier)
        ls_purchasing_vmd-datax-kalsk = abap_true.
      ENDIF.

      IF ls_purchase_in-inco1 IS NOT INITIAL.
        ls_purchasing_vmd-data-inco1  = ls_purchase_in-inco1.           "Incoterms (Part 1)
        ls_purchasing_vmd-datax-inco1 = abap_true.
      ENDIF.

      IF ls_purchase_in-inco2_l IS NOT INITIAL.
        ls_purchasing_vmd-data-inco2_l  = ls_purchase_in-inco2_l.       "Incoterms Location 1
        ls_purchasing_vmd-datax-inco2_l = abap_true.
      ENDIF.

      IF ls_purchase_in-vsbed IS NOT INITIAL.
        ls_purchasing_vmd-data-vsbed  = ls_purchase_in-vsbed.           "Shipping Conditions
        ls_purchasing_vmd-datax-vsbed = abap_true.
      ENDIF.

      IF ls_purchase_in-plifz IS NOT INITIAL.
        ls_purchasing_vmd-data-plifz  = ls_purchase_in-plifz.           "Planned Delivery Time in Days
        ls_purchasing_vmd-datax-plifz = abap_true.
      ENDIF.

      IF ls_purchase_in-meprf IS NOT INITIAL.
        ls_purchasing_vmd-data-meprf  = ls_purchase_in-meprf.           "Price Determination (Pricing) Date Control
        ls_purchasing_vmd-datax-meprf = abap_true.
      ENDIF.

      IF ls_purchase_in-xersy IS NOT INITIAL.
        IF ls_purchase_in-xersy = lc_na.
          ls_purchasing_vmd-data-xersy  = space.                        "Evaluated Receipt Settlement (ERS)
          ls_purchasing_vmd-datax-xersy = abap_true.
        ELSE.
          ls_purchasing_vmd-data-xersy  = ls_purchase_in-xersy.         "Evaluated Receipt Settlement (ERS)
          ls_purchasing_vmd-datax-xersy = abap_true.
        ENDIF.
      ENDIF.

      IF ls_purchasing_vmd-task = lc_task_i.
        ls_functions_vmd-task = lc_task_m.

*       Invoicing Party
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_pi
          IMPORTING
            output = ls_functions_vmd-data_key-parvw.

        APPEND ls_functions_vmd TO lt_functions_vmd.

*       Ordering address
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_oa
          IMPORTING
            output = ls_functions_vmd-data_key-parvw.

        APPEND ls_functions_vmd TO lt_functions_vmd.

*       Vendor
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_vn
          IMPORTING
            output = ls_functions_vmd-data_key-parvw.

        APPEND ls_functions_vmd TO lt_functions_vmd.
        CLEAR ls_functions_vmd.

        ls_function_vmd-functions = lt_functions_vmd.

        ls_purchasing_vmd-functions = ls_function_vmd.
      ENDIF.

      APPEND ls_purchasing_vmd TO lt_purchasing_vmd.
      CLEAR ls_purchasing_vmd.
    ENDLOOP.

    ls_purchasing_data_vmd-purchasing = lt_purchasing_vmd.
  ENDIF.

**********************************************************************
* Customer data part
**********************************************************************
  SELECT SINGLE kunnr
    INTO @DATA(lv_kna1_kunnr)
    FROM kna1
   WHERE kunnr = @ls_bpdata_in-partner.

  IF lv_kna1_kunnr IS INITIAL.
    ls_header_cmd-object_task = lc_task_i.
  ELSE.
    ls_header_cmd-object_task = lc_task_u.
  ENDIF.

  ls_header_cmd-object_instance-kunnr = ls_bpdata_in-partner.

**********************************************************************
* Copy bank data to KNBK
**********************************************************************

* Get exists Bank details
  SELECT kunnr,
         banks,
         bankl,
         bankn
    INTO TABLE @DATA(lt_knbk)
    FROM knbk
     FOR ALL ENTRIES IN @lt_bank_in
   WHERE kunnr = @ls_bpdata_in-partner
     AND banks   = @lt_bank_in-banks
     AND bankl   = @lt_bank_in-bankl
     AND bankn   = @lt_bank_in-bankn.

  SORT lt_knbk BY kunnr ASCENDING
                  banks ASCENDING
                  bankl ASCENDING
                  bankn ASCENDING.

  LOOP AT lt_bank_in INTO ls_bank_in.
    READ TABLE lt_knbk TRANSPORTING NO FIELDS
      WITH KEY banks = ls_bank_in-banks
               bankl = ls_bank_in-bankl
               bankn = ls_bank_in-bankn
               BINARY SEARCH.
    IF sy-subrc = 0.
      ls_bankdetails_cmd-task = lc_task_u.
    ELSE.
      ls_bankdetails_cmd-task = lc_task_i.
    ENDIF.

    ls_bankdetails_cmd-data_key-banks = ls_bank_in-banks.               "Bank Country Key
    ls_bankdetails_cmd-data_key-bankl = ls_bank_in-bankl.               "Bank Key
    ls_bankdetails_cmd-data_key-bankn = ls_bank_in-bankn.               "Bank Account Number

    IF ls_bank_in-bkref IS NOT INITIAL.
      ls_bankdetails_cmd-data-bkref  = ls_bank_in-bkref.                "Reference Details for Bank Details
      ls_bankdetails_cmd-datax-bkref = abap_true.
    ENDIF.

    IF ls_bank_in-koinh IS NOT INITIAL.
      ls_bankdetails_cmd-data-koinh  = ls_bank_in-koinh.                "Account Holder Name
      ls_bankdetails_cmd-datax-koinh = abap_true.
    ENDIF.

    APPEND ls_bankdetails_cmd TO lt_bankdetails_cmd.
    CLEAR ls_bankdetails_cmd.
  ENDLOOP.

  ls_bankdetail_cmd-bankdetails  = lt_bankdetails_cmd.

  ls_central_data_cmd-bankdetail = ls_bankdetail_cmd.

**********************************************************************
* Customer Company code part
**********************************************************************
  IF lt_company_cus_in IS NOT INITIAL.
*   Get exists company code data
    SELECT kunnr,
           bukrs
      INTO TABLE @DATA(lt_knb1)
      FROM knb1
       FOR ALL ENTRIES IN @lt_company_cus_in
     WHERE kunnr = @ls_bpdata_in-partner
       AND bukrs = @lt_company_cus_in-bukrsk.

    SORT lt_knb1 BY kunnr ASCENDING
                    bukrs ASCENDING.

    LOOP AT lt_company_cus_in INTO DATA(ls_company_cus_in).
      READ TABLE lt_knb1 TRANSPORTING NO FIELDS
        WITH KEY bukrs = ls_company_cus_in-bukrsk BINARY SEARCH.
      IF sy-subrc = 0.
        ls_company_cmd-task = lc_task_u.
      ELSE.
        ls_company_cmd-task = lc_task_i.
      ENDIF.

      ls_company_cmd-data_key-bukrs = ls_company_cus_in-bukrsk.         "Company code

      IF ls_company_cus_in-akontk IS NOT INITIAL.
        ls_company_cmd-data-akont  = ls_company_cus_in-akontk.          "Reconciliation Account in General Ledger
        ls_company_cmd-datax-akont = abap_true.
      ENDIF.

      IF ls_company_cus_in-zuawak IS NOT INITIAL.
        ls_company_cmd-data-zuawa  = ls_company_cus_in-zuawak.          "Key for sorting according to assignment numbers
        ls_company_cmd-datax-zuawa = abap_true.
      ENDIF.

      IF ls_company_cus_in-ztermk IS NOT INITIAL.
        ls_company_cmd-data-zterm  = ls_company_cus_in-ztermk.          "Terms of payment key
        ls_company_cmd-datax-zterm = abap_true.
      ENDIF.

      IF ls_company_cus_in-zwelsk IS NOT INITIAL.
        ls_company_cmd-data-zwels  = ls_company_cus_in-zwelsk.          "List of Respected Payment Methods
        ls_company_cmd-datax-zwels = abap_true.
      ENDIF.

      IF ls_company_cus_in-altknk IS NOT INITIAL.
        ls_company_cmd-data-altkn  = ls_company_cus_in-altknk.          "Previous Master Record Number
        ls_company_cmd-datax-altkn = abap_true.
      ENDIF.

      IF ls_company_cus_in-sperrk IS NOT INITIAL.
        IF ls_company_cus_in-sperrk = lc_na.
          ls_company_cmd-data-sperr  = space.                           "Posting block for company code
          ls_company_cmd-datax-sperr = abap_true.
        ELSE.
          ls_company_cmd-data-sperr  = ls_company_cus_in-sperrk.        "Posting block for company code
          ls_company_cmd-datax-sperr = abap_true.
        ENDIF.
      ENDIF.

      IF ls_company_cus_in-togru IS NOT INITIAL.
        ls_company_cmd-data-togru  = ls_company_cus_in-togru.           "Tolerance Group in Invoice Verification
        ls_company_cmd-datax-togru = abap_true.
      ENDIF.

      IF ls_company_cus_in-loevmk IS NOT INITIAL.
        IF ls_company_cus_in-loevmk = lc_na.
          ls_company_cmd-data-loevm  = space.                           "Deletion Flag for Master Record (Company Code Level)
          ls_company_cmd-datax-loevm = abap_true.
        ELSE.
          ls_company_cmd-data-loevm  = ls_company_cus_in-loevmk.        "Deletion Flag for Master Record (Company Code Level)
          ls_company_cmd-datax-loevm = abap_true.
        ENDIF.
      ENDIF.

      APPEND ls_company_cmd TO lt_company_cmd.
      CLEAR ls_company_cmd.
    ENDLOOP.

    ls_company_data_cmd-company = lt_company_cmd.
  ENDIF.

**********************************************************************
* Customer Sales data part
**********************************************************************
  IF lt_sales_in IS NOT INITIAL.
*   Get exists sales org data
    SELECT kunnr,
           vkorg,
           vtweg,
           spart
      INTO TABLE @DATA(lt_knvv)
      FROM knvv
       FOR ALL ENTRIES IN @lt_sales_in
     WHERE kunnr = @ls_bpdata_in-partner
       AND vkorg = @lt_sales_in-vkorg
       AND vtweg = @lt_sales_in-vtweg
       AND spart = @lt_sales_in-spart.

*   Get exists tax data
    SELECT kunnr,
           aland,
           tatyp,
           taxkd
      INTO TABLE @DATA(lt_knvi)
      FROM knvi
     WHERE kunnr = @ls_bpdata_in-partner.

    SORT lt_knvv BY kunnr ASCENDING
                    vkorg ASCENDING
                    vtweg ASCENDING
                    spart ASCENDING.
    SORT lt_knvi BY kunnr ASCENDING
                    aland ASCENDING
                    tatyp ASCENDING
                    taxkd ASCENDING.

    LOOP AT lt_sales_in INTO DATA(ls_sales_in).
      READ TABLE lt_knvv TRANSPORTING NO FIELDS
        WITH KEY vkorg = ls_sales_in-vkorg
                 vtweg = ls_sales_in-vtweg
                 spart = ls_sales_in-spart
                 BINARY SEARCH.
      IF sy-subrc = 0.
        ls_sales_cmd-task = lc_task_u.
      ELSE.
        ls_sales_cmd-task = lc_task_i.
      ENDIF.

      ls_sales_cmd-data_key-vkorg = ls_sales_in-vkorg.                  "Sales Organization
      ls_sales_cmd-data_key-vtweg = ls_sales_in-vtweg.                  "Distribution Channel
      ls_sales_cmd-data_key-spart = ls_sales_in-spart.                  "Division

      IF ls_sales_in-bzirk IS NOT INITIAL.
        ls_sales_cmd-data-bzirk  = ls_sales_in-bzirk.                   "Sales District
        ls_sales_cmd-datax-bzirk = abap_true.
      ENDIF.

      IF ls_sales_in-kalks IS NOT INITIAL.
        ls_sales_cmd-data-kalks  = ls_sales_in-kalks.                   "Customer Classification for Pricing Procedure Determination
        ls_sales_cmd-datax-kalks = abap_true.
      ENDIF.

      IF ls_sales_in-versg IS NOT INITIAL.
        ls_sales_cmd-data-versg  = ls_sales_in-versg.                   "Customer Statistics Group
        ls_sales_cmd-datax-versg = abap_true.
      ENDIF.

      IF ls_sales_in-vsbedv IS NOT INITIAL.
        ls_sales_cmd-data-vsbed  = ls_sales_in-vsbedv.                  "Shipping Conditions
        ls_sales_cmd-datax-vsbed = abap_true.
      ENDIF.

      IF ls_sales_in-ktgrd IS NOT INITIAL.
        ls_sales_cmd-data-ktgrd  = ls_sales_in-ktgrd.                   "Account Assignment Group for this customer
        ls_sales_cmd-datax-ktgrd = abap_true.
      ENDIF.

      IF ls_sales_in-vkbur IS NOT INITIAL.
        ls_sales_cmd-data-vkbur  = ls_sales_in-vkbur.                   "Sales office
        ls_sales_cmd-datax-vkbur = abap_true.
      ENDIF.

      IF ls_sales_in-vkgrp IS NOT INITIAL.
        ls_sales_cmd-data-vkgrp  = ls_sales_in-vkgrp.                   "Sales group
        ls_sales_cmd-datax-vkgrp = abap_true.
      ENDIF.

      IF ls_sales_in-kdgrp IS NOT INITIAL.
        ls_sales_cmd-data-kdgrp  = ls_sales_in-kdgrp.                   "Customer Group
        ls_sales_cmd-datax-kdgrp = abap_true.
      ENDIF.

      IF ls_sales_in-konda IS NOT INITIAL.
        ls_sales_cmd-data-konda  = ls_sales_in-konda.                   "Customer Price Group
        ls_sales_cmd-datax-konda = abap_true.
      ENDIF.

      IF ls_sales_in-kkber IS NOT INITIAL.
        ls_sales_cmd-data-kkber  = ls_sales_in-kkber.                   "Credit control area
        ls_sales_cmd-datax-kkber = abap_true.
      ENDIF.

      IF ls_sales_in-kvgr1 IS NOT INITIAL.
        ls_sales_cmd-data-kvgr1  = ls_sales_in-kvgr1.                   "Customer group 1
        ls_sales_cmd-datax-kvgr1 = abap_true.
      ENDIF.

      IF ls_sales_in-vwerk IS NOT INITIAL.
        ls_sales_cmd-data-vwerk  = ls_sales_in-vwerk.                   "Delivering Plant (Own or External)
        ls_sales_cmd-datax-vwerk = abap_true.
      ENDIF.

      IF ls_sales_in-ztermk_s IS NOT INITIAL.
        ls_sales_cmd-data-zterm  = ls_sales_in-ztermk_s.                "Terms of payment key
        ls_sales_cmd-datax-zterm = abap_true.
      ENDIF.

      IF ls_sales_in-waersk IS NOT INITIAL.
        ls_sales_cmd-data-waers  = ls_sales_in-waersk.                  "Currency
        ls_sales_cmd-datax-waers = abap_true.
      ENDIF.

      IF ls_sales_in-loevmk_s IS NOT INITIAL.
        IF ls_sales_in-loevmk_s = lc_na.
          ls_sales_cmd-data-loevm  = space.                             "Deletion flag for customer (sales level)
          ls_sales_cmd-datax-loevm = abap_true.
        ELSE.
          ls_sales_cmd-data-loevm  = ls_sales_in-loevmk_s.              "Deletion flag for customer (sales level)
          ls_sales_cmd-datax-loevm = abap_true.
        ENDIF.
      ENDIF.

      IF ls_sales_in-aufsdk IS NOT INITIAL.
        ls_sales_cmd-data-aufsd  = ls_sales_in-aufsdk.                  "Customer order block (sales area)
        ls_sales_cmd-datax-aufsd = abap_true.
      ENDIF.

      IF ls_sales_in-lifsdk IS NOT INITIAL.
        ls_sales_cmd-data-lifsd  = ls_sales_in-lifsdk.                  "Customer delivery block (sales area)
        ls_sales_cmd-datax-lifsd = abap_true.
      ENDIF.

      IF ls_sales_in-faksdk IS NOT INITIAL.
        ls_sales_cmd-data-faksd  = ls_sales_in-faksdk.                  "Billing block for customer (sales and distribution)
        ls_sales_cmd-datax-faksd = abap_true.
      ENDIF.

      IF ls_sales_in-inco1k IS NOT INITIAL.
        ls_sales_cmd-data-inco1  = ls_sales_in-inco1k.                  "Incoterms (Part 1)
        ls_sales_cmd-datax-inco1 = abap_true.
      ENDIF.

      IF ls_sales_in-inco2_lk IS NOT INITIAL.
        ls_sales_cmd-data-inco2_l  = ls_sales_in-inco2_lk.              "Incoterms Location 1
        ls_sales_cmd-datax-inco2_l = abap_true.
      ENDIF.

      IF ls_sales_in-kzazu IS NOT INITIAL.
        IF ls_sales_in-kzazu = lc_na.
          ls_sales_cmd-data-kzazu  = space.                             "Order Combination Indicator
          ls_sales_cmd-datax-kzazu = abap_true.
        ELSE.
          ls_sales_cmd-data-kzazu  = ls_sales_in-kzazu.                 "Order Combination Indicator
          ls_sales_cmd-datax-kzazu = abap_true.
        ENDIF.
      ENDIF.

      IF ls_sales_cmd-task = lc_task_i.
        ls_functions_cmd-task = lc_task_m.

*       Sold-to party
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_sp
          IMPORTING
            output = ls_functions_cmd-data_key-parvw.

        APPEND ls_functions_cmd TO lt_functions_cmd.

*       Bill-to party
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_bp
          IMPORTING
            output = ls_functions_cmd-data_key-parvw.

        APPEND ls_functions_cmd TO lt_functions_cmd.

*       Payer
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_py
          IMPORTING
            output = ls_functions_cmd-data_key-parvw.

        APPEND ls_functions_cmd TO lt_functions_cmd.

*       Ship-to party
        CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
          EXPORTING
            input  = lc_parvw_sh
          IMPORTING
            output = ls_functions_cmd-data_key-parvw.

        APPEND ls_functions_cmd TO lt_functions_cmd.
        CLEAR ls_functions_cmd.

        ls_function_cmd-functions = lt_functions_cmd.

        ls_sales_cmd-functions = ls_function_cmd.
      ENDIF.

      APPEND ls_sales_cmd TO lt_sales_cmd.
      CLEAR ls_sales_cmd.

      IF ls_sales_in-tatyp IS NOT INITIAL AND
         ls_sales_in-taxkd IS NOT INITIAL AND
         ls_sales_in-aland IS NOT INITIAL.

        READ TABLE lt_knvi INTO DATA(ls_knvi)
          WITH KEY aland = ls_sales_in-aland
                   tatyp = ls_sales_in-tatyp
                   BINARY SEARCH.
        IF sy-subrc <> 0.
          ls_tax_ids_cmd-task = lc_task_i.
        ELSE.
          ls_tax_ids_cmd-task = lc_task_u.
        ENDIF.

        ls_tax_ids_cmd-data_key-aland = ls_sales_in-aland.              "Departure country (country from which the goods are sent)
        ls_tax_ids_cmd-data_key-tatyp = ls_sales_in-tatyp.              "Tax category (sales tax, federal sales tax,...)

        ls_tax_ids_cmd-data-taxkd  = ls_sales_in-taxkd.                 "Tax classification for customer
        ls_tax_ids_cmd-datax-taxkd = abap_true.

        APPEND ls_tax_ids_cmd TO lt_tax_ids_cmd.
        CLEAR ls_tax_ids_cmd.
      ENDIF.
    ENDLOOP.

    ls_sales_data_cmd-sales     = lt_sales_cmd.

    ls_tax_id_cmd-tax_ind       = lt_tax_ids_cmd.
    ls_central_data_cmd-tax_ind = ls_tax_id_cmd.
  ENDIF.

**********************************************************************
* Collect all data
**********************************************************************
  ls_partner-header           = ls_header.
  ls_partner-central_data     = ls_central_data.

  ls_vendor-header            = ls_header_vmd.
  ls_vendor-central_data      = ls_central_data_vmd.
  ls_vendor-company_data      = ls_company_data_vmd.
  ls_vendor-purchasing_data   = ls_purchasing_data_vmd.

  ls_customer-header          = ls_header_cmd.
  ls_customer-central_data    = ls_central_data_cmd.
  ls_customer-company_data    = ls_company_data_cmd.
  ls_customer-sales_data      = ls_sales_data_cmd.

  ls_data-partner             = ls_partner.
  ls_data-vendor              = ls_vendor.
  ls_data-customer            = ls_customer.

  APPEND ls_data TO lt_data.

* Call bapi maintain business partners
  CALL FUNCTION 'CVI_EI_INBOUND_MAIN'
    EXPORTING
      i_data   = lt_data
    IMPORTING
      e_return = lt_return.

  LOOP AT lt_return INTO ls_return.
    LOOP AT ls_return-object_msg INTO DATA(ls_return_detail) WHERE type CA lc_err_type.
      cs_resp-msgty = gc_msgty_e.
      CONCATENATE cs_resp-msgtx ls_return_detail-message INTO cs_resp-msgtx.
    ENDLOOP.
  ENDLOOP.

  IF cs_resp-msgtx IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.

    lv_guid_32 = lv_partner_guid.

*   Get business partner number
    CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS'
      EXPORTING
        businesspartnerguid = lv_guid_32
      IMPORTING
        businesspartnerout  = lv_partnerno.

    cs_resp-msgty = gc_msgty_s.

*   Changes have been saved.
    MESSAGE s131(bupa_dialog_joel) INTO cs_resp-msgtx.
    cs_resp-msgtx  = lv_partnerno && lc_colon && cs_resp-msgtx.
    cs_resp-sapnum = lv_partnerno.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.
ENDFORM.

以上。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值