SAP ABAP 客户主数据的 查询-创建-修改-锁定 API或BAPI


前言

采用BDC创建客商主数据复用性低,且时常发生错误,比如字段必输性调整造成报错等
现通过API或BAPI去查询,创建,修改,锁定
以下为实际做的一个RFC接口


范例代码

客户主数据创建查询修改锁定

FUNCTION zfm_pi_rfc_cust_mas.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IT_HEADER_INFO) TYPE  Z_PARTNER_H OPTIONAL
*"     VALUE(IT_BANK_INFO) TYPE  Z_BANK_INFO OPTIONAL
*"  EXPORTING
*"     VALUE(ET_RETURN_INFO) TYPE  Z_MAS_RETURN
*"----------------------------------------------------------------------

  DATA:ls_return      TYPE z_s_mas_return,
       ls_cus_mas     TYPE cmds_ei_main,
       ls_ei_main     TYPE cmds_ei_main,
       ls_customr     TYPE cmds_ei_extern,
       lv_test        TYPE xfeld,
       ls_error       TYPE cvis_message,
       lt_header_info TYPE z_partner_h,
       lt_header_n    TYPE z_partner_h,  "经营性客商数据
       lt_bank_info   TYPE z_bank_info,
       lt_bank        TYPE TABLE OF zzt_bnka,
       lt_bank_n      TYPE TABLE OF zzt_bnka, "经营性客商银行数据
       ls_bank_info   TYPE zzt_bnka,

*       lt_bapiret1    TYPE TABLE OF bapiret1 WITH HEADER LINE,
*       lt_bapiret1    TYPE TABLE OF bapiret1,
       ls_bapiret1    LIKE bapiret1,
       lv_cre_err     TYPE char1,
       ls_msg         TYPE bapiret2,
       lv_kunnr       TYPE kunnr,

       lt_brnch_d     TYPE TABLE OF fitha_brnch_t,
       ls_brnch_d     TYPE fitha_brnch_t,
       lt_brnch       TYPE TABLE OF fitha_brnch,
       ls_brnch       TYPE fitha_brnch,

       BEGIN OF ls_ktokd,
         ktokd       TYPE ktokd,
         next_num(5) TYPE n,
         kunnr5      TYPE char5,
       END OF ls_ktokd,
       lt_ktokd       LIKE STANDARD TABLE OF ls_ktokd,
       lv_next_num(5) TYPE n,

       lt_cust        TYPE cmds_ei_extern_t,
       ls_cust        TYPE cmds_ei_extern,

       lt_smtp_str    TYPE cvis_ei_smtp_t,
       ls_smtp_str    TYPE cvis_ei_smtp_str,

       lt_company     TYPE cmds_ei_company_t,
       ls_company     TYPE cmds_ei_company,

       lv_index       TYPE int4,
       lv_count       TYPE int4,
       lv_tgsys       TYPE tbdlst-logsys,
       lv_type        TYPE syst_msgty,
       lv_type1       TYPE syst_msgty,
       lv_str         TYPE string,
       lv_msg         TYPE string,
       lv_msg1        TYPE string,
       lv_diff        TYPE char1,

       BEGIN OF ls_namet,
         name1   TYPE name1_gp,
         name2   TYPE name2_gp,
         name3   TYPE name3_gp,
         name4   TYPE name4_gp,
         name_cn TYPE char70,
         name_en TYPE char70,
       END OF ls_namet,
       lt_namet LIKE STANDARD TABLE OF ls_namet.

  DATA:
    lv_nr_range_nr TYPE inri-nrrangenr,
    lv_syentry     TYPE syentry.

  CONSTANTS:lc_numrg  TYPE numkr VALUE '19',  "创建  规定区间
            lc_object TYPE inri-object VALUE 'DEBITOR'.  "客户 编号对象

  FIELD-SYMBOLS:
    <fs_ktokd> LIKE ls_ktokd,
*                 <ls_message> TYPE bapiret2,
    <fs_bank>  LIKE zes_ _bank_info.


*  校验必输性   筛除错误数据
  IF it_header_info[] IS NOT INITIAL.

    MOVE-CORRESPONDING it_header_info[] TO lt_header_info.

    LOOP AT lt_header_info ASSIGNING FIELD-SYMBOL(<fs_header>).

      lv_index = sy-tabix.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = <fs_header>-partner
        IMPORTING
          output = lv_kunnr.

      <fs_header>-partner = lv_kunnr.

      "当客商是  经营性的时候, 不会修改客商内容,且不校验客商字段必输性
*      N为非经营性
      IF <fs_header>-zzjyx NE 'N'.
        APPEND <fs_header> TO lt_header_n.
        DELETE lt_header_info INDEX lv_index.
      ENDIF.

    ENDLOOP.

*    去除测试数据
    DELETE lt_header_info WHERE partner EQ '?'.
*    限制账户组
    SELECT ktokd,numkr INTO TABLE @DATA(lt_t077d)
          FROM t077d
          WHERE numkr EQ @lc_numrg.
    IF sy-subrc EQ 0.

      CLEAR:lv_str.
      LOOP AT lt_t077d INTO DATA(ls_t077d).
        IF lv_str IS INITIAL.
          lv_str = ls_t077d-ktokd.
        ELSE.
          lv_str = lv_str && ',' && ls_t077d-ktokd.
        ENDIF.
      ENDLOOP.

      SORT lt_t077d BY ktokd.
      LOOP AT lt_header_info ASSIGNING <fs_header>.

        lv_index = sy-tabix.
        READ TABLE lt_t077d WITH KEY ktokd = <fs_header>-ktokk TRANSPORTING NO FIELDS.
        IF sy-subrc NE 0.

          ls_return-unique_number = <fs_header>-unique_number.
          ls_return-partner = <fs_header>-partner.
          ls_return-bukrs = <fs_header>-bukrs.
          ls_return-error_msg = text-021 && lv_str && text-022."账户组不能为规定以外的.
          ls_return-flag = 'E'.
          APPEND ls_return TO et_return_info.

          DELETE lt_header_info INDEX lv_index.
        ENDIF.

      ENDLOOP.

    ELSE.

      ls_return-unique_number = <fs_header>-unique_number.
      ls_return-partner = <fs_header>-partner.
      ls_return-bukrs = <fs_header>-bukrs.
      ls_return-error_msg = text-023."账户组未维护间隔
      ls_return-flag = 'E'.
      APPEND ls_return TO et_return_info.
      CLEAR:lt_header_info.
      RETURN.

    ENDIF.

    SORT lt_header_info BY partner bukrs.

    LOOP AT lt_header_info INTO DATA(ls_header).

      lv_index = sy-tabix.

      IF ls_header-process_type IS INITIAL OR ls_header-sr_number IS INITIAL.

*        CHECK ls_header-process_type NE 'V'.   "在V的时候不检查SR_NUMBER
        IF ls_header-process_type NE 'V'.

          CLEAR:ls_return.
          ls_return-unique_number = ls_header-unique_number.
          ls_return-partner = ls_header-partner.
          ls_return-bukrs = ls_header-bukrs.
          ls_return-error_msg = text-008."'处理类型、服务请求编号不能为空!'.
          ls_return-flag = 'E'.
          APPEND ls_return TO et_return_info.
          DELETE lt_header_info INDEX lv_index.
          EXIT.

        ENDIF.

      ENDIF.

      CALL FUNCTION 'BAPI_CUSTOMER_GETDETAIL2'
        EXPORTING
          customerno  = ls_header-partner
          companycode = ls_header-bukrs
        IMPORTING
*         CUSTOMERADDRESS             =
*         CUSTOMERGENERALDETAIL       =
*         CUSTOMERCOMPANYDETAIL       =
          return      = ls_bapiret1
*       TABLES
*         CUSTOMERBANKDETAIL          =
*         CUSTOMERIBANDETAIL          =
*         CUSTOMERSEPADETAIL          =
        .
      IF ls_bapiret1-type EQ 'E'.

        IF ls_bapiret1-id EQ 'FN' AND ls_bapiret1-number EQ '502'.

          CASE ls_header-process_type.
            WHEN 'C' OR 'V'.
*            EXIT.
            WHEN 'U' OR 'L'.
              ls_return-error_msg = ls_bapiret1-message.
              lv_cre_err = abap_true.
*            EXIT.
            WHEN OTHERS.
          ENDCASE.

        ELSE.
          IF ls_bapiret1-id EQ 'FN' AND ls_bapiret1-number EQ '503' .
            IF ls_header-process_type EQ 'U' OR ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.

            ELSE.
              lv_cre_err = abap_true.
              ls_return-error_msg = ls_return-error_msg && ' ' && ls_bapiret1-message.
            ENDIF.
          ELSE.
            lv_cre_err = abap_true.
            ls_return-error_msg = ls_return-error_msg && ' ' && ls_bapiret1-message.
          ENDIF.
        ENDIF.

      ENDIF.


*      判断当类型为U时 判断主数据是否发生变动
*      有变动  有未清项不能改,无未清项可以修改
      IF ls_header-process_type EQ 'U'.
        CLEAR:lv_diff.
        SELECT SINGLE * INTO @DATA(ls_kna1_u)
          FROM kna1
          WHERE kunnr EQ @ls_header-partner.
        IF sy-subrc EQ 0.


          IF ls_header-stcd1 NE ls_kna1_u-stcd1 AND ls_header-stcd1 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-stcd2 NE ls_kna1_u-stcd2 AND ls_header-stcd2 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-stcd3 NE ls_kna1_u-stcd3 AND ls_header-stcd3 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-stcd4 NE ls_kna1_u-stcd4 AND ls_header-stcd4 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-stcd5 NE ls_kna1_u-stcd5 AND ls_header-stcd5 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-stceg NE ls_kna1_u-stceg AND ls_header-stceg IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-ktokk NE ls_kna1_u-ktokd AND ls_header-ktokk IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-land1 NE ls_kna1_u-land1 AND ls_header-land1 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-ort01 NE ls_kna1_u-ort01 AND ls_header-ort01 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-stras NE ls_kna1_u-stras AND ls_header-stras IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.
          IF ls_header-telf1 NE ls_kna1_u-telf1 AND ls_header-telf1 IS NOT INITIAL.
            lv_diff = abap_true.
          ENDIF.

*            称谓
          IF lv_diff NE abap_true.
            IF ls_kna1_u-anred IS NOT INITIAL.

              SELECT * INTO TABLE @DATA(lt_tsad3t)
                FROM tsad3t.
              IF sy-subrc EQ 0.

                SORT lt_tsad3t BY title_medi.
                DELETE ADJACENT DUPLICATES FROM lt_tsad3t COMPARING title_medi.

                READ TABLE lt_tsad3t INTO DATA(ls_tsad3t) WITH KEY title_medi = ls_kna1_u-anred BINARY SEARCH.
                IF sy-subrc EQ 0 AND ls_tsad3t-title NE ls_header-title AND ls_header-title IS NOT INITIAL.
                  lv_diff = abap_true.
                ENDIF.

              ENDIF.

            ELSE.

              IF ls_header-title IS NOT INITIAL.
                lv_diff = abap_true.
              ENDIF.

            ENDIF.

          ENDIF.

          IF lv_diff NE abap_true.

            SELECT SINGLE * INTO @DATA(ls_addr6)
              FROM adr6
              WHERE addrnumber EQ @ls_kna1_u-adrnr.
            IF sy-subrc EQ 0 AND ls_addr6-smtp_addr NE ls_header-email_addr.
              lv_diff = abap_true.
            ENDIF.

          ENDIF.

          IF lv_diff NE abap_true.

            SELECT SINGLE * INTO @DATA(ls_knb1_u)
              FROM knb1
              WHERE kunnr EQ @ls_header-partner
              AND bukrs EQ @ls_header-bukrs.
            IF sy-subrc EQ 0.

              IF ls_knb1_u-akont NE ls_header-akont AND ls_header-akont IS NOT INITIAL.
                lv_diff = abap_true.
              ENDIF.
              IF ls_knb1_u-fdgrv NE ls_header-fdgrv  AND ls_header-fdgrv IS NOT INITIAL.
                lv_diff = abap_true.
              ENDIF.
              IF ls_knb1_u-zuawa NE ls_header-zuawa AND ls_header-zuawa IS NOT INITIAL.
                lv_diff = abap_true.
              ENDIF.

            ELSE.
              lv_diff = abap_true.
            ENDIF.

          ENDIF.

        ENDIF.
      ENDIF.

*      END  ADD


*   校验修改时客商下是否有未清项
      IF ls_header-partner IS NOT INITIAL AND ls_header-process_type EQ 'U'.

        IF lv_diff EQ abap_true.

          SELECT COUNT(*)
            FROM bsid
            WHERE kunnr = ls_header-partner.
          IF sy-subrc EQ 0.
            lv_cre_err = abap_true.
            ls_return-error_msg = text-025.
          ENDIF.

        ENDIF.
      ENDIF.


*      税号必输
      CASE ls_header-land1.
        WHEN 'CN'.
*          IF ls_header-stcd3 IS INITIAL.  "CN调整为增值税号必输
          IF ls_header-stceg IS INITIAL.
            lv_cre_err = abap_true.
            ls_return-error_msg = ls_header-land1 && text-032.
          ENDIF.

*          IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
          IF ls_header-process_type EQ 'C'.  "C创建才检验

*            校验增值税登记号在当前系统是否存在
            IF ls_header-stceg IS NOT INITIAL.

*              CLEAR:lv_index.
*              SELECT COUNT(*) INTO lv_index
              CLEAR:lv_count.
              SELECT COUNT(*) INTO lv_count
*              END  MODIFY
              FROM kna1
              WHERE stceg EQ ls_header-stceg.
*              IF lv_index GE 1.
              IF lv_count GE 1.
*                END  MODIFY
                lv_cre_err = abap_true.
                ls_return-error_msg = text-037.
              ENDIF.

            ENDIF.

*          校验供应商名称在当前系统中是否存在
            IF lt_t077d IS NOT INITIAL.

              SELECT name1 name2 name3 name4 INTO CORRESPONDING FIELDS OF TABLE lt_namet
              FROM kna1
              FOR ALL ENTRIES IN lt_t077d
              WHERE ktokd EQ lt_t077d-ktokd.
              IF sy-subrc EQ 0.
                LOOP AT lt_namet ASSIGNING FIELD-SYMBOL(<fs_namet>).
                  <fs_namet>-name_cn = <fs_namet>-name1 && <fs_namet>-name2.
                  <fs_namet>-name_en = <fs_namet>-name3 && <fs_namet>-name4.
                ENDLOOP.
              ENDIF.

              IF ls_header-name_cn IS NOT INITIAL.
                SORT lt_namet BY name_cn.
                DELETE ADJACENT DUPLICATES FROM lt_namet COMPARING name_cn.
                READ TABLE lt_namet WITH KEY name_cn = ls_header-name_cn BINARY SEARCH TRANSPORTING NO FIELDS.
                IF sy-subrc EQ 0.
                  lv_cre_err = abap_true.
                  ls_return-error_msg = text-038.
                ENDIF.
              ENDIF.

              IF ls_header-name_en IS NOT INITIAL.
                SORT lt_namet BY name_en.
                DELETE ADJACENT DUPLICATES FROM lt_namet COMPARING name_en.
                READ TABLE lt_namet WITH KEY name_en = ls_header-name_en BINARY SEARCH TRANSPORTING NO FIELDS.
                IF sy-subrc EQ 0.
                  lv_cre_err = abap_true.
                  ls_return-error_msg = text-038.
                ENDIF.
              ENDIF.

            ENDIF.
          ENDIF.

        WHEN 'MY'.
        WHEN 'SG'.
        WHEN 'HK'.
        WHEN 'BR' OR 'CL' OR 'AR' OR 'PE' OR 'MX' OR 'UY' OR 'FR' OR 'MM' OR 'TH' OR 'VN' OR 'ID'
          OR 'CZ' OR 'NL' OR 'GB' OR 'IN' OR 'ES' OR 'DE' OR 'IT' OR 'GR'.
          IF ls_header-stcd1 IS INITIAL.
            lv_cre_err = abap_true.
            ls_return-error_msg = ls_header-land1 && text-027.
          ENDIF.
          IF ls_header-land1 EQ 'AR' OR ls_header-land1 EQ 'IN' OR ls_header-land1 EQ 'IT'.
            IF ls_header-stcd2 IS INITIAL.
              lv_cre_err = abap_true.
              ls_return-error_msg = ls_header-land1 && text-028.
            ENDIF.
          ENDIF.
          IF ls_header-land1 EQ 'IN'.
            IF ls_header-stcd3 IS INITIAL.
              lv_cre_err = abap_true.
              ls_return-error_msg = ls_header-land1 && text-029.
            ENDIF.
          ENDIF.
          IF ls_header-land1 EQ 'IT'.
            IF ls_header-stcd4 IS INITIAL.
              lv_cre_err = abap_true.
              ls_return-error_msg = ls_header-land1 && text-030.
            ENDIF.
          ENDIF.
          IF ls_header-land1 EQ 'FR' OR ls_header-land1 EQ 'CZ' OR ls_header-land1 EQ 'NL' OR ls_header-land1 EQ 'ES' OR
          ls_header-land1 EQ 'IT' OR ls_header-land1 EQ 'GR'.
            IF ls_header-stceg IS INITIAL.
              lv_cre_err = abap_true.
              ls_return-error_msg = ls_header-land1 && text-032.
            ENDIF.
          ENDIF.
          IF ls_header-land1 EQ 'TH'.
            IF ls_header-j_1tpbupl IS INITIAL.
              lv_cre_err = abap_true.
              ls_return-error_msg = ls_header-land1 && text-033.
            ENDIF.
          ENDIF.
        WHEN 'CA'.
        WHEN 'PA'.
        WHEN 'PH'.
          IF ls_header-stcd3 IS INITIAL.
            lv_cre_err = abap_true.
            ls_return-error_msg = ls_header-land1 && text-029.
          ENDIF.
          IF ls_header-stcd4 IS INITIAL.
            lv_cre_err = abap_true.
            ls_return-error_msg = ls_header-land1 && text-030.
          ENDIF.

        WHEN OTHERS.
      ENDCASE.

      IF lv_cre_err EQ abap_true.

        DELETE lt_header_info INDEX lv_index.
*        CLEAR:ls_return.
        ls_return-unique_number = ls_header-unique_number.
        ls_return-partner = ls_header-partner.
        ls_return-bukrs = ls_header-bukrs.
        ls_return-flag = 'E'.
        APPEND ls_return TO et_return_info.
        CLEAR:lv_cre_err.
        EXIT.
      ENDIF.

    ENDLOOP.
  ENDIF.

  IF it_bank_info[] IS NOT INITIAL.

    IF lt_header_n IS NOT INITIAL.
      SORT lt_header_n BY partner bukrs.
    ENDIF.

    MOVE-CORRESPONDING it_bank_info[] TO lt_bank_info.
    LOOP AT lt_bank_info ASSIGNING <fs_bank>.

      lv_index = sy-tabix.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = <fs_bank>-partner
        IMPORTING
          output = lv_kunnr.

      <fs_bank>-partner = lv_kunnr.

*      READ TABLE lt_header_n WITH KEY partner = <fs_bank>-partner bukrs = <fs_bank>-bukrs TRANSPORTING NO FIELDS BINARY SEARCH.
      READ TABLE lt_header_n INTO ls_header WITH KEY partner = <fs_bank>-partner bukrs = <fs_bank>-bukrs BINARY SEARCH.
      IF sy-subrc EQ 0 AND ( ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'U' ).
        APPEND <fs_bank> TO lt_bank_n.
        DELETE lt_bank_info INDEX lv_index.
      ENDIF.

    ENDLOOP.
    SORT lt_header_info BY partner bukrs.

*    去除测试数据
    DELETE lt_bank_info WHERE partner EQ '?'.

    LOOP AT lt_bank_info INTO DATA(ls_bank).

      lv_index = sy-tabix.
      IF ls_bank-partner IS INITIAL OR ls_bank-bukrs IS INITIAL OR ls_bank-land1 IS INITIAL
      OR ls_bank-bankl IS INITIAL OR  ls_bank-zbankh IS INITIAL "OR ls_bank-ziban IS INITIAL
      OR ls_bank-waers IS INITIAL.

        CLEAR:ls_return.
        ls_return-error_msg = text-018."'客户编号、公司代码、国家代码、开户行联行号、银行账号、账户币种 均不能为空'.

        LOOP AT lt_header_info INTO ls_header WHERE partner EQ ls_bank-partner AND bukrs EQ ls_bank-bukrs.
          ls_return-unique_number = ls_header-unique_number.
          ls_return-partner = ls_header-partner.
          ls_return-bukrs = ls_header-bukrs.
          ls_return-flag = 'E'.
          APPEND ls_return TO et_return_info.
          EXIT.
        ENDLOOP.

        DELETE lt_bank_info INDEX lv_index.
        DELETE lt_header_info WHERE partner EQ ls_bank-partner.

      ENDIF.

      IF ls_bank-land1 NE 'CN' AND ( ls_bank-ziban IS INITIAL OR ls_bank-swift IS INITIAL ).   "海外iban swift必输

        CLEAR:ls_return.
        ls_return-error_msg = text-026.

        LOOP AT lt_header_info INTO ls_header WHERE partner EQ ls_bank-partner AND bukrs EQ ls_bank-bukrs.
          ls_return-unique_number = ls_header-unique_number.
          ls_return-partner = ls_header-partner.
          ls_return-bukrs = ls_header-bukrs.
          ls_return-flag = 'E'.
          APPEND ls_return TO et_return_info.
          EXIT.
        ENDLOOP.

        DELETE lt_bank_info INDEX lv_index.
        DELETE lt_header_info WHERE partner EQ ls_bank-partner.

      ENDIF.

    ENDLOOP.

  ENDIF.

*  处理主数据
  IF lt_header_info IS NOT INITIAL.

    LOOP AT lt_header_info INTO ls_header.

      CLEAR:ls_cus_mas,ls_return,lt_cust,lt_smtp_str.

      CASE ls_header-process_type.
        WHEN 'C' OR 'U' OR 'V'. "C--创建(Create)  U--更改(UPDATE)  V--校验(VALIDATION)

        CLEAR:ls_cust,lt_company.

          IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.

*            客户外部给号
            IF ls_header-ktokk IS NOT INITIAL.

*              限定客户码   分配的区间为20000MG往上
              READ TABLE lt_ktokd ASSIGNING <fs_ktokd> INDEX 1."WITH KEY ktokd = ls_header-ktokd ASSIGNING <fs_ktokd>.
              IF sy-subrc NE 0.
                SELECT MAX( kunnr ) INTO lv_kunnr
                  FROM kna1
                  WHERE kunnr LIKE 'Z20001%'.
                IF sy-subrc NE 0.

*                  一个都没读取到 给一个最初的间隔
                  lv_kunnr = 'Z200010000'.

                ELSE.

                  PERFORM frm_get_next_number_customer CHANGING lv_kunnr.

                  ls_cust-header-object_instance-kunnr = lv_kunnr."lv_kunnr+0(6) && lv_next_num.
                  ls_ktokd-next_num = lv_kunnr+5(5)."lv_next_num.
                  ls_ktokd-kunnr5 = lv_kunnr+0(5).
                  IF lt_ktokd IS INITIAL.
                    APPEND ls_ktokd TO lt_ktokd.
                  ENDIF.

                ENDIF.

              ELSE.

                lv_kunnr = <fs_ktokd>-kunnr5 && <fs_ktokd>-next_num.

                PERFORM frm_get_next_number_customer CHANGING lv_kunnr.

                ls_cust-header-object_instance-kunnr = lv_kunnr."ls_ktokd-kunnr5 && lv_next_num.
                <fs_ktokd>-next_num = lv_kunnr+5(5)."lv_next_num.
                <fs_ktokd>-kunnr5 = lv_kunnr+0(5).

              ENDIF.

            ELSE.

*                报错 没有账户组
              ls_return-unique_number = ls_header-unique_number.
              ls_return-partner = ls_header-partner.
              ls_return-bukrs = ls_header-bukrs.
              ls_return-flag = 'E'.
              ls_return-error_msg = text-034."'账户组不能为空。'.
              APPEND ls_return TO et_return_info.
              EXIT.

            ENDIF.

            ls_cust-header-object_instance-kunnr = lv_kunnr.

            ls_cust-header-object_task = 'I'.
            ls_cust-central_data-address-task = 'I'.
            IF ls_header-process_type EQ 'V'.
              DELETE lt_header_info WHERE process_type NE 'V'.
            ENDIF.
          ELSE.
            ls_cust-header-object_task = 'M'.
            ls_cust-central_data-address-task = 'M'.
            ls_cust-header-object_instance-kunnr = ls_header-partner.
          ENDIF.

*          主数据

          ls_cust-central_data-central-data-ktokd = ls_header-ktokk.
          ls_cust-central_data-central-datax-ktokd = 'X'.
          ls_cust-central_data-central-data-stcd1 = ls_header-stcd1.
          ls_cust-central_data-central-datax-stcd1 = 'X'.
          ls_cust-central_data-central-data-stcd2 = ls_header-stcd2.
          ls_cust-central_data-central-datax-stcd2 = 'X'.
          ls_cust-central_data-central-data-stcd3 = ls_header-stcd3.
          ls_cust-central_data-central-datax-stcd3 = 'X'.
          ls_cust-central_data-central-data-stcd4 = ls_header-stcd4.
          ls_cust-central_data-central-datax-stcd4 = 'X'.
          ls_cust-central_data-central-data-stcd5 = ls_header-stcd5.
          ls_cust-central_data-central-datax-stcd5 = 'X'.
          ls_cust-central_data-central-data-stceg = ls_header-stceg.
          ls_cust-central_data-central-datax-stceg = 'X'.
          ls_cust-central_data-central-data-sperr = ls_header-sperr.
          ls_cust-central_data-central-datax-sperr = 'X'.

*          公司数据
          IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
            ls_company-task = 'I'.
          ELSE.
            ls_company-task = 'M'.
          ENDIF.
          ls_company-data_key-bukrs = ls_header-bukrs.
          ls_company-data-fdgrv = ls_header-fdgrv.
          ls_company-datax-fdgrv = 'X'.
          ls_company-data-zuawa = ls_header-zuawa.
          ls_company-datax-zuawa = 'X'.
          ls_company-data-akont = ls_header-akont.
          ls_company-datax-akont = 'X'.
          APPEND ls_company TO lt_company.
*          ls_cust-company_data-current_state = 'X'.
          ls_cust-company_data-company = lt_company.

*          地址数据
          IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
            ls_cust-central_data-address-task = 'I'.
          ELSE.
            ls_cust-central_data-address-task = 'M'.
          ENDIF.

          ls_cust-central_data-address-postal-data-postl_cod1 = ls_header-pstlz.  "城市邮编
          ls_cust-central_data-address-postal-datax-postl_cod1 = 'X'.
          ls_cust-central_data-address-postal-data-title = ls_header-title.
          ls_cust-central_data-address-postal-datax-title = 'X'.
          ls_cust-central_data-address-postal-data-langu = sy-langu.
          ls_cust-central_data-address-postal-datax-langu = 'X'.
          ls_cust-central_data-address-postal-data-country = ls_header-land1.
          ls_cust-central_data-address-postal-datax-county = 'X'.
          ls_cust-central_data-address-postal-data-city = ls_header-ort01.
          ls_cust-central_data-address-postal-datax-city = 'X'.
          ls_cust-central_data-address-postal-data-street = ls_header-stras.
          ls_cust-central_data-address-postal-datax-street = 'X'.

          ls_cust-central_data-address-postal-data-name = ls_header-name_cn+0(35).
          ls_cust-central_data-address-postal-datax-name = 'X'.
          ls_cust-central_data-address-postal-data-name_2 = ls_header-name_cn+35(35).
          ls_cust-central_data-address-postal-datax-name_2 = 'X'.
          ls_cust-central_data-address-postal-data-name_3 = ls_header-name_en+0(35).
          ls_cust-central_data-address-postal-datax-name_3 = 'X'.
          ls_cust-central_data-address-postal-data-name_4 = ls_header-name_en+35(35).
          ls_cust-central_data-address-postal-datax-name_4 = 'X'.

*          针对公司做特别处理
          CASE ls_header-bukrs.
            WHEN ' 3271'.
              ls_cust-central_data-address-postal-data-name_3 = ls_cust-central_data-address-postal-data-name.
              ls_cust-central_data-address-postal-data-name_4 = ls_cust-central_data-address-postal-data-name_2.
            WHEN OTHERS.
          ENDCASE.

          ls_cust-central_data-address-postal-data-langu = sy-langu.
          ls_cust-central_data-address-postal-datax-langu = 'X'.

*          邮箱
          IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
            ls_smtp_str-contact-task = 'I'.
          ELSE.
            ls_smtp_str-contact-task = 'M'.
          ENDIF.
          ls_smtp_str-contact-data-e_mail = ls_header-email_addr.
          ls_smtp_str-contact-datax-e_mail = 'X'.
          APPEND ls_smtp_str TO lt_smtp_str.
*          ls_cust-central_data-address-communication-smtp-current_state = 'X'.
          ls_cust-central_data-address-communication-smtp-smtp = lt_smtp_str.

          APPEND ls_cust TO lt_cust.

          ls_cus_mas-customers = lt_cust.

          IF ls_header-process_type EQ 'V'.
            lv_test = 'X'.
          ELSE.
            CLEAR:lv_test.
          ENDIF.

*          CALL METHOD cmd_ei_api=>maintain_bapi
*            EXPORTING
*              iv_test_run            = lv_test
*              iv_collect_messages    = 'X'
*              is_master_data         = ls_cus_mas
*            IMPORTING
*              es_master_data_correct = ls_ei_main
**             es_message_correct     = ls_error
**             es_master_data_defective =
*              es_message_defective   = ls_error.
          CALL METHOD cmd_ei_api=>maintain
            EXPORTING
              iv_test_run    = lv_test
              is_master_data = ls_cus_mas
            IMPORTING
              es_error       = ls_error.
          IF ls_error-is_error NE 'X'.

*              创建或修改成功
            IF ls_header-process_type EQ 'C'.

*              READ TABLE ls_ei_main-customers INTO ls_customr INDEX 1.
*              IF sy-subrc EQ 0.

*                lv_kunnr = ls_customr-header-object_instance-kunnr.
*              经讨论 当创建时partner传一个不存在的客户客户编号做关联  创建成功后修改掉就行

              LOOP AT lt_bank_info ASSIGNING <fs_bank> WHERE partner EQ ls_header-partner AND bukrs EQ ls_header-bukrs.
                <fs_bank>-partner = lv_kunnr.
              ENDLOOP.
              ls_header-partner = lv_kunnr.
              MODIFY lt_header_info FROM ls_header TRANSPORTING partner WHERE unique_number EQ ls_header-unique_number.

*              ENDIF.

            ENDIF.

            ls_return-unique_number = ls_header-unique_number.
            ls_return-partner = ls_header-partner.
            ls_return-bukrs = ls_header-bukrs.
            ls_return-flag = 'S'.
            APPEND ls_return TO et_return_info.

            COMMIT WORK AND WAIT.  

          ELSE.

*              创建或修改失败
            IF ls_header-process_type EQ 'C'.
              ls_return-error_msg = text-013."' 客户主数据创建失败'.
            ELSE.
              ls_return-error_msg = text-014."' 客户主数据修改失败'.
            ENDIF.
            LOOP AT ls_error-messages INTO ls_msg WHERE type EQ 'E'.
              ls_return-error_msg = ls_return-error_msg && '-' && ls_msg-message.
            ENDLOOP.
            ls_return-unique_number = ls_header-unique_number.
            CLEAR:ls_return-partner." = ls_header-partner.
            ls_return-bukrs = ls_header-bukrs.
            ls_return-flag = 'E'.
            APPEND ls_return TO et_return_info.

            DELETE lt_header_info INDEX lv_index.

            ROLLBACK WORK.   

          ENDIF.

          cmd_ei_api=>initialize( ).

        WHEN 'L'. "L--冻结(Lock)
          CALL METHOD cmd_ei_api=>lock
            EXPORTING
              iv_kunnr = ls_header-partner
*             iv_mode_kna1 = 'E'
*             iv_mandt = SY-MANDT
*             iv_collect   = ' '
*             iv_wait  = SPACE
*             iv_scope = '2'
*             iv_x_kunnr   = SPACE
            IMPORTING
              es_error = ls_error.

          IF ls_error-is_error EQ 'X'.
            ls_return-error_msg = text-010.
            ls_return-flag = 'E'.
            DELETE lt_header_info INDEX lv_index.
          ELSE.
*            ls_return-error_msg = text-006."' 客户主数据冻结成功!'.
            ls_return-flag = 'S'.
          ENDIF.

          ls_return-unique_number = ls_header-unique_number.
          CLEAR:ls_return-partner." = ls_header-partner.
          ls_return-bukrs = ls_header-bukrs.
          APPEND ls_return TO et_return_info.

*          cmd_ei_api=>initialize( ).
*          EXIT.

*        WHEN 'V'. "V--校验(Verification)"
**          ls_return-error_msg = ' 客户主数据校验成功!'.
      ENDCASE.

    ENDLOOP.

  ENDIF.

  IF lt_bank_n IS NOT INITIAL.

    LOOP AT lt_bank_n INTO ls_bank.
      CLEAR:ls_bank_info.
      MOVE-CORRESPONDING ls_bank TO ls_bank_info.
      ls_bank_info-objkt = ls_bank-partner.

      ls_bank_info-upnam = sy-uname.
      ls_bank_info-udat = sy-datum.
      ls_bank_info-utime = sy-uzeit.

      CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
        EXPORTING
          i_datlo     = sy-datum
          i_timlo     = sy-uzeit
          i_tzone     = sy-zonlo
        IMPORTING
          e_timestamp = ls_bank_info-timestamp.

      ls_bank_info-banks = ls_bank-land1.
      APPEND ls_bank_info  TO lt_bank.

      CHECK et_return_info IS INITIAL.
      LOOP AT it_header_info[] INTO ls_header WHERE zzjyx NE 'N' AND partner EQ ls_bank-partner AND bukrs EQ ls_bank-bukrs.

        ls_return-unique_number = ls_header-unique_number.
        ls_return-partner = ls_header-partner.
        ls_return-bukrs = ls_header-bukrs.
        ls_return-flag = 'S'.
        APPEND ls_return TO et_return_info.
        EXIT.

      ENDLOOP.

    ENDLOOP.

    MODIFY zzt_bnka FROM TABLE lt_bank.
    IF sy-subrc EQ 0.
      COMMIT WORK AND WAIT.

      LOOP AT lt_bank INTO ls_bank_info.

        LOOP AT lt_header_info INTO ls_header WHERE process_type NE 'L' AND partner EQ ls_bank_info-objkt.

          lv_index = sy-tabix.

*      1.分发
          CLEAR:ls_msg,lv_type,lv_type1.
          IF ls_header-zzdest1 IS NOT INITIAL.
            lv_tgsys = ls_header-zzdest1.
            IF lv_tgsys NE 'SAP'.  "SAP  毋需推送 
              PERFORM frm_customer_to_other_system USING ls_header-bukrs ls_header-partner
                    lv_tgsys
              CHANGING lv_type lv_msg.
            ENDIF.
          ENDIF.

          IF ls_header-zzdest2 IS NOT INITIAL.
            lv_tgsys = ls_header-zzdest2.
            IF lv_tgsys NE 'SAP'.  "SAP  毋需推送 
              PERFORM frm_customer_to_other_system USING ls_header-bukrs ls_header-partner
                    lv_tgsys
              CHANGING lv_type1 lv_msg1.
            ENDIF.
          ENDIF.

          IF lv_type1 EQ 'E' OR lv_type EQ 'E'.
            DELETE lt_header_info INDEX lv_index.
          ENDIF.

        ENDLOOP.

      ENDLOOP.

      RETURN.
    ENDIF.

  ENDIF.

*  校验就rollback 不走了
  LOOP AT it_header_info[] INTO ls_header WHERE process_type EQ 'V'.
    ROLLBACK WORK.
    RETURN.
  ENDLOOP.

*  排除可能因客户创建失败的对应银行数据
  SORT lt_header_info BY partner bukrs.
  LOOP AT lt_bank_info INTO ls_bank.

    lv_index = sy-tabix.
    READ TABLE lt_header_info WITH KEY partner = ls_bank-partner bukrs = ls_bank-bukrs TRANSPORTING NO FIELDS BINARY SEARCH.
    IF sy-subrc NE 0.
      DELETE lt_bank_info INDEX lv_index.
    ENDIF.

  ENDLOOP.


  IF lt_header_info IS NOT INITIAL.

*  银行数据
    IF lt_bank_info IS NOT INITIAL.

      CLEAR:lt_bank.
*      MOVE-CORRESPONDING lt_bank_info TO lt_bank.

      SORT lt_header_info BY partner process_type.

      LOOP AT lt_bank_info INTO ls_bank.
        CLEAR:ls_bank_info.
        MOVE-CORRESPONDING ls_bank TO ls_bank_info.
        ls_bank_info-objkt = ls_bank-partner.

        READ TABLE lt_header_info WITH KEY partner = ls_bank-partner process_type = 'C' TRANSPORTING NO FIELDS BINARY SEARCH.
        IF sy-subrc EQ 0.

          ls_bank_info-autor = sy-uname.
          ls_bank_info-cdat = sy-datum.
          ls_bank_info-ctime = sy-uzeit.

        ELSE.

          READ TABLE lt_header_info WITH KEY partner = ls_bank-partner process_type = 'U' TRANSPORTING NO FIELDS BINARY SEARCH.
          IF sy-subrc EQ 0.

            ls_bank_info-upnam = sy-uname.
            ls_bank_info-udat = sy-datum.
            ls_bank_info-utime = sy-uzeit.

          ENDIF.

        ENDIF.

        CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
          EXPORTING
            i_datlo     = sy-datum
            i_timlo     = sy-uzeit
            i_tzone     = sy-zonlo
          IMPORTING
            e_timestamp = ls_bank_info-timestamp.

        ls_bank_info-banks = ls_bank-land1.
        APPEND ls_bank_info  TO lt_bank.
      ENDLOOP.

      MODIFY zzt_bnka FROM TABLE lt_bank.

    ENDIF.

*    BRANCH CODE
*    FITHA_BRNCH_T,FITHA_BRNCH
    LOOP AT lt_header_info INTO ls_header WHERE j_1tpbupl IS NOT INITIAL." AND land1 EQ 'TH'.

      SELECT SINGLE * INTO ls_brnch
        FROM fitha_brnch
        WHERE bp_nummr EQ ls_header-partner
        AND bcode EQ ls_header-j_1tpbupl
        AND bukrs EQ ls_header-bukrs
        AND koart EQ 'D'.

      CHECK sy-subrc NE 0.

      CLEAR:ls_brnch,ls_brnch_d.

      ls_brnch-bcode = ls_header-j_1tpbupl.
      ls_brnch-bp_nummr = ls_header-partner.
      ls_brnch-bukrs = ls_header-bukrs.
      ls_brnch-koart = 'D'.
      APPEND ls_brnch TO lt_brnch.

      ls_brnch_d-bcode = ls_header-j_1tpbupl.
      ls_brnch_d-bp_nummr = ls_header-partner.
      ls_brnch_d-bukrs = ls_header-bukrs.
      ls_brnch_d-koart = 'D'.
      ls_brnch_d-spras = sy-langu.
      APPEND ls_brnch_d TO lt_brnch_d.

    ENDLOOP.

    IF lt_brnch IS NOT INITIAL.

      MODIFY fitha_brnch FROM TABLE lt_brnch.
      MODIFY fitha_brnch_t FROM TABLE lt_brnch_d.

    ENDIF.


    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'    " Using the command `COMMIT AND WAIT`
*      IMPORTING
*       return =     " Return Messages
      . "数据库提交

  ELSE.   "没有执行成功的数据

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

  ENDIF.


ENDFUNCTION.

总结

银行信息如果不是自定义的 就需要把银行信息填入到API对应的结构中
以上

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ggreekn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值