SAP ABAP 实现类似百度谷歌搜索引擎基础算法之一的,编辑距离算法

Abap实现类似百度谷歌搜索引擎实现 模糊搜索 拼写纠错 算法

这份代码是一个企业级的高级数据对账工具(供应商银行数据双向核对报表)。它主要用于解决 SAP 系统与外部 SRM(供应商关系管理)系统之间,因为手工录入、接口异常或历史遗留问题导致的数据不一致问题。

以下是该程序的核心功能与优势的简单介绍:

🌟 核心功能 (What it does)

  1. 双向对账模式 (Two-Way Reconciliation)

    • 以 SAP 为准:查出 SAP 中的所有数据,去 SRM 里面找有没有对应的记录。用于发现"SAP 有,但 SRM 漏传/未维护"的数据。

    • 以 SRM 为准:查出 SRM 中的所有数据,去 SAP 里面找。用于发现"SRM 推送了,但 SAP 没建成功"的数据孤岛。

  2. "类人脑"的模糊匹配打分 (Fuzzy Matching & Scoring)

    • 它不是死板地要求数据 100% 一致。它会自动去除账号前面的 0 和所有的空格,忽略大小写。

    • 如果账号输错了一两位(比如 123456 输成了 123546),程序会利用 Levenshtein(编辑距离)算法 算出相似度得分,自动把最像的那条数据拉过来给你看。

  3. 国家差异化比对 (Country-Specific Logic)

    • 针对中国 (CN) 业务:专门比对"联行号/银行代码 (BANKL)"。

    • 针对海外 (非 CN) 业务:专门比对"SWIFT Code/外部银行标识 (BKEXT)"。

    • 同时独立比对"账户持有人"和"开户行地址"。

  4. 单元格级红绿染色 (Cell-Level Color Coding)

    • 基准数据永远是绿色;匹配上的数据是绿色;没匹配上、漏维护或相似度不够的数据是红色。业务人员一眼扫过去就知道哪里有问题。

🚀 核心优势 (Why it's great)

  1. 极高的容错率,解放业务双手 (High Tolerance)

    • 传统报表经常因为多打了一个空格(如 Bank of ChinaBankofChina)就报错说不一致,导致业务人员需要人工排查大量"假报错"。这个程序内置的"清洗+算法"机制直接秒杀了这类问题,只暴露出真正错误的数据。
  2. 性能强悍,运行飞快 (High Performance)

    • 完美避开了 ABAP 语法陷阱 :巧妙地将复杂的关联运算(JOIN、字符串拼接、CASE WHEN)推给 SAP HANA 数据库层处理,然后再用 FOR ALL ENTRIES 抓取 SRM 数据,彻底杜绝语法 Dump。

    • 内存级提速 :在双层大循环比对中,使用了 SORT + BINARY SEARCH(二分法查找),即便对比几万家供应商,也能在几秒内瞬间出结果。

  3. 逻辑透明,极具可信度 (Transparent UX)

    • 增加的 "匹配得分 (Match Score)" 字段是点睛之笔。它告诉用户"为什么系统认为这两条数据是匹配的"(比如 100分是完美,85分是手误输错一位,30分是只包含了部分字符),让系统不再是个黑盒。
  4. 一键跳转修正 (Actionable)

    • 左上角集成了"维护 SRM 数据表"的按钮,业务人员看到红色的错误行,可以直接点按钮跳过去修改,实现了 "发现问题 -> 解决问题" 的业务闭环。

总而言之,这段代码不仅仅是一个查询报表,而是一个自带智能纠错和数据清洗功能的数据治理工具 ,非常适合放在核心主数据的运维和排错场景中!

复制代码
*&---------------------------------------------------------------------*
*& Report ZVENDOR_BANK_REP
*& Description: Vendor Bank Two-Way Reconciliation Report (with Country-Specific Checks)
*&---------------------------------------------------------------------*
REPORT zvendor_bank_rep.

TABLES: lfb1, sscrfields, zsrmsupplier.

" ==========================================
" 1. Selection Screen Definition
" ==========================================
SELECTION-SCREEN FUNCTION KEY 1. " SM30 Maintenance Button

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: s_lifnr FOR lfb1-lifnr, " Vendor Number
                  s_bukrs FOR lfb1-bukrs. " Company Code
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
  PARAMETERS: p_sap RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND mode, " Based on SAP Data
              p_srm RADIOBUTTON GROUP g1.                               " Based on SRM Data
SELECTION-SCREEN END OF BLOCK b2.

DATA: go_alv TYPE REF TO cl_salv_table.

" ==========================================
" 2. Structure Definition (Includes 12 new detail comparison columns)
" ==========================================
TYPES: BEGIN OF ty_alv_final,
         lifnr         TYPE lfb1-lifnr,
         banka         TYPE bnka-banka,
         payee_address TYPE char255,
         bk_valid_from TYPE dats,
         bk_valid_to   TYPE dats,
         partner       TYPE but0bk-partner,
         bkvid         TYPE but0bk-bkvid,
         banks         TYPE lfbk-banks,
         bankl         TYPE lfbk-bankl,
         bankn         TYPE lfbk-bankn,
         bkref         TYPE lfbk-bkref,
         banknew       TYPE string,
         koinh         TYPE lfbk-koinh,
         bkext         TYPE but0bk-bkext,

         " --- Basic Account Matching ---
         sap_banks     TYPE lfbk-banks,
         sap_lifnr     TYPE lfb1-lifnr,
         sap_banknew   TYPE string,
         srm_banks     TYPE zsrmsupplier-zbank_country,
         srm_lifnr     TYPE zsrmsupplier-zsap_sup_no,
         srm_banknew   TYPE zsrmsupplier-zacc_code,
         match_status  TYPE char20,
         match_score   TYPE i,

         " --- Specific Check: Account Holder ---
         sap_koinh     TYPE lfbk-koinh,
         srm_zaccount  TYPE zsrmsupplier-zaccount,
         match_koinh   TYPE char20,

         " --- Specific Check: Bank Key (CN) ---
         sap_bankl     TYPE lfbk-bankl,
         srm_zbank_code  TYPE zsrmsupplier-zbank_code,
         match_bankl   TYPE char20,

         " --- Specific Check: External Bank ID (Non-CN) ---
         sap_bkext     TYPE but0bk-bkext,
         srm_zswift_code TYPE zsrmsupplier-zswift_code,
         match_bkext   TYPE char20,

         " --- Specific Check: Bank Address ---
         sap_address   TYPE char255,
         srm_zbank_addr  TYPE zsrmsupplier-zbank_addr,
         match_addr    TYPE char20,

         " --- Color Control Column ---
         t_color       TYPE lvc_t_scol,
       END OF ty_alv_final.

DATA: gt_alv_final TYPE TABLE OF ty_alv_final.

" ==========================================
" 3. Screen Event Handling
" ==========================================

INITIALIZATION.
  DATA: ls_button TYPE smp_dyntxt.
  ls_button-icon_id   = '@4O@'.
  ls_button-icon_text = 'Maintain SRM Vendor Data'.
  sscrfields-functxt_01 = ls_button.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
        EXPORTING
          action    = 'U'
          view_name = 'ZSRMSUPPLIER'
        EXCEPTIONS
          OTHERS    = 14.
  ENDCASE.

  " ==========================================
  " 4. Main Program Execution Logic
  " ==========================================

START-OF-SELECTION.

  " Fetch all SAP bank data (Avoid FOR ALL ENTRIES for complex queries)
  SELECT DISTINCT
         a~lifnr, d~banka,
         CASE WHEN e~raddr IS NOT NULL AND e~raddr <> @space THEN e~raddr ELSE f~stras END AS payee_address,
         CAST( substring( CAST( c~bk_valid_from AS CHAR ), 1, 8 ) AS DATS ) AS bk_valid_from,
         CAST( substring( CAST( c~bk_valid_to AS CHAR ), 1, 8 ) AS DATS ) AS bk_valid_to,
         c~partner, c~bkvid, b~banks, b~bankl, b~bankn, b~bkref, b~koinh, c~bkext,
         ( b~bankn && b~bkref ) AS banknew
    FROM lfb1 AS a
    INNER JOIN lfa1 AS f ON a~lifnr = f~lifnr
    INNER JOIN lfbk AS b ON a~lifnr = b~lifnr
    LEFT OUTER JOIN but0bk AS c ON b~lifnr = c~partner AND b~banks = c~banks AND b~bankl = c~bankl AND b~bankn = c~bankn
    LEFT OUTER JOIN bnka AS d ON b~banks = d~banks AND b~bankl = d~bankl
    LEFT OUTER JOIN zfit078_l AS e ON b~bankl = e~bankl AND ( b~bankn && b~bkref ) = e~bankn
    WHERE a~lifnr IN @s_lifnr AND a~bukrs IN @s_bukrs
  ORDER BY a~lifnr
  INTO TABLE @DATA(lt_sap_banks).

  " Fetch baseline scope to retrieve SRM data
  SELECT lifnr FROM lfb1
  WHERE lifnr IN @s_lifnr AND bukrs IN @s_bukrs
  INTO TABLE @DATA(lt_target_lifnrs).

  IF lt_target_lifnrs IS INITIAL.
    MESSAGE 'No SAP vendor data found matching the selection criteria' TYPE 'S' DISPLAY LIKE 'W'.
    RETURN.
  ENDIF.

  " Fetch all SRM bank data
  SELECT FROM zsrmsupplier AS a
    FIELDS a~zsup_code, a~zsap_sup_no, a~zacc_code, a~zbank_country, a~zbank,
           a~zaccount, a~zbank_code, a~zswift_code, a~zbank_addr
    FOR ALL ENTRIES IN @lt_target_lifnrs
  WHERE a~zsap_sup_no = @lt_target_lifnrs-lifnr
  INTO TABLE @DATA(lt_srm_banks).

  SORT lt_sap_banks BY lifnr.
  SORT lt_srm_banks BY zsap_sup_no.

  " ==========================================
  " ★ Macro Definitions ★
  " ==========================================
  DATA: lv_sap_acc   TYPE string,
        lv_srm_acc   TYPE string,
        lv_score     TYPE i,
        lv_max_score TYPE i,
        lv_dist      TYPE i,
        lv_len       TYPE i,
        lv_v1        TYPE string,
        lv_v2        TYPE string,
        lv_country   TYPE lfbk-banks.

  " Macro 1: Quick Add Color
  DEFINE add_cell_color.
    APPEND VALUE #( fname = &1 color-col = &2 color-int = 0 color-inv = 0 ) TO ls_final-t_color.
  END-OF-DEFINITION.

  " Macro 2: High-tolerance space removal, uppercase compare (5=Green, 6=Red)
  DEFINE macro_compare.
    " &1=sap val, &2=srm val, &3=result field, &4=sap col, &5=srm col, &6=result col
    lv_v1 = &1. CONDENSE lv_v1 NO-GAPS. TRANSLATE lv_v1 TO UPPER CASE.
    lv_v2 = &2. CONDENSE lv_v2 NO-GAPS. TRANSLATE lv_v2 TO UPPER CASE.

    IF lv_v1 = lv_v2 AND lv_v1 IS NOT INITIAL.
      &3 = 'Yes'.
      add_cell_color: &4 5, &5 5, &6 5.
    ELSE.
      &3 = 'No'.
      add_cell_color: &4 5, &5 6, &6 6. " Baseline is green, unmatched target is red
    ENDIF.
  END-OF-DEFINITION.

  CLEAR gt_alv_final.

  " ==========================================
  " Two-way matching and rendering core logic
  " ==========================================
  IF p_sap = 'X'.
    " ---------------- Mode 1: SAP Baseline ----------------
    LOOP AT lt_sap_banks INTO DATA(ls_sap).
      DATA(ls_final) = VALUE ty_alv_final( ).
      MOVE-CORRESPONDING ls_sap TO ls_final.

      ls_final-sap_banks   = ls_sap-banks.
      ls_final-sap_lifnr   = ls_sap-lifnr.
      ls_final-sap_banknew = ls_sap-banknew.

      " Load SAP specific comparison data
      ls_final-sap_koinh   = ls_sap-koinh.
      ls_final-sap_bankl   = ls_sap-bankl.
      ls_final-sap_bkext   = ls_sap-bkext.
      ls_final-sap_address = ls_sap-payee_address.

      lv_max_score = 0.
      DATA: ls_best_match_srm LIKE LINE OF lt_srm_banks.
      CLEAR ls_best_match_srm.

      READ TABLE lt_srm_banks TRANSPORTING NO FIELDS WITH KEY zsap_sup_no = ls_sap-lifnr BINARY SEARCH.
      IF sy-subrc = 0.
        LOOP AT lt_srm_banks INTO DATA(ls_srm) FROM sy-tabix.
          IF ls_srm-zsap_sup_no <> ls_sap-lifnr.
            EXIT.
          ENDIF.

          " Advanced scoring logic (find most similar account)
          lv_score = 0.
          IF ls_srm-zbank_country = ls_sap-banks AND ls_srm-zacc_code = ls_sap-banknew.
            lv_score = 100.
          ELSE.
            lv_score = 10.
            IF ls_srm-zbank_country = ls_sap-banks.
              lv_score = lv_score + 20.
            ENDIF.
            lv_sap_acc = ls_sap-banknew. lv_srm_acc = ls_srm-zacc_code.
            SHIFT lv_sap_acc LEFT DELETING LEADING '0'.
            SHIFT lv_srm_acc LEFT DELETING LEADING '0'.
            CONDENSE lv_sap_acc NO-GAPS.
            CONDENSE lv_srm_acc NO-GAPS.
            IF lv_sap_acc = lv_srm_acc AND lv_sap_acc IS NOT INITIAL.
              lv_score = lv_score + 70.
            ELSEIF lv_sap_acc IS NOT INITIAL AND lv_srm_acc IS NOT INITIAL.
              lv_dist = distance( val1 = lv_sap_acc val2 = lv_srm_acc ).
              lv_len  = nmax( val1 = strlen( lv_sap_acc ) val2 = strlen( lv_srm_acc ) ).
              lv_score = lv_score + ( ( ( lv_len - lv_dist ) * 60 ) / lv_len ).
            ENDIF.
          ENDIF.

          IF lv_score > lv_max_score.
            lv_max_score = lv_score.
            ls_best_match_srm = ls_srm.
          ENDIF.
          IF lv_max_score = 100.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.

      ls_final-match_score = lv_max_score.

      " Load SRM specific comparison data
      IF lv_max_score > 0.
        ls_final-srm_banks       = ls_best_match_srm-zbank_country.
        ls_final-srm_lifnr       = ls_best_match_srm-zsap_sup_no.
        ls_final-srm_banknew     = ls_best_match_srm-zacc_code.
        ls_final-srm_zaccount    = ls_best_match_srm-zaccount.
        ls_final-srm_zbank_code  = ls_best_match_srm-zbank_code.
        ls_final-srm_zswift_code = ls_best_match_srm-zswift_code.
        ls_final-srm_zbank_addr  = ls_best_match_srm-zbank_addr.
      ENDIF.

      " --- Determine main match status ---
      IF lv_max_score = 100.
        ls_final-match_status = 'Exact Match'.
        add_cell_color: 'SAP_BANKS' 5, 'SAP_LIFNR' 5, 'SAP_BANKNEW' 5, 'SRM_BANKS' 5, 'SRM_LIFNR' 5, 'SRM_BANKNEW' 5, 'MATCH_STATUS' 5, 'MATCH_SCORE' 5.
      ELSEIF lv_max_score > 0.
        ls_final-match_status = 'Fuzzy Match'.
        add_cell_color: 'SAP_BANKS' 5, 'SAP_LIFNR' 5, 'SAP_BANKNEW' 5, 'SRM_BANKS' 6, 'SRM_LIFNR' 6, 'SRM_BANKNEW' 6, 'MATCH_STATUS' 6, 'MATCH_SCORE' 6.
      ELSE.
        ls_final-match_status = 'Not in SRM'.
        add_cell_color: 'SAP_BANKS' 5, 'SAP_LIFNR' 5, 'SAP_BANKNEW' 5, 'SRM_BANKS' 6, 'SRM_LIFNR' 6, 'SRM_BANKNEW' 6, 'MATCH_STATUS' 6, 'MATCH_SCORE' 6.
      ENDIF.

      " ====================================================
      " ★ Core specific field comparison logic (differentiated by country) ★
      " ====================================================
      lv_country = ls_final-sap_banks. " Take SAP country as SAP baseline

      IF lv_country = 'CN'.
        macro_compare ls_final-sap_koinh   ls_final-srm_zaccount   ls_final-match_koinh  'SAP_KOINH'   'SRM_ZACCOUNT'   'MATCH_KOINH'.
        macro_compare ls_final-sap_bankl   ls_final-srm_zbank_code ls_final-match_bankl  'SAP_BANKL'   'SRM_ZBANK_CODE' 'MATCH_BANKL'.
        macro_compare ls_final-sap_address ls_final-srm_zbank_addr ls_final-match_addr   'SAP_ADDRESS' 'SRM_ZBANK_ADDR' 'MATCH_ADDR'.
        ls_final-match_bkext = 'N/A (Non-CN Only)'.
      ELSE.
        macro_compare ls_final-sap_koinh   ls_final-srm_zaccount    ls_final-match_koinh  'SAP_KOINH'   'SRM_ZACCOUNT'    'MATCH_KOINH'.
        macro_compare ls_final-sap_bkext   ls_final-srm_zswift_code ls_final-match_bkext  'SAP_BKEXT'   'SRM_ZSWIFT_CODE' 'MATCH_BKEXT'.
        macro_compare ls_final-sap_address ls_final-srm_zbank_addr  ls_final-match_addr   'SAP_ADDRESS' 'SRM_ZBANK_ADDR'  'MATCH_ADDR'.
        ls_final-match_bankl = 'N/A (CN Only)'.
      ENDIF.

      APPEND ls_final TO gt_alv_final.
    ENDLOOP.

  ELSE.
    " ---------------- Mode 2: SRM Baseline ----------------
    LOOP AT lt_srm_banks INTO DATA(ls_srm_base).
      ls_final = VALUE ty_alv_final( ).
      ls_final-lifnr       = ls_srm_base-zsap_sup_no.
      ls_final-srm_banks   = ls_srm_base-zbank_country.
      ls_final-srm_lifnr   = ls_srm_base-zsap_sup_no.
      ls_final-srm_banknew = ls_srm_base-zacc_code.

      " Load SRM specific comparison data
      ls_final-srm_zaccount    = ls_srm_base-zaccount.
      ls_final-srm_zbank_code  = ls_srm_base-zbank_code.
      ls_final-srm_zswift_code = ls_srm_base-zswift_code.
      ls_final-srm_zbank_addr  = ls_srm_base-zbank_addr.

      lv_max_score = 0.
      DATA: ls_best_match_sap LIKE LINE OF lt_sap_banks.
      CLEAR ls_best_match_sap.

      READ TABLE lt_sap_banks TRANSPORTING NO FIELDS WITH KEY lifnr = ls_srm_base-zsap_sup_no BINARY SEARCH.
      IF sy-subrc = 0.
        LOOP AT lt_sap_banks INTO DATA(ls_sap_t) FROM sy-tabix.
          IF ls_sap_t-lifnr <> ls_srm_base-zsap_sup_no. EXIT. ENDIF.

          lv_score = 0.
          IF ls_sap_t-banks = ls_srm_base-zbank_country AND ls_sap_t-banknew = ls_srm_base-zacc_code.
            lv_score = 100.
          ELSE.
            lv_score = 10.
            IF ls_sap_t-banks = ls_srm_base-zbank_country. lv_score = lv_score + 20. ENDIF.
            lv_sap_acc = ls_sap_t-banknew. lv_srm_acc = ls_srm_base-zacc_code.
            SHIFT lv_sap_acc LEFT DELETING LEADING '0'.
            SHIFT lv_srm_acc LEFT DELETING LEADING '0'.
            CONDENSE lv_sap_acc NO-GAPS.
            CONDENSE lv_srm_acc NO-GAPS.
            IF lv_sap_acc = lv_srm_acc AND lv_sap_acc IS NOT INITIAL.
              lv_score = lv_score + 70.
            ELSEIF lv_sap_acc IS NOT INITIAL AND lv_srm_acc IS NOT INITIAL.
              lv_dist = distance( val1 = lv_sap_acc val2 = lv_srm_acc ).
              lv_len = nmax( val1 = strlen( lv_sap_acc ) val2 = strlen( lv_srm_acc ) ).
              lv_score = lv_score + ( ( ( lv_len - lv_dist ) * 60 ) / lv_len ).
            ENDIF.
          ENDIF.

          IF lv_score > lv_max_score.
            lv_max_score = lv_score.
            ls_best_match_sap = ls_sap_t.
          ENDIF.
          IF lv_max_score = 100.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.

      " Fill the found SAP data
      IF lv_max_score > 0.
        MOVE-CORRESPONDING ls_best_match_sap TO ls_final.
        ls_final-sap_banks   = ls_best_match_sap-banks.
        ls_final-sap_lifnr   = ls_best_match_sap-lifnr.
        ls_final-sap_banknew = ls_best_match_sap-banknew.
        ls_final-sap_koinh   = ls_best_match_sap-koinh.
        ls_final-sap_bankl   = ls_best_match_sap-bankl.
        ls_final-sap_bkext   = ls_best_match_sap-bkext.
        ls_final-sap_address = ls_best_match_sap-payee_address.
      ENDIF.

      " --- Determine main match status ---
      ls_final-match_score = lv_max_score.
      IF lv_max_score = 100.
        ls_final-match_status = 'Exact Match'.
        add_cell_color: 'SRM_BANKS' 5, 'SRM_LIFNR' 5, 'SRM_BANKNEW' 5, 'SAP_BANKS' 5, 'SAP_LIFNR' 5, 'SAP_BANKNEW' 5, 'MATCH_STATUS' 5, 'MATCH_SCORE' 5.
      ELSEIF lv_max_score > 0.
        ls_final-match_status = 'Fuzzy Match'.
        add_cell_color: 'SRM_BANKS' 5, 'SRM_LIFNR' 5, 'SRM_BANKNEW' 5, 'SAP_BANKS' 6, 'SAP_LIFNR' 6, 'SAP_BANKNEW' 6, 'MATCH_STATUS' 6, 'MATCH_SCORE' 6.
      ELSE.
        ls_final-match_status = 'Not in SAP'.
        add_cell_color: 'SRM_BANKS' 5, 'SRM_LIFNR' 5, 'SRM_BANKNEW' 5, 'SAP_BANKS' 6, 'SAP_LIFNR' 6, 'SAP_BANKNEW' 6, 'MATCH_STATUS' 6, 'MATCH_SCORE' 6.
      ENDIF.

      " ====================================================
      " ★ Core specific field comparison logic (differentiated by country) ★
      " ====================================================
      lv_country = COND #( WHEN ls_final-sap_banks IS NOT INITIAL THEN ls_final-sap_banks ELSE ls_final-srm_banks ).

      IF lv_country = 'CN'.
        macro_compare ls_final-sap_koinh   ls_final-srm_zaccount   ls_final-match_koinh  'SAP_KOINH'   'SRM_ZACCOUNT'   'MATCH_KOINH'.
        macro_compare ls_final-sap_bankl   ls_final-srm_zbank_code ls_final-match_bankl  'SAP_BANKL'   'SRM_ZBANK_CODE' 'MATCH_BANKL'.
        macro_compare ls_final-sap_address ls_final-srm_zbank_addr ls_final-match_addr   'SAP_ADDRESS' 'SRM_ZBANK_ADDR' 'MATCH_ADDR'.
        ls_final-match_bkext = 'N/A (Non-CN Only)'.
      ELSE.
        macro_compare ls_final-sap_koinh   ls_final-srm_zaccount    ls_final-match_koinh  'SAP_KOINH'   'SRM_ZACCOUNT'    'MATCH_KOINH'.
        macro_compare ls_final-sap_bkext   ls_final-srm_zswift_code ls_final-match_bkext  'SAP_BKEXT'   'SRM_ZSWIFT_CODE' 'MATCH_BKEXT'.
        macro_compare ls_final-sap_address ls_final-srm_zbank_addr  ls_final-match_addr   'SAP_ADDRESS' 'SRM_ZBANK_ADDR'  'MATCH_ADDR'.
        ls_final-match_bankl = 'N/A (CN Only)'.
      ENDIF.

      APPEND ls_final TO gt_alv_final.
    ENDLOOP.
  ENDIF.

  " ==========================================
  " 5. ALV Rendering and Column Renaming
  " ==========================================
  IF gt_alv_final IS NOT INITIAL.
    TRY.
        cl_salv_table=>factory( IMPORTING r_salv_table = go_alv CHANGING t_table = gt_alv_final ).
        go_alv->get_functions( )->set_all( abap_true ).
        go_alv->get_columns( )->set_optimize( abap_true ).
        go_alv->get_display_settings( )->set_striped_pattern( abap_true ).

        DATA(lo_columns) = go_alv->get_columns( ).
        TRY. lo_columns->set_color_column( 'T_COLOR' ). CATCH cx_salv_data_error. ENDTRY.
        TRY. lo_columns->get_column( 'LIFNR' )->set_visible( abap_false ). CATCH cx_salv_not_found. ENDTRY.

        DATA lo_column TYPE REF TO cl_salv_column.

        DEFINE set_col.
          TRY.
            lo_column = lo_columns->get_column( &1 ).
            lo_column->set_long_text( CONV #( &2 ) ).
            lo_column->set_medium_text( CONV #( &2 ) ).
            lo_column->set_short_text( CONV #( &2 ) ).
          CATCH cx_salv_not_found. ENDTRY.
        END-OF-DEFINITION.

        " --- Original Field Renaming ---
        set_col: 'BANKA' 'Bank Name', 'PAYEE_ADDRESS' 'Payee Address', 'BK_VALID_FROM' 'Valid From', 'BK_VALID_TO' 'Valid To',
                 'PARTNER' 'Business Partner', 'BKVID' 'ID', 'BANKS' 'C/R', 'BANKL' 'Bank Key', 'BANKN' 'Bank Account',
                 'BKREF' 'Ref. Details', 'BANKNEW' 'Merged Bank Acct', 'KOINH' 'Account Holder', 'BKEXT' 'External Bank ID'.

        " --- Main Account Matching Results ---
        set_col: 'SAP_BANKS' 'SAP C/R', 'SAP_LIFNR' 'SAP Vendor', 'SAP_BANKNEW' 'SAP Merged Acct',
                 'SRM_BANKS' 'SRM C/R', 'SRM_LIFNR' 'SRM Vendor', 'SRM_BANKNEW' 'SRM Merged Acct',
                 'MATCH_STATUS' 'Match Status', 'MATCH_SCORE' 'Match Score'.

        " --- Specific Check: Account Holder ---
        set_col: 'SAP_KOINH' 'SAP Acct Holder', 'SRM_ZACCOUNT' 'SRM Acct Holder', 'MATCH_KOINH' 'Acct Holder Match'.

        " --- Specific Check: Bank Key (CN) ---
        set_col: 'SAP_BANKL' 'SAP Bank Key(CN)', 'SRM_ZBANK_CODE' 'SRM Bank Key(CN)', 'MATCH_BANKL' 'Bank Key Match(CN)'.

        " --- Specific Check: External ID (Non-CN) ---
        set_col: 'SAP_BKEXT' 'SAP Ext. ID(Non-CN)', 'SRM_ZSWIFT_CODE' 'SRM SWIFT(Non-CN)', 'MATCH_BKEXT' 'Ext. ID Match'.

        " --- Specific Check: Bank Address ---
        set_col: 'SAP_ADDRESS' 'SAP Bank Address', 'SRM_ZBANK_ADDR' 'SRM Bank Address', 'MATCH_ADDR' 'Bank Addr Match'.

        go_alv->display( ).
      CATCH cx_salv_msg.
        MESSAGE 'Error displaying ALV' TYPE 'E'.
    ENDTRY.
  ENDIF.
相关推荐
嵌入式小能手1 小时前
飞凌嵌入式ElfBoard-进程间的通信之信号处理sigaction
linux·算法·信号处理
re林檎1 小时前
算法札记——5.14
算法
研究点啥好呢1 小时前
DJI 机器人视觉算法工程师 面试题精选:10道高频考题+答案解析(背诵版)
算法·面试·机器人·dji
热心网友俣先生2 小时前
2026年认证杯二阶段A题赛题解析
人工智能·算法·机器学习
Black蜡笔小新2 小时前
自动化AI算法训练服务器DLTM深度学习推理工作站AI赋能质检助力制造业智能化转型
人工智能·算法·自动化
小雅痞2 小时前
[Java][Leetcode simple] 205. 同构字符串
java·算法·leetcode
智者知已应修善业2 小时前
【51单片机独立按键控制数码管自增自减】2023-10-5
c++·经验分享·笔记·算法·51单片机
2301_800895102 小时前
第十四届蓝桥杯国赛b组真题---备战国赛版h
算法·蓝桥杯·深度优先
生信之灵2 小时前
告别模板配准:LAMNr Flow如何用一次求逆破解多模态解剖对齐难题
人工智能·算法