SAP 创建开户行&银行账号

在执行完函数FCLM_BAM_ACCOUNT_CREATE后还要执行cl_fclm_house_bank_account_api=>insert_house_bank_account才能在FI13中有数据,不知道是因为传参问题别是别的

创建银行账号

FUNCTION zbank_account_create.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(LS_HEAD) TYPE  ZPOCL_DT_OA015_REQ_INPUT
*"  EXPORTING
*"     REFERENCE(ES_TYPE) TYPE  BAPI_MTYPE
*"     REFERENCE(ES_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------
  DATA : it_db_amd      TYPE TABLE OF fclm_bam_amd,
         is_db_amd      TYPE fclm_bam_amd,
         it_db_amd_t    TYPE TABLE OF fclm_bam_s_db_amd_t,
         is_db_amd_t    TYPE fclm_bam_s_db_amd_t,
         it_db_amd_cur  TYPE TABLE OF fclm_bam_amd_cur,
         is_db_amd_cur  TYPE fclm_bam_amd_cur,
         it_db_ac_link2 TYPE TABLE OF fclm_bam_aclink2,
         is_db_ac_link2 TYPE  fclm_bam_aclink2,
         it_msg         TYPE TABLE OF bapiret2,
         lv_skipappproc TYPE boolean VALUE 'X'.
  DATA : lt_t012k   TYPE TABLE OF t012k,
         ls_t012k   TYPE t012k,
         lt_t012t   TYPE TABLE OF t012t,
         ls_t012t   TYPE t012t,
         it_message TYPE bapirettab.
  "BAPI赋值
  is_db_amd-bukrs              = ls_head-bukrs .
  is_db_amd-acc_type_id        = ls_head-acc_type_id .
  IF ls_head-status IS NOT INITIAL .
    is_db_amd-status           = ls_head-status.
  ELSE .
    is_db_amd-status           = '01'.
  ENDIF .
  is_db_amd-banks              = ls_head-banks .
  is_db_amd-bankl              = ls_head-bankl .
  is_db_amd-acc_num            = ls_head-acc_num .
  is_db_amd-valid_from         = ls_head-valid_from .
  is_db_amd-valid_to           = ls_head-valid_to .
  is_db_amd-iban               = ls_head-iban .
  is_db_amd-bank_contact       = ls_head-bank_contact .
  is_db_amd-rel_manager        = ls_head-rel_manager .
  is_db_amd-company_contact    = ls_head-company_contact .
  is_db_amd-account_supervisor = ls_head-account_supervisor .
  is_db_amd-beneficial         = ls_head-beneficial .
  is_db_amd-created_at         = ls_head-created_at .
  is_db_amd-created_by         = ls_head-created_by .
  is_db_amd-created_at_dat     = ls_head-created_at_dat .
  is_db_amd-created_at_tim     = ls_head-created_at_tim .
  is_db_amd-opened_at          = ls_head-opened_at .
  is_db_amd-opened_by          = ls_head-opened_by .
  is_db_amd-opened_at_dat      = ls_head-opened_at_dat .
  is_db_amd-opened_at_tim      = ls_head-opened_at_tim .
  is_db_amd-changed_at         = ls_head-changed_at .
  is_db_amd-changed_by         = ls_head-changed_by .
  is_db_amd-changed_at_dat     = ls_head-changed_at_dat .
  is_db_amd-changed_at_tim     = ls_head-changed_at_tim .
  APPEND is_db_amd TO it_db_amd .
  CLEAR : is_db_amd .

  is_db_ac_link2-hbkid = ls_head-hbkid .
  is_db_ac_link2-hktid = ls_head-hktid .
  is_db_ac_link2-hkont = ls_head-hkont .

  DATA(lv_len) = cl_abap_list_utilities=>dynamic_output_length( ls_head-acc_num ).
  IF lv_len > 18 .
    is_db_ac_link2-bankn = ls_head-acc_num+0(18) .
    DATA(lv_fieldendnum) = lv_len - 18.
    is_db_ac_link2-refzl = ls_head-acc_num+18(lv_fieldendnum) .
  ELSE .
    is_db_ac_link2-bankn = ls_head-acc_num .
  ENDIF .
  APPEND is_db_ac_link2 TO it_db_ac_link2 .
  CLEAR : is_db_ac_link2 .

  is_db_amd_cur-waers = ls_head-waers .
  APPEND is_db_amd_cur TO it_db_amd_cur .
  CLEAR :is_db_amd_cur .

  IF ls_head-langu IS NOT INITIAL .
    is_db_amd_t-langu     = ls_head-langu .
  ELSE .
    is_db_amd_t-langu     = sy-langu .
  ENDIF .
  is_db_amd_t-description = ls_head-description .
  APPEND is_db_amd_t TO it_db_amd_t .
  CLEAR : is_db_amd_t .

  ls_t012k-bukrs = ls_head-bukrs .
  ls_t012k-hbkid = ls_head-hbkid .
  ls_t012k-hktid = ls_head-hktid .
  ls_t012k-bankn = ls_head-acc_num .
  ls_t012k-waers = ls_head-waers .
  ls_t012k-hkont = ls_head-hkont.
  APPEND ls_t012k TO lt_t012k .
  ls_t012t-bukrs = ls_head-bukrs .
  ls_t012t-spras = sy-langu .
  ls_t012t-hbkid = ls_head-hbkid .
  ls_t012t-hktid = ls_head-hktid .
  ls_t012t-text1 = ls_head-description .
  APPEND ls_t012t TO lt_t012t .
  "BAPI调用
  TRY.
      CALL FUNCTION 'FCLM_BAM_ACCOUNT_CREATE'
        EXPORTING
          it_db_amd      = it_db_amd
          it_db_amd_t    = it_db_amd_t
          it_db_amd_cur  = it_db_amd_cur
          it_db_ac_link2 = it_db_ac_link2
          is_commit      = 'X'
          iv_skipappproc = lv_skipappproc
        IMPORTING
          et_msg         = it_msg
        EXCEPTIONS
          failed         = 1
          cx_uuid_error  = 2
          OTHERS         = 3.
    CATCH cx_root INTO DATA(exception) .
      DATA(lv_message) = exception->get_text( ) .
  ENDTRY.

  LOOP AT  it_msg INTO DATA(is_msg) WHERE type CA 'EA' .
    es_msg = es_msg && is_msg-message .
    CLEAR : is_msg .
  ENDLOOP .
  IF sy-subrc = 0 OR lv_message IS NOT INITIAL .
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    es_msg = '银行账号维护失败:' && es_msg && lv_message.
    es_type = 'E' .
  ELSE .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    CALL METHOD cl_fclm_house_bank_account_api=>insert_house_bank_account
      EXPORTING
        it_t012k   = lt_t012k
        it_t012t   = lt_t012t
      IMPORTING
        et_message = it_message.
    LOOP AT it_message INTO is_msg WHERE type CA 'EA' .
      es_msg = es_msg && is_msg-type .
    ENDLOOP .
    IF sy-subrc = 0 .
      es_msg = '银行账号创建成功,插入开户行失败!' && es_msg .
      es_type = 'E' .
    ELSE .
      es_msg = '银行账号维护成功!' .
      es_type = 'S' .
    ENDIF .
  ENDIF.

ENDFUNCTION.

创建开户行
在修改开户行/银行账号的时候直接用BAPI_HOUSE_BANK_REPLICATE就行,但是这个BAPI因为里面的校验会导致有部分数据修改不了,所以我把这个bapi copy出来了

FUNCTION zhouse_bank_create.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(LS_HEAD) TYPE  ZPOCL_DT_OA015_REQ_INPUT
*"  EXPORTING
*"     REFERENCE(ES_TYPE) TYPE  BAPI_MTYPE
*"     REFERENCE(ES_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------

  DATA:ls_housebank        TYPE bapi_housebank,
       ls_parameter        TYPE bapi_hbankparameter,
       ls_return           TYPE bapiret2,
       lt_return           TYPE TABLE OF bapiret2,
       lt_bankaccount      TYPE TABLE OF bapi_housebankaccount,
       lt_hbankaccountname TYPE TABLE OF bapi_hbankaccountname.

*Transfer structure object t012:House Bank
  ls_housebank-bukrs = ls_head-bukrs.
  ls_housebank-hbkid = ls_head-hbkid.
  ls_housebank-banks = ls_head-banks.
  ls_housebank-bankl = ls_head-bankl.

* Parameters for DMEs and foreign pmnt transactions
  ls_parameter-bukrs = ls_head-bukrs.
  ls_parameter-hbkid = ls_head-hbkid.

  APPEND INITIAL LINE TO lt_bankaccount ASSIGNING FIELD-SYMBOL(<fs_bankaccount>).
*Transfer structure object T012K: House Bank Account
  <fs_bankaccount>-bukrs = ls_head-bukrs.
  <fs_bankaccount>-hbkid = ls_head-hbkid.
  <fs_bankaccount>-hktid = ls_head-hktid.
  DATA(lv_len) = cl_abap_list_utilities=>dynamic_output_length( ls_head-acc_num ).
  IF lv_len > 18 .
    <fs_bankaccount>-bankn = ls_head-acc_num+0(18) .
    DATA(lv_fieldendnum) = lv_len - 18.
    <fs_bankaccount>-refzl = ls_head-acc_num+18(lv_fieldendnum) .
  ELSE .
    <fs_bankaccount>-bankn = ls_head-acc_num .
  ENDIF .
  <fs_bankaccount>-waers = ls_head-waers .
  <fs_bankaccount>-hkont = ls_head-hkont.

  APPEND INITIAL LINE TO lt_hbankaccountname ASSIGNING FIELD-SYMBOL(<fs_hbankaccountname>).
  <fs_hbankaccountname>-spras = sy-langu.
  <fs_hbankaccountname>-bukrs = ls_head-bukrs.
  <fs_hbankaccountname>-hbkid = ls_head-hbkid.
  <fs_hbankaccountname>-hktid = ls_head-hktid.
  <fs_hbankaccountname>-text1 = ls_head-description.
  CALL FUNCTION 'ZBAPI_HOUSE_BANK_REPLICATE'
    EXPORTING
      is_housebank        = ls_housebank
      is_hbankparameter   = ls_parameter
    IMPORTING
      return              = ls_return
    TABLES
      it_housebankaccount = lt_bankaccount
      it_hbankaccountname = lt_hbankaccountname
      et_return           = lt_return.

  LOOP AT lt_return INTO ls_return WHERE type CA 'EA' .
    es_msg = es_msg && ls_return-message .
  ENDLOOP .
  IF sy-subrc = 0 .
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    es_type = 'E' .
    es_msg = '开户行维护失败' && es_msg .
  ELSE .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    es_type = 'S' .
    es_msg = '开户行维护成功!' .
  ENDIF .

ENDFUNCTION.

BAPI :ZBAPI_HOUSE_BANK_REPLICATE

FUNCTION zbapi_house_bank_replicate.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IS_HOUSEBANK) TYPE  BAPI_HOUSEBANK OPTIONAL
*"     VALUE(IS_HBANKPARAMETER) TYPE  BAPI_HBANKPARAMETER OPTIONAL
*"     VALUE(IS_BANK) TYPE  BAPI_BANK OPTIONAL
*"  EXPORTING
*"     VALUE(RETURN) TYPE  BAPIRET2
*"  TABLES
*"      IT_HOUSEBANKACCOUNT STRUCTURE  BAPI_HOUSEBANKACCOUNT OPTIONAL
*"      IT_HBANKACCOUNTNAME STRUCTURE  BAPI_HBANKACCOUNTNAME OPTIONAL
*"      ET_RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
  DATA :ls_return TYPE bapiret2,
        lt_return TYPE bapiret2_t.
  DATA :ls_t012                      TYPE t012,
        ls_t012d                     TYPE t012d,
        ls_t012k                     TYPE t012k,
        ls_t012t                     TYPE LINE OF fclm_t_hbankaccountname,
        ls_housebankaccount          TYPE bapi_housebankaccount,
        ls_hbankaccountname          TYPE bapi_hbankaccountname,
        lt_t012k                     TYPE TABLE OF t012k,
        lt_t012t                     TYPE TABLE OF t012t,
        lo_badi_ff_house_bank_extend TYPE REF TO ff_house_bank_extend,
        lt_t012t_cpy                 TYPE fclm_t_hbankaccountname.
  "NOTE:2613677 Replication Tool: Filter doesnot work on Change Mode Insert START
  DATA: ls_t012_exist TYPE t012.
  "NOTE:2613677 Insert END
  DATA: ls_t012d_exist TYPE t012d.

* Security note 2734675 start
  DATA: lv_actvt TYPE activ_auth,
        lo_hbank TYPE REF TO cl_fclm_bam_house_bank_api.
  "NOTE:2613677 Replication Tool: Filter doesnot work on Change Mode Insert START
  "compare house bank data does not change, the house bank account only change
  IF ls_t012 IS NOT INITIAL.
    SELECT SINGLE *
      INTO ls_t012_exist
      FROM t012
      WHERE bukrs = ls_t012-bukrs
      AND   hbkid = ls_t012-hbkid.
    CLEAR ls_t012_exist-mandt.
    IF ls_t012_exist EQ ls_t012 AND is_housebank-deletion_flag IS INITIAL.
      CLEAR ls_t012.
    ENDIF.
  ENDIF.
  "NOTE:2613677 Insert END

  IF ls_t012d IS NOT INITIAL.
    SELECT SINGLE *
      INTO ls_t012d_exist
      FROM t012d
      WHERE bukrs = ls_t012d-bukrs
      AND   hbkid = ls_t012d-hbkid.
    CLEAR ls_t012d_exist-mandt.
    IF ls_t012d_exist EQ ls_t012d.
      CLEAR ls_t012d.
    ENDIF.
  ENDIF.

  IF ls_t012 IS NOT INITIAL OR ls_t012d IS NOT INITIAL.
    MOVE-CORRESPONDING is_housebank TO ls_t012 .
    MOVE-CORRESPONDING is_hbankparameter TO ls_t012d .
    "update house bank master data
    CALL FUNCTION 'HOUSE_BANK_REPLICATE'
      EXPORTING
        iv_deletion_flag = is_housebank-deletion_flag
        is_t012          = ls_t012
        is_t012d         = ls_t012d
      IMPORTING
        et_return        = et_return[].

    CHECK et_return[] IS INITIAL .
    "when one house bank deleted,delete all house bank account in house bank
    IF is_housebank-deletion_flag = 'X'.
      SELECT * INTO TABLE lt_t012k FROM t012k
        WHERE bukrs = is_housebank-bukrs
        AND   hbkid = is_housebank-hbkid.

      LOOP AT lt_t012k INTO ls_t012k.
        CALL FUNCTION 'HOUSE_BANK_ACCOUNT_REPLICATE'
          EXPORTING
            iv_deletion_flag = 'X'
            is_t012k         = ls_t012k
          IMPORTING
            et_return        = et_return[].
      ENDLOOP.

    ELSE.

      "update house bank account
      LOOP AT it_housebankaccount INTO ls_housebankaccount.

        MOVE-CORRESPONDING ls_housebankaccount TO ls_t012k.
        LOOP AT it_hbankaccountname INTO ls_hbankaccountname
           WHERE  bukrs = ls_t012k-bukrs
           AND    hbkid = ls_t012k-hbkid
           AND    hktid = ls_t012k-hktid .

          MOVE-CORRESPONDING ls_hbankaccountname TO ls_t012t.
          APPEND ls_t012t TO lt_t012t_cpy.
        ENDLOOP.

        CALL FUNCTION 'HOUSE_BANK_ACCOUNT_REPLICATE'
          EXPORTING
            iv_deletion_flag    = ls_housebankaccount-deletion_flag
            iv_check_hbank_flag = '' "doesn't chek if house bank exist
            is_t012k            = ls_t012k
            it_hbankacctname    = lt_t012t_cpy
          IMPORTING
            et_return           = lt_return.

        APPEND LINES OF lt_return TO et_return[].
        CLEAR : lt_t012t_cpy,
                lt_return.

      ENDLOOP.

      CHECK et_return[] IS INITIAL .
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

    ENDIF.

  ELSE.
    "NO house bank data filled ,Only update house bank account
    LOOP AT it_housebankaccount INTO ls_housebankaccount.

      MOVE-CORRESPONDING ls_housebankaccount TO ls_t012k.
      LOOP AT it_hbankaccountname INTO ls_hbankaccountname
         WHERE  bukrs = ls_t012k-bukrs
         AND    hbkid = ls_t012k-hbkid
         AND    hktid = ls_t012k-hktid .

        MOVE-CORRESPONDING ls_hbankaccountname TO ls_t012t.
        APPEND ls_t012t TO lt_t012t_cpy.
      ENDLOOP.

      CALL FUNCTION 'HOUSE_BANK_ACCOUNT_REPLICATE'
        EXPORTING
          iv_deletion_flag    = ls_housebankaccount-deletion_flag
          iv_check_hbank_flag = 'X'
          is_t012k            = ls_t012k
          it_hbankacctname    = lt_t012t_cpy
        IMPORTING
          et_return           = lt_return.

      APPEND LINES OF lt_return TO et_return[].
      CLEAR : lt_t012t_cpy,
              lt_return.

    ENDLOOP.
    CHECK et_return[] IS INITIAL .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

  ENDIF.

ENDFUNCTION.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

消气伟消消气

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

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

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

打赏作者

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

抵扣说明:

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

余额充值