Abap实现类似百度谷歌搜索引擎实现 模糊搜索 拼写纠错 算法
这份代码是一个企业级的高级数据对账工具(供应商银行数据双向核对报表)。它主要用于解决 SAP 系统与外部 SRM(供应商关系管理)系统之间,因为手工录入、接口异常或历史遗留问题导致的数据不一致问题。
以下是该程序的核心功能与优势的简单介绍:
🌟 核心功能 (What it does)
-
双向对账模式 (Two-Way Reconciliation)
-
以 SAP 为准:查出 SAP 中的所有数据,去 SRM 里面找有没有对应的记录。用于发现"SAP 有,但 SRM 漏传/未维护"的数据。
-
以 SRM 为准:查出 SRM 中的所有数据,去 SAP 里面找。用于发现"SRM 推送了,但 SAP 没建成功"的数据孤岛。
-
-
"类人脑"的模糊匹配打分 (Fuzzy Matching & Scoring)
-
它不是死板地要求数据 100% 一致。它会自动去除账号前面的
0和所有的空格,忽略大小写。 -
如果账号输错了一两位(比如
123456输成了123546),程序会利用 Levenshtein(编辑距离)算法 算出相似度得分,自动把最像的那条数据拉过来给你看。
-
-
国家差异化比对 (Country-Specific Logic)
-
针对中国 (
CN) 业务:专门比对"联行号/银行代码 (BANKL)"。 -
针对海外 (非
CN) 业务:专门比对"SWIFT Code/外部银行标识 (BKEXT)"。 -
同时独立比对"账户持有人"和"开户行地址"。
-
-
单元格级红绿染色 (Cell-Level Color Coding)
- 基准数据永远是绿色;匹配上的数据是绿色;没匹配上、漏维护或相似度不够的数据是红色。业务人员一眼扫过去就知道哪里有问题。
🚀 核心优势 (Why it's great)
-
极高的容错率,解放业务双手 (High Tolerance)
- 传统报表经常因为多打了一个空格(如
Bank of China和BankofChina)就报错说不一致,导致业务人员需要人工排查大量"假报错"。这个程序内置的"清洗+算法"机制直接秒杀了这类问题,只暴露出真正错误的数据。
- 传统报表经常因为多打了一个空格(如
-
性能强悍,运行飞快 (High Performance)
-
完美避开了 ABAP 语法陷阱 :巧妙地将复杂的关联运算(
JOIN、字符串拼接、CASE WHEN)推给 SAP HANA 数据库层处理,然后再用FOR ALL ENTRIES抓取 SRM 数据,彻底杜绝语法 Dump。 -
内存级提速 :在双层大循环比对中,使用了
SORT+BINARY SEARCH(二分法查找),即便对比几万家供应商,也能在几秒内瞬间出结果。
-
-
逻辑透明,极具可信度 (Transparent UX)
- 增加的 "匹配得分 (Match Score)" 字段是点睛之笔。它告诉用户"为什么系统认为这两条数据是匹配的"(比如 100分是完美,85分是手误输错一位,30分是只包含了部分字符),让系统不再是个黑盒。
-
一键跳转修正 (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.