SAP ABAP 供应商主数据的 查询-创建-修改-锁定 API或BAPI


前言

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


范例代码

供应商主数据创建查询修改锁定

FUNCTION zfm_pi_rfc_vendor_mas.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IT_HEADER_INFO) TYPE  ZZT__PARTNER_H OPTIONAL
*"     VALUE(IT_BANK_INFO) TYPE  ZET__BANK_INFO OPTIONAL
*"  EXPORTING
*"     VALUE(ET_RETURN_INFO) TYPE  ZET__MAS_RETURN
*"----------------------------------------------------------------------

*  DATA:BEGIN OF ls_header_info,
*         result TYPE char1.
*          INCLUDE STRUCTURE zzs__partner_h.
*  DATA:END OF ls_header_info.

  DATA:ls_return      TYPE zes__mas_return,
       lt_header_info TYPE zzt__partner_h,
       lt_header_n    TYPE zzt__partner_h, "经营性客商数据
*       lt_header_info LIKE STANDARD TABLE OF ls_header_info,

       lt_bank_info   TYPE zet__bank_info,
       lt_bank        TYPE TABLE OF zzt_epic_bnka,
       lt_bank_n      TYPE TABLE OF zzt_epic_bnka, "经营性客商银行数据
       ls_bank_info   TYPE zzt_epic_bnka,

       lv_lifnr       TYPE lifnr,
       lv_index       TYPE int4,
       lv_count       TYPE int4,

       lv_next_num(4) TYPE n,
       lv_str         TYPE string,

       BEGIN OF ls_ktokk,
         ktokk       TYPE ktokk,
         next_num(4) TYPE n,
         lifnr6      TYPE char6,
       END OF ls_ktokk,
       lt_ktokk       LIKE STANDARD TABLE OF ls_ktokk,

       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_lifnr,
*         unique_number TYPE guid,
*         partner       TYPE  objkt,
*         bukrs         TYPE bukrs,
*         lifnr         TYPE lifnr,
*       END OF ls_lifnr,
*       lt_lifnr_l      LIKE STANDARD TABLE OF ls_lifnr,

       lv_test        TYPE xfeld,
       ls_master_data TYPE vmds_ei_main,
       ls_ei_main     TYPE vmds_ei_main,
       ls_vendor      TYPE vmds_ei_extern,
       ls_error       TYPE cvis_message,
       ls_message     TYPE cvis_message,
*       lt_msg          TYPE bapiret2_t,
       ls_msg         TYPE bapiret2,
*       lt_bapiret1    TYPE TABLE OF bapiret1 WITH HEADER LINE,
*       lt_bapiret1    TYPE TABLE OF bapiret1,
       ls_bapiret1    LIKE bapiret1,
       lv_cre_err     TYPE char1,

       lt_vend        TYPE vmds_ei_extern_t,
       lwa_vend       TYPE vmds_ei_extern,

       lt_company     TYPE vmds_ei_company_t,
       lwa_company    TYPE vmds_ei_company,

*       lt_bankdetails  TYPE cvis_ei_bankdetail_t,
*       lwa_bankdetails TYPE cvis_ei_cvi_bankdetail, "CVIS_EI_BANKDETAIL.

*       lt_purchasing   TYPE vmds_ei_purchasing_t,
*       lwa_purchasing  TYPE vmds_ei_purchasing,

*       lt_functions    TYPE vmds_ei_functions_t,
*       lwa_functions   TYPE vmds_ei_functions,

       lt_smtp_str    TYPE cvis_ei_smtp_t,
       ls_smtp_str    TYPE cvis_ei_smtp_str,

*       lo_vendor       TYPE REF TO zcl_if__co_si_ecc__statu,   "STATUS接口

       lv_tgsys       TYPE tbdlst-logsys,
       lv_msg         TYPE string,
       lv_type        TYPE syst_msgty,
       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.

  FIELD-SYMBOLS:<fs_ktokk> LIKE ls_ktokk,
*                 <ls_message> TYPE bapiret2,
                <fs_bank>  LIKE zes__bank_info.

  CONSTANTS:lc_numrg  TYPE numkr VALUE '02',  "创建  规定区间
            lc_object TYPE inri-object VALUE 'KREDITOR'.  "供应商 编号对象

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

    MOVE-CORRESPONDING it_header_info[] TO lt_header_info.

*    去除测试数据
    DELETE lt_header_info WHERE partner EQ '?'.
    SORT lt_header_info BY partner bukrs.

    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_lifnr.

      <fs_header>-partner = lv_lifnr.

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

    ENDLOOP.

*    限制账户组
    SELECT ktokk,numkr INTO TABLE @DATA(lt_t077k)
          FROM t077k
          WHERE numkr EQ @lc_numrg.
    IF sy-subrc EQ 0.

      CLEAR:lv_str.
      LOOP AT lt_t077k INTO DATA(ls_t077k).
        IF lv_str IS INITIAL.
          lv_str = ls_t077k-ktokk.
        ELSE.
          lv_str = lv_str && ',' && ls_t077k-ktokk.
        ENDIF.
      ENDLOOP.

      SORT lt_t077k BY ktokk.
      LOOP AT lt_header_info ASSIGNING <fs_header>.

        lv_index = sy-tabix.
        READ TABLE lt_t077k WITH KEY ktokk = <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.

    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.

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

          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_VENDOR_GETDETAIL'
        EXPORTING
          vendorno    = ls_header-partner
          companycode = ls_header-bukrs
        IMPORTING
*         GENERALDETAIL          =
*         COMPANYDETAIL          =
          return      = ls_bapiret1
*           TABLES
*         BANKDETAIL  =
*         VENDORIBANDETAIL       =
        .
      IF ls_bapiret1-type EQ 'E'.

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

          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 '522' .
            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_lfa1_u)
          FROM lfa1
          WHERE lifnr EQ @ls_header-partner.
        IF sy-subrc EQ 0.

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

*            称谓
          IF lv_diff NE abap_true.
            IF ls_lfa1_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_lfa1_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_lfa1_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_lfb1_u)
              FROM lfb1
              WHERE lifnr EQ @ls_header-partner
              AND bukrs EQ @ls_header-bukrs.
            IF sy-subrc EQ 0.

              IF ls_lfb1_u-akont NE ls_header-akont AND ls_header-akont IS NOT INITIAL.
                lv_diff = abap_true.
              ENDIF.
              IF ls_lfb1_u-fdgrv NE ls_header-fdgrv  AND ls_header-fdgrv IS NOT INITIAL.
                lv_diff = abap_true.
              ENDIF.
              IF ls_lfb1_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 bsik
            WHERE lifnr = ls_header-partner.
          IF sy-subrc EQ 0.
            lv_cre_err = abap_true.
            ls_return-error_msg = text-024.
          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 lfa1
              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-035.
              ENDIF.

            ENDIF.

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

              SELECT name1 name2 name3 name4 INTO CORRESPONDING FIELDS OF TABLE lt_namet
              FROM lfa1
              FOR ALL ENTRIES IN lt_t077k
              WHERE ktokk EQ lt_t077k-ktokk.
              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-036.
                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-036.
                ENDIF.
              ENDIF.

            ENDIF.
          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_lifnr.

      <fs_bank>-partner = lv_lifnr.

*      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.  "  应只有u或c的时候才append
      IF sy-subrc EQ 0 AND ( ls_header-process_type EQ 'U' OR ls_header-process_type = 'C' ).
        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-ziban IS INITIAL 
      OR ls_bank-waers IS INITIAL.

        CLEAR:ls_return.
        ls_return-error_msg = text-009."'供应商编号、公司代码、国家代码、开户行联行号、银行账号、账户币种 均不能为空'.
        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_return,lt_vend,lt_smtp_str.

      lv_index = sy-tabix.

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

          CLEAR:ls_master_data,ls_return,lv_lifnr.

          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_ktokk ASSIGNING <fs_ktokk> INDEX 1."WITH KEY ktokk = ls_header-ktokk ASSIGNING <fs_ktokk>.
              IF sy-subrc NE 0.
                SELECT MAX( lifnr ) INTO lv_lifnr
                FROM lfa1
                WHERE lifnr LIKE '2000M%'.
                IF sy-subrc NE 0.

*                  一个都没读取到 给一个最初的间隔
                  lv_lifnr = '2000MG0000'.

                ELSE.

                  PERFORM frm_get_next_number_vendor CHANGING lv_lifnr.

                  lwa_vend-header-object_instance-lifnr = lv_lifnr."lv_lifnr+0(6) && lv_next_num.
                  ls_ktokk-next_num = lv_lifnr+6(4)."lv_next_num.
                  ls_ktokk-lifnr6 = lv_lifnr+0(6).
                  IF lt_ktokk IS INITIAL.
                    APPEND ls_ktokk TO lt_ktokk.
                  ENDIF.

                ENDIF.

              ELSE.

                lv_lifnr = <fs_ktokk>-lifnr6 && <fs_ktokk>-next_num.

                PERFORM frm_get_next_number_vendor CHANGING lv_lifnr.

                lwa_vend-header-object_instance-lifnr = lv_lifnr."ls_ktokk-lifnr6 && lv_next_num.
                <fs_ktokk>-next_num = lv_lifnr+6(4)."lv_next_num.
                <fs_ktokk>-lifnr6 = lv_lifnr+0(6).


              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.

            lwa_vend-header-object_instance-lifnr = lv_lifnr.

*            ls_return-error_msg = text-001." '供应商主数据创建成功!'.
            lwa_vend-header-object_task = 'I'.
            lwa_vend-central_data-address-task = 'I'.
            IF ls_header-process_type EQ 'V'.
              DELETE lt_header_info WHERE process_type NE 'V'.
            ENDIF.
          ELSEIF ls_header-process_type EQ 'U'.
            lwa_vend-header-object_task = 'M'.
            lwa_vend-central_data-address-task = 'M'.
*            ls_return-error_msg = text-002."'供应商主数据更新成功!'.
          ENDIF.

*          主数据
          IF ls_header-process_type EQ 'U'.
            lwa_vend-header-object_instance-lifnr = ls_header-partner.
          ENDIF.
          lwa_vend-central_data-central-data-ktokk = ls_header-ktokk.
          lwa_vend-central_data-central-datax-ktokk = 'X'.
          lwa_vend-central_data-central-data-stcd1 = ls_header-stcd1.
          lwa_vend-central_data-central-datax-stcd1 = 'X'.
          lwa_vend-central_data-central-data-stcd2 = ls_header-stcd2.
          lwa_vend-central_data-central-datax-stcd2 = 'X'.
          lwa_vend-central_data-central-data-stcd3 = ls_header-stcd3.
          lwa_vend-central_data-central-datax-stcd3 = 'X'.
          lwa_vend-central_data-central-data-stcd4 = ls_header-stcd4.
          lwa_vend-central_data-central-datax-stcd4 = 'X'.
          lwa_vend-central_data-central-data-stcd5 = ls_header-stcd5.
          lwa_vend-central_data-central-datax-stcd5 = 'X'.
          lwa_vend-central_data-central-data-stceg = ls_header-stceg.
          lwa_vend-central_data-central-datax-stceg = 'X'.
          lwa_vend-central_data-central-data-sperr = ls_header-sperr.
          lwa_vend-central_data-central-datax-sperr = 'X'.

*          地址数据
          IF ls_header-process_type EQ 'C' OR ls_header-process_type EQ 'V'.
            lwa_vend-central_data-address-task = 'I'.
          ELSE.
            lwa_vend-central_data-address-task = 'M'.
          ENDIF.
          lwa_vend-central_data-address-postal-data-postl_cod1 = ls_header-pstlz.  "城市邮编
          lwa_vend-central_data-address-postal-datax-postl_cod1 = 'X'.
          lwa_vend-central_data-address-postal-data-title = ls_header-title.
          lwa_vend-central_data-address-postal-datax-title = 'X'.
          lwa_vend-central_data-address-postal-data-langu = sy-langu.
          lwa_vend-central_data-address-postal-datax-langu = 'X'.
          lwa_vend-central_data-address-postal-data-country = ls_header-land1.
          lwa_vend-central_data-address-postal-datax-county = 'X'.
          lwa_vend-central_data-address-postal-data-city = ls_header-ort01.
          lwa_vend-central_data-address-postal-datax-city = 'X'.
          lwa_vend-central_data-address-postal-data-street = ls_header-stras.
          lwa_vend-central_data-address-postal-datax-street = 'X'.

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


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

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

*          邮箱
          lwa_vend-central_data-address-communication-smtp-current_state = '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.
          lwa_vend-central_data-address-communication-smtp-smtp = lt_smtp_str.

          APPEND lwa_vend TO lt_vend.

          ls_master_data-vendors = lt_vend.

*    操作创建/修改数据
          IF ls_master_data IS NOT INITIAL.

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

*            CALL METHOD vmd_ei_api=>maintain_bapi
*              EXPORTING
*                iv_test_run            = lv_test
*                iv_collect_messages    = 'X'
*                is_master_data         = ls_master_data
*              IMPORTING
*                es_master_data_correct = ls_ei_main
**               es_message_correct     =
**               es_master_data_defective =
*                es_message_defective   = ls_error.
            CALL METHOD vmd_ei_api=>maintain
              EXPORTING
                iv_test_run    = lv_test
                is_master_data = ls_master_data
              IMPORTING
                es_error       = ls_error.

            IF ls_error-is_error NE 'X'.

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

*                READ TABLE ls_ei_main-vendors INTO ls_vendor INDEX 1.
*                IF sy-subrc EQ 0.
*
*                  lv_lifnr = ls_vendor-header-object_instance-lifnr.
*              经讨论 当创建时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_lifnr.
                ENDLOOP.
                ls_header-partner = lv_lifnr.
                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-003."'供应商主数据创建失败'.
              ELSEIF ls_header-process_type EQ 'U'.
                ls_return-error_msg = text-004."'供应商主数据修改失败'.
              ELSEIF ls_header-process_type EQ 'V'.
                ls_return-error_msg = text-020."'供应商主数据校验失败'.
              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.
              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.

            vmd_ei_api=>initialize( ).

          ENDIF.

        WHEN 'L'. "L--冻结(Lock)

          CALL METHOD vmd_ei_api=>lock
            EXPORTING
              iv_lifnr = ls_header-partner
*             iv_mode_lfa1 = 'E'
*             iv_mandt = sy-mandt
*             iv_collect   = ' '
*             iv_wait  = SPACE
*             iv_scope = '2'
*             iv_x_lifnr   = SPACE
            IMPORTING
              es_error = ls_message.

          IF ls_message-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.
          ls_return-partner = ls_header-partner.
          ls_return-bukrs = ls_header-bukrs.
          APPEND ls_return TO et_return_info.

*          vmd_ei_api=>initialize( ).
*          EXIT.

*        WHEN 'V'. "V--校验(Verification)"
*          ls_return-unique_number = ls_header-unique_number.
*          ls_return-partner = ls_header-partner.
*          ls_return-bukrs = ls_header-bukrs.
*          ls_return-flag = 'S'.
*          ls_return-error_msg = text-005."'供应商主数据校验成功!'.
        WHEN OTHERS.
      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_epic_bnka FROM TABLE lt_bank.
    IF sy-subrc EQ 0.
      COMMIT WORK AND WAIT.
      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.


*  执行commit
  IF lt_header_info IS NOT INITIAL.

*  银行数据
    IF lt_bank_info IS NOT INITIAL.

    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 'K'.

      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 = 'K'.
      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 = 'K'.
      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.

    COMMIT WORK AND WAIT."数据库提交


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

    ROLLBACK WORK.

  ENDIF.

ENDFUNCTION.


总结

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ggreekn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值