在执行完函数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.