BP 增强针对 IBAN 的检查

举报
雨绸缪 发表于 2023/07/31 17:47:33 2023/07/31
【摘要】 最近一段时间研究对 BP 界面的银行信息进行增强,对 BP 的银行信息的维护时需要做一定的限制, 因为在 BP 界面如果没有找到银行码(bank key)的情况下,可以在 BP 界面弹出对银行主数据的维护,这一点容易导致银行主数据的混乱。对 BP 的消息框弹出可以调用 BUS_MESSAGE_STORE 函数,当然也有试过直接用 MESSAGE 但是不容易退出,还是系统标准的好用,何乐而不为...

最近一段时间研究对 BP 界面的银行信息进行增强,对 BP 的银行信息的维护时需要做一定的限制, 因为在 BP 界面如果没有找到银行码(bank key)的情况下,可以在 BP 界面弹出对银行主数据的维护,这一点容易导致银行主数据的混乱。

对 BP 的消息框弹出可以调用 BUS_MESSAGE_STORE 函数,当然也有试过直接用 MESSAGE 但是不容易退出,还是系统标准的好用,何乐而不为?开整

操作步骤

  1. 进入事务码 BUS7 (事件视图)然后进入,能看到这个界面,选择 DCHCK :

image.png

  1. 双击左侧的 “Event->Function Module”,进入事件 DCHCK

  2. 单击 New Entries(新条目),填入以下内容:

image.png

在这个新增的检查事件新条目中:

  • item 需要一个唯一值( item 编号必须是唯一的,它被用来确定函数模块的调用顺序的。)
  • 函数模块是自定义的,此处名称可以填 ZIBAN_MAND_BUPA_EVENT_DCHCK,待会我们将在 SE37 中创建
  • 标记调用 Call 一栏为 “X”(Call = ‘X’ 定义了该模块将只为应用程序标签中提到的应用程序调用,这里也就是 BP 中调用。)
  • Appl. (应用程序)一栏填 “BUP”
  1. 保存后可以看到如下的已经添加好的事件:

image.png

  1. 进入事务码 SE37,输入 ZIBAN_MAND_BUPA_EVENT_DCHCK,如下:

image.png

  1. 单击创建(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.

实现效果

  1. 如果是一个全新的 IBAN 填入,在 BP 界面保存或者检查的时候,会弹出下面的错误:

image.png

  1. 如果因为填了 SWIFT/BIC 或者填了银行代码,带出系统中已经存在的银行信息,会将当前 IBAN 生成的 Bank Number 与银行主数据中存在的银行信息的 Bank Number 作匹配,不一致会报下面的错误:

image.png

自此,才实现了财务的需求。

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。