BP 增强针对 IBAN 的检查
【摘要】 最近一段时间研究对 BP 界面的银行信息进行增强,对 BP 的银行信息的维护时需要做一定的限制, 因为在 BP 界面如果没有找到银行码(bank key)的情况下,可以在 BP 界面弹出对银行主数据的维护,这一点容易导致银行主数据的混乱。对 BP 的消息框弹出可以调用 BUS_MESSAGE_STORE 函数,当然也有试过直接用 MESSAGE 但是不容易退出,还是系统标准的好用,何乐而不为...
最近一段时间研究对 BP 界面的银行信息进行增强,对 BP 的银行信息的维护时需要做一定的限制, 因为在 BP 界面如果没有找到银行码(bank key)的情况下,可以在 BP 界面弹出对银行主数据的维护,这一点容易导致银行主数据的混乱。
对 BP 的消息框弹出可以调用 BUS_MESSAGE_STORE
函数,当然也有试过直接用 MESSAGE
但是不容易退出,还是系统标准的好用,何乐而不为?开整
操作步骤
- 进入事务码
BUS7
(事件视图)然后进入,能看到这个界面,选择DCHCK
:
双击左侧的 “Event->Function Module”,进入事件
DCHCK
单击 New Entries(新条目),填入以下内容:
在这个新增的检查事件新条目中:
- item 需要一个唯一值( item 编号必须是唯一的,它被用来确定函数模块的调用顺序的。)
- 函数模块是自定义的,此处名称可以填
ZIBAN_MAND_BUPA_EVENT_DCHCK
,待会我们将在 SE37 中创建 - 标记调用 Call 一栏为 “X”(Call = ‘X’ 定义了该模块将只为应用程序标签中提到的应用程序调用,这里也就是 BP 中调用。)
- Appl. (应用程序)一栏填 “BUP”
- 保存后可以看到如下的已经添加好的事件:
- 进入事务码
SE37
,输入ZIBAN_MAND_BUPA_EVENT_DCHCK
,如下:
- 单击创建(Create),然后再源代码(Source Code )中写入如下代码:
FUNCTION ziban_mand_bupa_event_dchck.
*"----------------------------------------------------------------------
*"*"本地接口:
*"----------------------------------------------------------------------
DATA: lt_but0bk TYPE TABLE OF but0bk WITH HEADER LINE,
lt_but0bk_old TYPE TABLE OF but0bk WITH HEADER LINE,
lv_bankl TYPE bankl,
lv_bankn TYPE bankn,
lv_bkont TYPE bkont,
lv_bkref TYPE bkref,
lv_bnklz TYPE bankl,
wa_tiban TYPE tiban,
ls_but0bk TYPE but0bk,
lv_ac_number_tiban TYPE tiban-bankn.
DATA: lv_bank_account(18) TYPE c,
lv_control_key TYPE knbk_bf-bkont,
lv_bank_country TYPE knbk_bf-banks,
lv_bank_number TYPE bnka-bnklz.
*Get the local memory of but0bk table
CALL FUNCTION 'BUP_BUPA_BUT0BK_GET'
TABLES
t_but0bk = lt_but0bk
t_but0bk_old = lt_but0bk_old.
*check if the data is changed in but0bk and also there is no data in local tiban
*CHECK lt_but0bk[] NE lt_but0bk_old[].
*check if bank details are empty, then nothing to check
CHECK lt_but0bk[] IS NOT INITIAL.
* if local memory is not initial, get the tiban local memory and
* check if its empty, then show error message.
IF lt_but0bk IS NOT INITIAL.
LOOP AT lt_but0bk INTO ls_but0bk WHERE iban = '' .
CLEAR: lv_bank_account, lv_control_key,lv_bank_country, lv_bank_number.
lv_ac_number_tiban = ls_but0bk-bankn.
CALL FUNCTION 'READ_IBAN_INT'
EXPORTING
i_banks = ls_but0bk-banks
i_bankl = ls_but0bk-bankl
i_bankn = lv_ac_number_tiban
i_bkont = ls_but0bk-bkont
IMPORTING
e_iban_wa = wa_tiban.
IF wa_tiban-iban IS NOT INITIAL.
CALL FUNCTION 'CONVERT_IBAN_2_BANK_ACCOUNT'
EXPORTING
i_iban = wa_tiban-iban
IMPORTING
e_bank_account = lv_bank_account
e_bank_control_key = lv_control_key
e_bank_country = lv_bank_country
e_bank_number = lv_bank_number
EXCEPTIONS
no_conversion = 1
OTHERS = 2.
IF sy-subrc = 0.
" BP 界面不给权限创建全新 IBAN 的银行信息
SELECT SINGLE bnklz INTO lv_bnklz FROM bnka WHERE banks = ls_but0bk-banks
AND bankl = ls_but0bk-bankl AND loevm <> 'X'.
IF lv_bnklz IS INITIAL.
CALL FUNCTION 'BUS_MESSAGE_STORE'
EXPORTING
arbgb = 'BF00'
msgty = 'E'
txtnr = 228
tbfld_strg = 'GT_BUT0BK-BKVID'.
ELSE.
" 如果当前 IBAN 的银行编号与银行主数据的银行编号不一致,报银行编号错误
SELECT COUNT(*) FROM bnka WHERE banks = lv_bank_country AND
bankl = ls_but0bk-bankl AND bnklz = lv_bank_number AND loevm <> 'X'.
IF sy-subrc <> 0.
CALL FUNCTION 'BUS_MESSAGE_STORE'
EXPORTING
arbgb = 'BF00'
msgty = 'E'
txtnr = 019
msgv1 = lv_bank_number
msgv2 = lv_bnklz
tbfld_strg = 'GT_BUT0BK-BKVID'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDFUNCTION.
实现效果
- 如果是一个全新的 IBAN 填入,在 BP 界面保存或者检查的时候,会弹出下面的错误:
- 如果因为填了 SWIFT/BIC 或者填了银行代码,带出系统中已经存在的银行信息,会将当前 IBAN 生成的 Bank Number 与银行主数据中存在的银行信息的 Bank Number 作匹配,不一致会报下面的错误:
自此,才实现了财务的需求。
IBAN 不能为空限定
当然,如果你想让限制 IBAN 不能为空的情况,可以使用如下的代码:
FUNCTION ZIBAN_MAND_BUPA_EVENT_DCHCK.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"----------------------------------------------------------------------
DATA: lt_but0bk TYPE TABLE OF but0bk WITH HEADER LINE,
lt_but0bk_old TYPE TABLE OF but0bk WITH HEADER LINE,
lv_bankl TYPE bankl,
lv_bankn TYPE bankn,
lv_bkont TYPE bkont,
lv_bkref TYPE bkref,
wa_tiban TYPE TIBAN,
ls_but0bk TYPE but0bk,
lv_ac_number_tiban TYPE TIBAN-BANKN.
*Get the local memory of but0bk table
CALL FUNCTION 'BUP_BUPA_BUT0BK_GET'
TABLES
t_but0bk = lt_but0bk
t_but0bk_old = lt_but0bk_old.
*check if the data is changed in but0bk and also there is no data in local tiban
*CHECK lt_but0bk[] NE lt_but0bk_old[].
*check if bank details are empty, then nothing to check
CHECK lt_but0bk[] is NOT INITIAL.
* if local memory is not initial, get the tiban local memory and
* check if its empty, then show error message.
IF lt_but0bk is NOT INITIAL.
LOOP AT lt_but0bk INTO ls_but0bk WHERE iban = '' and ( BANKS = 'DE' OR BANKS = 'BG' ) .
lv_ac_number_tiban = ls_but0bk-bankn.
CALL FUNCTION 'READ_IBAN_INT'
EXPORTING
I_BANKS = ls_but0bk-banks
I_BANKL = ls_but0bk-bankl
I_BANKN = lv_ac_number_tiban
I_BKONT = ls_but0bk-bkont
IMPORTING
E_IBAN_WA = wa_tiban.
IF wa_tiban is INITIAL.
* IBAN is not maintained Enter an IBAN
CALL FUNCTION 'BUS_MESSAGE_STORE'
EXPORTING
ARBGB = 'BF00'
MSGTY = 'E'
TXTNR = 021
tbfld_strg = 'GT_BUT0BK-BKVID'.
RETURN.
ENDIF.
ENDLOOP.
ENDIF.
ENDFUNCTION.
参考链接:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)