ABAP-客户主数据创建

ABAP-客户主数据创建

使用cl_md_bp_maintain=>maintain创建

下面直接进入正文

FUNCTION zbpm_isp004.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(INPUT) TYPE  ZSBPM_ISP004_INPUT
*"  EXPORTING
*"     VALUE(OUTPUT) TYPE  ZSBPM_ISP004_OUTPUT
*"----------------------------------------------------------------------

  DATA:
    lv_msg    TYPE bapi_msg.

* 晴空消息字段
  CLEAR: lv_msg.

* 判断必输项:BPM流程编号
  IF input-is_bpmbh-zbpmbh IS INITIAL.
    output-return-msgty = 'E'.
    output-return-msgtx = 'BPM流程编号必输'.
    RETURN.
  ENDIF.

* 判断必输项:提交人
  IF input-is_bpmbh-ztjr IS INITIAL.
    output-return-msgty = 'E'.
    output-return-msgtx = '提交人必输'.
    RETURN.
  ENDIF.

* 判断必输项:提交日期
  IF input-is_bpmbh-ztjdate IS INITIAL.
    output-return-msgty = 'E'.
    output-return-msgtx = '提交日期必输'.
    RETURN.
  ENDIF.

* 判断必输项:提交时间
  IF input-is_bpmbh-ztjtime IS INITIAL.
    output-return-msgty = 'E'.
    output-return-msgtx = '提交时间必输'.
    RETURN.
  ENDIF.

* 判断必输项:创建/修改/冻结标识
  IF input-is_bpmbh-zbs IS INITIAL.
    output-return-msgty = 'E'.
    output-return-msgtx = '创建/修改/冻结标识必输'.
    RETURN.
  ENDIF.

* 判断必输项:客户编码
* ZBS字段传入MB时,需要必填
  IF input-is_kna1-partner IS INITIAL AND ( input-is_bpmbh-zbs = 'M' OR input-is_bpmbh-zbs = 'B' ) .
    output-return-msgty = 'E'.
    output-return-msgtx = '客户编码必输'.
    RETURN.
  ENDIF.

* 判断必输项:客商名称1
  IF input-is_kna1-name_org1 IS INITIAL.
    output-return-msgty = 'E'.
    output-return-msgtx = '客商名称1必输'.
    RETURN.
  ENDIF.

* 判断必输项:银行标识
  LOOP AT input-it_knbk INTO DATA(ls_knbk).
    IF ls_knbk-bkvid IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '银行标识必输'.
      RETURN.
    ENDIF.
  ENDLOOP.

* 判断必输项:销售组织
  LOOP AT input-it_knvv INTO DATA(ls_knvv).
    IF ls_knvv-vkorg IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '销售组织必输'.
      RETURN.
    ENDIF.
*   判断必输项:分销渠道
    IF ls_knvv-vtweg IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '分销渠道必输'.
      RETURN.
    ENDIF.
  ENDLOOP.

  LOOP AT input-it_knvp INTO DATA(ls_knvp).
    IF ls_knvp-vkorg IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '销售组织必输'.
      RETURN.
    ENDIF.
*   判断必输项:分销渠道
    IF ls_knvp-vtweg IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '分销渠道必输'.
      RETURN.
    ENDIF.
  ENDLOOP.

* 判断必输项:公司代码
  LOOP AT input-it_knb1 INTO DATA(ls_knb1).
    IF ls_knb1-bukrs IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '公司代码必输'.
      RETURN.
    ENDIF.
* 判断必输项:总账科目
    IF ls_knb1-akont IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '总账科目必输'.
      RETURN.
    ENDIF.
* 判断必输项:付款条件
    IF ls_knb1-zterm IS INITIAL.
      output-return-msgty = 'E'.
      output-return-msgtx = '付款条件必输'.
      RETURN.
    ENDIF.
  ENDLOOP.

* 判断 创建/修改/冻结标识
* 判断DFKKBPTAXNUM-TAXNUMXL是否=传入的TAXNUMXL
* 若已存在值则在该账号下拓展客户数据,即I变为M
*  IF input-is_kna1-taxnumxl IS NOT INITIAL.
*    input-is_bpmbh-zbs = 'M'.
*  ELSE.
*    input-is_bpmbh-zbs = 'I'.
*  ENDIF.

*------------------------------ 固定值 ------------------------------*
  input-is_kna1-type  = '2'.                                 "客户类型
  input-is_kna1-spras = '1'.                                 "语言

* 创建客户主数据基本数据
  DATA: lv_guid TYPE guid_16,
        lv_text TYPE string.

  DATA: lt_data    TYPE cvis_ei_extern_t,
        ls_data    TYPE cvis_ei_extern,
        ls_paadr   TYPE bus_ei_bupa_address,
        ls_mail    TYPE bus_ei_bupa_smtp,
        lt_mail    TYPE bus_ei_bupa_smtp_t,
        ls_fax     TYPE bus_ei_bupa_fax,
        lt_fax     TYPE bus_ei_bupa_fax_t,
        ls_phone   TYPE bus_ei_bupa_telephone,
        lt_phone   TYPE bus_ei_bupa_telephone_t,
        ls_bank    TYPE bus_ei_bupa_bankdetail,
        ls_sales   TYPE cmds_ei_sales,
        ls_tax     TYPE cmds_ei_tax_ind,
        lt_tax     TYPE cmds_ei_tax_ind_t,
        ls_company TYPE cmds_ei_company.
  DATA:
    lt_roles        TYPE bus_ei_bupa_roles_t,
    ls_roles        TYPE bus_ei_bupa_roles,
    ls_bank_address TYPE bapi1011_address,
    ls_bank_return  TYPE bapiret2,
    ls_functions_s  TYPE cmds_ei_functions,
    ls_functions_t  TYPE cmds_ei_functions_t,
    lt_return_map   TYPE mdg_bs_bp_msgmap_t,
    lt_return       TYPE bapiretm,
    lt_return_tax   TYPE TABLE OF bapiret2 WITH HEADER LINE,
    ls_addressusage TYPE bus_ei_bupa_addressusage,
    lt_addressusage TYPE bus_ei_bupa_addressusage_t.
* 创建
  IF input-is_bpmbh-zbs = 'I'.
    TRY.
        CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_x16
          RECEIVING
            uuid = lv_guid.
      CATCH cx_uuid_error .
    ENDTRY.
  ENDIF.

* Create customer
  IF input-is_bpmbh-zbs = 'I'.
    ls_data-partner-header-object_task = 'I'.               "创建/修改/冻结标识
  ELSEIF input-is_bpmbh-zbs = 'M'.
    ls_data-partner-header-object_task = 'M'.               "创建/修改/冻结标识
  ENDIF.

  ls_data-partner-header-object_instance-bpartner     = input-is_kna1-partner.            "业务伙伴编号
  ls_data-partner-header-object_instance-bpartnerguid = lv_guid.                          "BAPI 的 CHAR 32 格式业务伙伴地址的全局唯一标识符

*--- Partner / Central data / common ------------------------------*
  ls_data-partner-central_data-common-data-bp_control-category = input-is_kna1-type.      "业务伙伴类别
  ls_data-partner-central_data-common-data-bp_control-grouping = input-is_kna1-bu_group.  "业务伙伴分组

* 业务伙伴角色 [若传入的BU_GROUP=Z005和Z006,默认角色ZFLCU0和ZFLCU1,其他的默认角色ZFLCU0、ZFLCU1和ZUKM00]
  ls_roles-data_key = 'ZFLCU0'.   "角色
  APPEND ls_roles TO lt_roles.

  ls_roles-data_key = 'ZFLCU1'.   "角色
  APPEND ls_roles TO lt_roles.

  IF input-is_kna1-bu_group = 'Z005' OR input-is_kna1-bu_group = 'Z006'.
  ELSE.
    ls_roles-data_key = 'ZUKM00'.   "角色
    APPEND ls_roles TO lt_roles.
  ENDIF.

  ls_data-partner-central_data-role-roles = lt_roles.       "外部接口:角色数据

  ls_data-partner-central_data-common-data-bp_centraldata-title_key   = input-is_kna1-title.        "称谓代码
  ls_data-partner-central_data-common-data-bp_centraldata-searchterm1 = input-is_kna1-bu_sort1.     "客商简称
  ls_data-partner-central_data-common-data-bp_centraldata-searchterm2 = input-is_kna1-bu_sort2.     "原系统编号

  ls_data-partner-central_data-common-datax-bp_centraldata-title_key   = abap_true.
  ls_data-partner-central_data-common-datax-bp_centraldata-searchterm1 = abap_true.
  ls_data-partner-central_data-common-datax-bp_centraldata-searchterm2 = abap_true.

* 若客商名称1字段值的长度超40位字符,超40位的部分写入客商名称2字段
  ls_data-partner-central_data-common-data-bp_organization-name1  = input-is_kna1-name_org1+0(40).  "客商名称1
  ls_data-partner-central_data-common-data-bp_organization-name2  = input-is_kna1-name_org1+40(40). "客商名称12

  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 -----------------------------*
  IF input-is_bpmbh-zbs = 'I'.
    ls_paadr-task = 'I'.               "创建/修改/冻结标识
  ELSEIF input-is_bpmbh-zbs = 'M'.
    ls_paadr-task = 'U'.               "创建/修改/冻结标识
  ENDIF.

  ls_paadr-data_key-operation           = 'XXDFLT'.                         "默认:XXDFLT/标准
  ls_paadr-data-postal-data-langu       = input-is_kna1-spras.              "语言代码
  ls_paadr-data-postal-data-country     = input-is_kna1-country.            "客商注册国家
  ls_paadr-data-postal-data-region      = input-is_kna1-region.             "地区(省/自治区/直辖市、市、县)
  ls_paadr-data-postal-data-city        = input-is_kna1-city1.              "客商注册城市
  ls_paadr-data-postal-data-street      = input-is_kna1-kh_street+0(40).    "客商地址
  ls_paadr-data-postal-data-str_suppl1  = input-is_kna1-kh_street+40(40).   "客商地址
  ls_paadr-data-postal-data-c_o_name    = input-is_kna1-name_co.            "联系人
  ls_paadr-data-postal-data-postl_cod1  = input-is_kna1-post_code1.         "客商邮编

  ls_paadr-data-postal-datax-langu       = abap_true.
  ls_paadr-data-postal-datax-country     = abap_true.
  ls_paadr-data-postal-datax-region      = abap_true.
  ls_paadr-data-postal-datax-city        = abap_true.
  ls_paadr-data-postal-datax-street      = abap_true.
  ls_paadr-data-postal-datax-str_suppl1  = abap_true.
  ls_paadr-data-postal-datax-c_o_name    = abap_true.
  ls_paadr-data-postal-datax-postl_cod1  = abap_true.

  "电子邮件
  IF input-is_kna1-smtp_addr IS NOT INITIAL .
    IF input-is_bpmbh-zbs = 'I'.
      ls_mail-contact-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_mail-contact-task = 'U'.               "创建/修改/冻结标识
    ENDIF.

    ls_mail-contact-data-e_mail = input-is_kna1-smtp_addr.
    ls_mail-contact-datax-e_mail = 'X'.
    APPEND ls_mail TO lt_mail.
    ls_paadr-data-communication-smtp-smtp = lt_mail.
  ENDIF.

  "微信/传真
  IF input-is_kna1-fax_number IS NOT INITIAL .
    IF input-is_bpmbh-zbs = 'I'.
      ls_fax-contact-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_fax-contact-task = 'U'.               "创建/修改/冻结标识
    ENDIF.

    ls_fax-contact-data-country = input-is_kna1-country.
    ls_fax-contact-data-fax = input-is_kna1-fax_number.
    ls_fax-contact-datax-country = 'X'.
    ls_fax-contact-datax-fax = 'X'.
    APPEND ls_fax TO lt_fax.
    ls_paadr-data-communication-fax-fax = lt_fax.
  ENDIF.

  " Communication
  "移动电话
  IF input-is_kna1-telf1 IS NOT INITIAL.
    IF input-is_bpmbh-zbs = 'I'.
      ls_phone-contact-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_phone-contact-task = 'U'.               "创建/修改/冻结标识
    ENDIF.

    ls_phone-contact-data-country = input-is_kna1-country.
    ls_phone-contact-data-telephone = input-is_kna1-telf2.
    ls_phone-contact-datax-country = 'X'.
    ls_phone-contact-datax-telephone = 'X'.
    APPEND ls_phone TO lt_phone.
    ls_paadr-data-communication-phone-phone = lt_phone.
  ENDIF.

  "whatapp/电话
  IF input-is_kna1-telf2 IS NOT INITIAL.
    ls_phone-contact-data-country = input-is_kna1-country.
    ls_phone-contact-data-r_3_user  = '2'.                  "标识符:电话是移动电话
    ls_phone-contact-data-telephone = input-is_kna1-telf1.
    ls_phone-contact-datax-country = 'X'.
    ls_phone-contact-datax-telephone = 'X'.
    APPEND ls_phone TO lt_phone.
    ls_paadr-data-communication-phone-phone = lt_phone.
  ENDIF.

  APPEND ls_paadr TO ls_data-partner-central_data-address-addresses.
  CLEAR: ls_paadr , lt_phone , lt_fax , lt_mail.

*--- Partner / Customer data / Address -----------------------------*
  ls_data-customer-central_data-central-data-kukla = input-is_kna1-kukla.

*--- Partner / Central data / Address ------------------------------*
  IF input-is_bpmbh-zbs = 'I'.
    ls_paadr-task = 'I'.               "创建/修改/冻结标识
  ELSEIF input-is_bpmbh-zbs = 'M'.
    ls_paadr-task = 'U'.               "创建/修改/冻结标识
  ENDIF.

  ls_paadr-data_key-operation           = 'BBP004'.                         "BBP004/开票地址
  ls_paadr-data-postal-data-langu       = input-is_kna1-kp_spras.           "语言代码
  ls_paadr-data-postal-data-country     = input-is_kna1-kp_country.         "客商注册国家
  ls_paadr-data-postal-data-region      = input-is_kna1-kp_region.          "地区(省/自治区/直辖市、市、县)
  ls_paadr-data-postal-data-city        = input-is_kna1-kp_city1.           "客商注册城市
  ls_paadr-data-postal-data-street      = input-is_kna1-kp_street+0(40).    "开票地址
  ls_paadr-data-postal-data-str_suppl1  = input-is_kna1-kp_street+40(40).   "开票地址

  ls_paadr-data-postal-datax-langu       = abap_true.
  ls_paadr-data-postal-datax-country     = abap_true.
  ls_paadr-data-postal-datax-region      = abap_true.
  ls_paadr-data-postal-datax-city        = abap_true.
  ls_paadr-data-postal-datax-street      = abap_true.
  ls_paadr-data-postal-datax-str_suppl1  = abap_true.
  ls_paadr-data-postal-datax-postl_cod1  = abap_true.

  ls_addressusage-task = 'I'.
  ls_addressusage-data_key-addresstype = 'BILL_TO'.
  APPEND ls_addressusage TO lt_addressusage.
  ls_paadr-data-addr_usage-current_state = 'X'.
  ls_paadr-data-addr_usage-addr_usages = lt_addressusage.

  "开票电话
  IF input-is_kna1-kp_tel_number IS NOT INITIAL .
    IF input-is_bpmbh-zbs = 'I'.
      ls_phone-contact-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_phone-contact-task = 'U'.               "创建/修改/冻结标识
    ENDIF.

    ls_phone-contact-data-country = input-is_kna1-kp_country.
    ls_phone-contact-data-r_3_user  = '2'.                  "标识符:电话是移动电话
    ls_phone-contact-data-telephone = input-is_kna1-kp_tel_number.
    ls_phone-contact-datax-country = 'X'.
    ls_phone-contact-datax-telephone = 'X'.
    APPEND ls_phone TO lt_phone.
    ls_paadr-data-communication-phone-phone = lt_phone.
  ENDIF.

  APPEND ls_paadr TO ls_data-partner-central_data-address-addresses.
  CLEAR: ls_paadr , ls_phone, lt_phone , ls_addressusage , lt_addressusage.

*--- Partner / Central data / Address ------------------------------*
  LOOP AT input-it_adrc INTO DATA(ls_adrc).
    IF input-is_bpmbh-zbs = 'I'.
      ls_paadr-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_paadr-task = 'U'.               "创建/修改/冻结标识
    ENDIF.

    ls_paadr-data_key-operation           = 'BBP003'.                   "BBP003/交货地址
    ls_paadr-data-postal-data-langu       = ls_adrc-sh_spras.           "语言代码
    ls_paadr-data-postal-data-country     = ls_adrc-sh_country.         "客商注册国家
    ls_paadr-data-postal-data-region      = ls_adrc-sh_region.          "地区(省/自治区/直辖市、市、县)
    ls_paadr-data-postal-data-city        = ls_adrc-sh_city1.           "客商注册城市
    ls_paadr-data-postal-data-street      = ls_adrc-sh_street+0(40).    "交货地址
    ls_paadr-data-postal-data-str_suppl1  = ls_adrc-sh_street+40(40).   "交货地址
    ls_paadr-data-postal-data-c_o_name    = ls_adrc-sh_name_co.         "收货联系人

    ls_paadr-data-postal-datax-langu       = abap_true.
    ls_paadr-data-postal-datax-country     = abap_true.
    ls_paadr-data-postal-datax-region      = abap_true.
    ls_paadr-data-postal-datax-city        = abap_true.
    ls_paadr-data-postal-datax-street      = abap_true.
    ls_paadr-data-postal-datax-str_suppl1  = abap_true.
    ls_paadr-data-postal-datax-c_o_name    = abap_true.
    ls_paadr-data-postal-datax-postl_cod1  = abap_true.

    ls_addressusage-task = 'I'.
    ls_addressusage-data_key-addresstype = 'SHIP_TO'.
    APPEND ls_addressusage TO lt_addressusage.
    ls_paadr-data-addr_usage-current_state = 'X'.
    ls_paadr-data-addr_usage-addr_usages = lt_addressusage.

    "联系人电话
    IF ls_adrc-sh_tel_number IS NOT INITIAL .
      IF input-is_bpmbh-zbs = 'I'.
        ls_phone-contact-task = 'I'.               "创建/修改/冻结标识
      ELSEIF input-is_bpmbh-zbs = 'M'.
        ls_phone-contact-task = 'U'.               "创建/修改/冻结标识
      ENDIF.

      ls_phone-contact-data-country = ls_adrc-sh_country.
      ls_phone-contact-data-r_3_user  = '2'.                  "标识符:电话是移动电话
      ls_phone-contact-data-telephone = ls_adrc-sh_tel_number.
      ls_phone-contact-datax-country = 'X'.
      ls_phone-contact-datax-telephone = 'X'.
      APPEND ls_phone TO lt_phone.
      ls_paadr-data-communication-phone-phone = lt_phone.

    ENDIF.

    APPEND ls_paadr TO ls_data-partner-central_data-address-addresses.
    CLEAR: ls_phone , lt_phone .
  ENDLOOP.

*----------------- PARTNER / CENTRAL DATA / BANK -----------------*
* 银行数据
  LOOP AT input-it_knbk INTO ls_knbk.
*   查找银行主数据,若不存在,则先创建银行
    SELECT SINGLE * FROM bnka
      INTO @DATA(ls_bnka)
            WHERE banks = @ls_knbk-banks
            AND banka = @ls_knbk-bankl
            AND loevm = ''.
    IF sy-subrc <> 0.
      ls_bank_address-bank_name = ls_knbk-accname.  "银行名称

      CALL FUNCTION 'BAPI_BANK_CREATE'
        EXPORTING
          bank_ctry    = ls_knbk-banks
          bank_key     = ls_knbk-bankl
          bank_address = ls_bank_address
          i_xupdate    = 'X'
        IMPORTING
          return       = ls_bank_return
          bankkey      = ls_bnka-bankl.
      IF ls_bnka-bankl IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        lv_msg = '银行主数据创建失败:' && ls_bank_return-message.
        CONTINUE.
      ENDIF.
    ENDIF.

    IF input-is_bpmbh-zbs = 'I'.
      ls_bank-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_bank-task = 'U'.               "创建/修改/冻结标识
    ENDIF.
    ls_bank-data_key             = ls_knbk-bkvid.                "银行标识
    ls_bank-data-bank_ctry       = ls_knbk-banks.                "银行国家
    ls_bank-data-bank_key        = ls_knbk-bankl.                "银行代码
    ls_bank-data-bank_acct       = ls_knbk-account+0(18).        "银行账号
    ls_bank-data-bank_ref        = ls_knbk-account+18(20).       "银行细目的参考明细
    ls_bank-data-accountholder   = ls_knbk-koinh.                "账户持有人
    ls_bank-data-bankaccountname = ls_knbk-accname.              "账户名称

    ls_bank-datax-bank_ctry       = abap_true.
    ls_bank-datax-bank_key        = abap_true.
    ls_bank-datax-bank_acct       = abap_true.
    ls_bank-datax-bank_ref        = abap_true.
    ls_bank-datax-accountholder   = abap_true.
    ls_bank-datax-bankaccountname = abap_true.

    APPEND ls_bank TO ls_data-partner-central_data-bankdetail-bankdetails.
    ls_data-partner-central_data-bankdetail-current_state = abap_true.

  ENDLOOP.

*--------------- Customer / Company data -------------------------*
  LOOP AT input-it_knb1 INTO ls_knb1.
    IF line_exists( ls_data-customer-company_data-company[ data_key-bukrs = ls_knb1-bukrs ] ).
      CONTINUE.
    ENDIF.

    IF input-is_bpmbh-zbs = 'I'.
      ls_company-task = 'I'.               "创建/修改/冻结标识
    ELSEIF input-is_bpmbh-zbs = 'M'.
      ls_company-task = 'U'.               "创建/修改/冻结标识
    ENDIF.

    ls_company-data_key-bukrs   = ls_knb1-bukrs.       " company code
    ls_company-data-zterm       = ls_knb1-zterm.       " terms of payment
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = ls_knb1-akont
      IMPORTING
        output = ls_company-data-akont.

    ls_company-datax-zterm = 'X'.
    ls_company-datax-akont = 'X'.

    APPEND ls_company TO ls_data-customer-company_data-company.
    CLEAR: ls_company.

  ENDLOOP.

**---------------SALES ORG AND DIST & DIVISION MANDATORY FIELDS-----*
  LOOP AT input-it_knvv INTO ls_knvv.
    SELECT COUNT(*) FROM knvv WHERE kunnr = input-is_kna1-partner
      AND vkorg = ls_knvv-vkorg AND vtweg = ls_knvv-vtweg AND spart = ls_knvv-spart.
    IF sy-subrc <> 0.
      ls_sales-task = 'I'.
    ELSE.
      ls_sales-task = 'U'.
    ENDIF.

    ls_sales-data_key-vkorg = ls_knvv-vkorg.                "销售组织
    ls_sales-data_key-vtweg = ls_knvv-vtweg.                "分销渠道
    ls_sales-data_key-spart = '00'.                         "产品组:默认00

    ls_sales-data-vkbur     = ls_knvv-vkbur.                "销售部门
    ls_sales-data-vkgrp     = ls_knvv-vkgrp.                "销售组
    ls_sales-data-kdgrp     = ls_knvv-kdgrp.                "客户组
    ls_sales-data-waers     = ls_knvv-waers.                "货币
    ls_sales-data-zterm     = ls_knvv-zterm.                "付款条件代码
    ls_sales-data-ktgrd     = '01'.                         "客户科目分类:默认值01
    ls_sales-data-vwerk     = ls_knvv-vwerk.                "交货工厂
    ls_sales-data-vsbed     = ls_knvv-vsbed.                "装运条件
    ls_sales-data-konda     = ls_knvv-konda.                "发票类型
    ls_sales-data-kkber     = 'XQ00'.                          "用于定价过程确定的客户分类
    ls_sales-data-kalks     = '1'.                          "用于定价过程确定的客户分类
    IF input-is_bpmbh-zbs = 'B'.
      ls_sales-data-loevm     = 'X'.                         "客户的删除标记 (销售级别)
    ENDIF.

    ls_sales-datax-vkbur    = abap_true.                    "销售部门
    ls_sales-datax-vkgrp    = abap_true.                    "销售组
    ls_sales-datax-kdgrp    = abap_true.                    "客户组
    ls_sales-datax-waers    = abap_true.                    "货币
    ls_sales-datax-zterm    = abap_true.                    "付款条件代码
    ls_sales-datax-ktgrd    = abap_true.                    "客户科目分类:默认值01
    ls_sales-datax-vwerk    = abap_true.                    "交货工厂
    ls_sales-datax-vsbed    = abap_true.                    "装运条件
    ls_sales-datax-konda    = abap_true.                    "发票类型
    ls_sales-datax-kkber    = abap_true.                    "发票类型
    ls_sales-datax-kalks    = abap_true.                    "用于定价过程确定的客户分类
    IF input-is_bpmbh-zbs = 'B'.
      ls_sales-datax-loevm     = abap_true.                         "客户的删除标记 (销售级别)
    ENDIF.

**------------------- Business Partner Details -------------------*
    ls_functions_s-data_key-parvw = 'AG'.
    ls_functions_s-data-defpa = 'X'.
    ls_functions_s-datax-defpa = abap_true.
    APPEND ls_functions_s TO ls_functions_t.
    CLEAR: ls_functions_s.

    ls_functions_s-data_key-parvw = 'RE'.
    ls_functions_s-data-defpa = 'X'.
    ls_functions_s-datax-defpa = abap_true.
    APPEND ls_functions_s TO ls_functions_t.
    CLEAR: ls_functions_s.

    ls_functions_s-data_key-parvw = 'RG'.
    ls_functions_s-data-defpa = 'X'.
    ls_functions_s-datax-defpa = abap_true.
    APPEND ls_functions_s TO ls_functions_t.
    CLEAR: ls_functions_s.

    ls_functions_s-data_key-parvw = 'WE'.
    ls_functions_s-data-defpa = 'X'.
    ls_functions_s-datax-defpa = abap_true.
    APPEND ls_functions_s TO ls_functions_t.
    CLEAR: ls_functions_s.

**------------------- Business Partner Details -------------------*
    LOOP AT input-it_knvp INTO ls_knvp WHERE vkorg = ls_knvv-vkorg AND vtweg = ls_knvv-vtweg.
      ls_functions_s-data_key-parvw = ls_knvp-parvw.
      ls_functions_s-data-partner   = ls_knvp-kunn2.
      ls_functions_s-datax-partner = abap_true.
      APPEND ls_functions_s TO ls_functions_t.
      CLEAR: ls_functions_s.
    ENDLOOP.

    ls_sales-functions-functions = ls_functions_t.
    ls_sales-functions-current_state = 'X'.

    APPEND ls_sales TO ls_data-customer-sales_data-sales.


    CLEAR: ls_functions_t, lt_tax.
  ENDLOOP.
*--------------- Customer / TAX -------------------------*
  IF input-is_bpmbh-zbs = 'I'.
    ls_tax-task = 'I'.               "创建/修改/冻结标识
  ELSEIF input-is_bpmbh-zbs = 'M'.
    ls_tax-task = 'U'.               "创建/修改/冻结标识
  ENDIF.

  ls_tax-data_key-aland = input-is_kna1-country.          "启运国家
  ls_tax-data_key-tatyp = 'MWST'.                         "税类别(营业税,联邦营业税,...)
  ls_tax-data-taxkd     = input-is_kna1-taxkd.
  ls_tax-datax-taxkd = 'X'.
  APPEND ls_tax TO lt_tax.

  ls_data-customer-central_data-tax_ind-tax_ind = lt_tax.

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

**------------------Creating BP ----------------------------*
  IF lt_return_map IS INITIAL.

    CALL METHOD cl_md_bp_maintain=>maintain
      EXPORTING
        i_data   = lt_data
*       i_test_run = 'X'
      IMPORTING
        e_return = lt_return.

**------------------Commit BAPI ----------------------------*
    LOOP AT lt_return INTO DATA(ls_return).
      LOOP AT ls_return-object_msg INTO DATA(ls_retmsg) WHERE type CA 'EXA'.
        CLEAR: lv_text.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = ls_retmsg-id
            msgnr               = ls_retmsg-number
            msgv1               = ls_retmsg-message_v1
            msgv2               = ls_retmsg-message_v2
            msgv3               = ls_retmsg-message_v3
            msgv4               = ls_retmsg-message_v4
          IMPORTING
            message_text_output = lv_text.
        CONCATENATE output-item-ev_msg lv_text INTO output-item-ev_msg.
      ENDLOOP.
    ENDLOOP.

    IF lv_text IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      DO 10 TIMES.
        SELECT SINGLE partner INTO output-item-ev_partner
          FROM but000 WHERE partner_guid = lv_guid.
        IF sy-subrc = 0.
          EXIT.
        ELSE.
          WAIT UP TO 1 SECONDS.
        ENDIF.
      ENDDO.
    ENDIF.

    IF output-item-ev_partner IS NOT INITIAL .
      output-return-msgty = ' S.'.
      output-return-msgtx = ' 客户创建成功.'.
      output-item-ev_type = 'S'.
      output-item-ev_msg  = '客户创建成功'.
    ELSE.
      output-return-msgty = ' E.'.
      output-return-msgtx = ' 客户创建失败.'.
      output-item-ev_type = 'E'.
      RETURN.
    ENDIF.

    "ADD TAX
    IF input-is_kna1-taxnumxl IS NOT INITIAL.
      CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
        EXPORTING
          businesspartner = output-item-ev_partner
          taxtype         = input-is_kna1-taxtype
          taxnumber       = input-is_kna1-taxnumxl
        TABLES
          return          = lt_return_tax.

      CLEAR: lv_text.
      LOOP AT lt_return_tax WHERE type CA 'AXE'.
        CONCATENATE lv_text lt_return_tax-message INTO lv_text SEPARATED BY ','.
      ENDLOOP.
      IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        output-return-msgtx = output-return-msgtx && '税号添加失败:' && lv_text && '.'.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ENDIF.
    ENDIF.

  ELSE.
    LOOP AT lt_return_map INTO DATA(ls_return_map).
      CLEAR: lv_text.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = ls_return_map-id
          msgnr               = ls_return_map-number
          msgv1               = ls_return_map-message_v1
          msgv2               = ls_return_map-message_v2
          msgv3               = ls_return_map-message_v3
          msgv4               = ls_return_map-message_v4
        IMPORTING
          message_text_output = lv_text.
      CONCATENATE output-item-ev_msg lv_text INTO output-item-ev_msg.
    ENDLOOP.

    output-return-msgty = ' E.'.
    output-return-msgtx = ' 客户创建失败.'.
    output-item-ev_type = 'E'.

  ENDIF.
ENDFUNCTION.
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ABAP(Advanced Business Application Programming)是一种用于SAP系统开发的高级商务应用编程语言。在ABAP中,我们可以使用BDC(Batch Data Communication)技术来批量创建销售订单。 批量创建销售订单可以大大提高工作效率,为复杂的销售业务场景提供了便利。下面是一种基本的批量创建销售订单的方法: 1. 准备数据:首先,我们需要准备好销售订单的相关数据,包括客户号、物料号、数量、价格等信息。可以将这些数据存储在一个Excel表格或者文本文件中。 2. 编写ABAP程序:使用ABAP程序来读取准备好的数据文件,并通过BDC技术将数据批量导入到SAP系统中。ABAP程序可以根据具体的业务需求来编写,包括读取数据文件、验证数据的有效性、填写订单的各个字段、保存订单等操作。 3. 运行ABAP程序:将编写好的ABAP程序运行起来,程序将自动读取准备的数据文件,对数据进行处理,并批量创建销售订单。 4. 验证结果:创建完成后,我们可以通过SAP系统中的相应事务码(如VA03)来验证订单的正确性和完整性。可以逐个查看订单的详细信息,并确保数据导入的准确性。 需要注意的是,批量创建销售订单需要谨慎操作,确保准备的数据准确无误,并对ABAP程序进行充分的测试。批量导入数据时,可以设置一些验证规则和控制机制,以避免错误数据的导入。 总结来说,使用ABAP编程语言,我们可以编写程序实现批量创建销售订单的功能。这样可以提高工作效率,还可以适应复杂的销售业务需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值