尧图精选

ABAP实现两列内容对比:从二分查找到哈希内表的高效方案

🕒 发布时间:2026/9/8 11:38:28 📁 来源:尧图网络
1. 需求拆解别急着写代码先想清楚“对比两列”到底要什么做ABAP开发久了你会发现业务顾问抛过来的需求经常就一句话比如“帮我写个小工具对比两列内容”。乍一听很简单但你要是真按字面意思去写个循环两两比较的程序大概率会翻车。因为在SAP项目里“对比两列内容”背后往往藏着好几种完全不同语义我至少见过三种。第一种是横向对比同一张内表里有两个字段比如物料主数据里的旧物料号和新物料号或者ALV展示里用户想比较“计划数量”和“实际数量”这两列找出哪些行不一致。这种比较是逐行进行的关键在于定位行和判断差异字段。第二种是纵向对比两个内表各自有一列比如从两个不同系统导出的ID清单要找出哪些ID只在A表出现、哪些只在B表出现、哪些两边都有。这本质上是集合运算类似数学课上的交集、差集、并集。第三种是值分布对比比较多列数据的值分布情况比如按工厂分组统计物料数量看两个表的分组结果是否一致这种通常用于核对接口数据是否同步完整。我为什么强调要先拆解需求因为我见过太多同事直接把两个内表丢进循环里嵌套比较结果数据量一上来几十万行的内表嵌套循环跑几个小时最后被用户投诉“程序卡死”。如果你在动手前先问清楚业务方“你是要逐行对比同一行的两个字段还是要在两个表之间找差异数据”这个问题的答案直接决定你用单层循环哈希表还是排序二分法性能差距可能是天壤之别。另外需求里还会隐藏一个关键点对比之后拿结果干什么。是只需要在屏幕上展示红色高亮差异行还是要导出Excel给业务分析还是要进一步调用BAPI更新数据这决定了你有没有必要用ALV来做结果展示还是直接写屏幕输出就够了。我说个小案例。之前有用户拿着一个需求来找我说要“对比两列内容”结果聊了十分钟才搞明白他其实是想对比物料凭证的两个字段——过账数量和发票校验数量找出不一致的凭证行然后批量修正。你看这种需求如果一上来就写集合对比逻辑方向就完全错了。所以编码五分钟拆题半小时这句话在ABAP开发里一样成立。在动手之前你还需要确认数据来源。数据是来自透明表查询、接口报文解析还是用户手工粘贴的Excel数据来源决定了你怎么去重、怎么处理类型不一致、怎么处理首尾空格。别小看这些细节真实项目里80%的对账Bug都出在数据清洗上而不是对比逻辑本身。2. 经典方案排序后二分查找老司机都懂的稳路子如果你现在要处理的是两个内表的纵向差异对比也就是找差集和交集最稳妥、最兼容老系统的做法就是排序后二分查找。这套路在ABAP里用了二十多年到现在也没过时尤其适合还在用ECC 6.0甚至更老版本、没法依赖新语法特性的项目。2.1 为什么是“排序二分”而不是嵌套循环先讲讲原理。假设你有两个内表表A有M行表B有N行嵌套循环的时间复杂度是O(M×N)。当M和N都上万时运算量是亿级跑起来会非常吃力。而排序的时间复杂度大约是O(M×logM N×logN)二分查找每次是O(logN)总体加起来的效率比嵌套循环高了好几个数量级。举个直观例子两个内表各5万行数据嵌套循环最坏情况要比较25亿次用二分查找只需排序两次几十万次操作加上5万次二分查找每次17次左右比较完全是秒开和卡死的区别。在主数据量动辄几十万的SAP系统里这个效率差距是革命性的。实现逻辑也很清晰两个内表都按对比字段升序排序SORT语句默认升序。循环表A用READ TABLE表B WITH KEY 对比字段 表A-对比字段 BINARY SEARCH。如果SY-SUBRC 0说明两边都有存到交集内表如果不等于0说明只有表A有存到“左独有”内表。循环结束后再单独遍历一次表B用同样的方式判断哪些行只在表B里存到“右独有”内表。注意第4步不能省。你只循环表A只能找出“A表有而B表没有”的单向差异要找完全差异必须再反向查一遍或者用两次排序后“归并扫描”的方式一次性跑完。2.2 完整示例代码经典方案的参考实现*---------------------------------------------------------------------* * 程序对比两个内表的单列差异排序二分查找法 * 适用ECC / S4 全版本无新语法依赖 *---------------------------------------------------------------------* REPORT z_compare_two_cols. TYPES: BEGIN OF ty_data, key_field TYPE char30, END OF ty_data. DATA: lt_table_a TYPE STANDARD TABLE OF ty_data, lt_table_b TYPE STANDARD TABLE OF ty_data, lt_only_a TYPE STANDARD TABLE OF ty_data, 只在A中的记录 lt_only_b TYPE STANDARD TABLE OF ty_data, 只在B中的记录 lt_common TYPE STANDARD TABLE OF ty_data. A和B共有的记录 FIELD-SYMBOLS: fs_a LIKE LINE OF lt_table_a, fs_b LIKE LINE OF lt_table_b. START-OF-SELECTION. 模拟数据填充实际项目中这里通常来自查表或接口解析 PERFORM f_get_data CHANGING lt_table_a lt_table_b. 1) 先各自排序 SORT lt_table_a BY key_field. SORT lt_table_b BY key_field. 2) 遍历表A查表B LOOP AT lt_table_a ASSIGNING fs_a. READ TABLE lt_table_b TRANSPORTING NO FIELDS WITH KEY key_field fs_a-key_field BINARY SEARCH. IF sy-subrc 0. APPEND fs_a TO lt_common. ELSE. APPEND fs_a TO lt_only_a. ENDIF. ENDLOOP. 3) 遍历表B反向查表A LOOP AT lt_table_b ASSIGNING fs_b. READ TABLE lt_table_a TRANSPORTING NO FIELDS WITH KEY key_field fs_b-key_field BINARY SEARCH. IF sy-subrc 0. APPEND fs_b TO lt_only_b. ENDIF. ENDLOOP. 4) 展示结果 PERFORM f_display_result USING lt_only_a lt_only_b lt_common.这段代码里有两个细节需要注意。第一READ TABLE的TRANSPORTING NO FIELDS选项——我只是想判断这个键值是否存在并不需要把表B的行内容读出来用这个选项可以省掉工作区赋值开销数据量大时能省下不少内存和CPU。第二排序之前最好用DELETE ADJACENT DUPLICATES去重否则表里有重复行会干扰结果判断。比如表A同一个ID出现两次表B出现一次业务上算“两边都有”还是“A多了重复”这必须和业务确认清楚工具程序里默认提供是否去重的开关比较稳妥。这种方案还有一个天然优势对老系统兼容性好依赖基础语法别人接手维护也容易看懂。如果团队里新人多我建议先用这个方案打底逻辑清晰出Bug也好排查。2.3 扩展思考如果对比的列不是单列而是多列实际业务中“对比一列”是理想情况经常要对比“工厂物料移动类型”这种组合键。实现上并不复杂排序语句改为SORT lt_table_a BY werks matnr bwart.READ TABLE时也带上全部比较键READ TABLE lt_table_b TRANSPORTING NO FIELDS WITH KEY werks fs_a-werks matnr fs_a-matnr bwart fs_a-bwart BINARY SEARCH.这种处理方式和单列本质相同只是排序和查询键从一列变成了多列。但要注意内表的排序顺序和查询键顺序必须一致比如表B按“werks、matnr、bwart”排序那查询就必须按这个顺序来不能先按matnr再按werks查否则二分查找会返回错误结果这是这个方案最容易踩的坑之一。3. 新语法版FILTER、CORRESPONDING与GROUP BY的现代打法如果你所在的系统已经是S/4HANA或者项目允许使用较新的ABAP语法通常需要ABAP 7.40以上那“对比两列内容”这个需求可以写得更简洁、更优雅。新语法不仅代码量少而且语义更贴近最终业务目标可读性提升一大截新人都能一眼看懂在干什么。3.1 用FILTER算差集一行顶八行ABAP 7.40开始引入了FILTER和LINE_EXISTS等表达式结合内联声明可以非常优雅地算差集和交集。核心用法是 找出只在lt_table_a中、不在lt_table_b中的记录 lt_only_a VALUE #( FOR ls_a IN lt_table_a WHERE ( key_field NOT IN lt_table_b ) ).但这里有东西必须提醒你FILTER里写的WHERE条件并不支持直接引用另一个内表的字段。上面的示例写法在语法上不一定能直接跑通。更靠谱的做法是利用ABAP新语法中的字符串表和标准表之间的转换或者使用LINE_EXISTS辅助判断。真正稳妥的写法是lt_only_a FILTER #( lt_table_a IN lt_table_b WHERE key_field key_field ).等等还是有个问题。FILTER的IN操作需要一个**排序表SORTED TABLE或哈希表HASHED TABLE**作为右操作数普通STANDARD TABLE直接使用可能会报错或者性能不理想。所以正确的姿势是先把表B定义成HASHED TABLE或者用CORRESPONDING SORTED处理。我实际推荐的做法是把表B定义成HASHED TABLE因为哈希表按键读取的平均时间复杂度是O(1)比二分查找的O(logN)更快特别适合大数据量下的存在性判断。*---------------------------------------------------------------------* * 新语法版使用哈希内表 FILTER实现差集与交集 *---------------------------------------------------------------------* REPORT z_compare_cols_new. TYPES: BEGIN OF ty_data, key_field TYPE char30, END OF ty_data. TYPES: tt_data TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY, tt_hash TYPE HASHED TABLE OF ty_data WITH UNIQUE KEY key_field. DATA: lt_table_a TYPE tt_data, lt_table_b TYPE tt_data, lt_hash_b TYPE tt_hash, 转为哈希表用于快速存在性判断 lt_only_a TYPE tt_data, lt_only_b TYPE tt_data, lt_common TYPE tt_data. START-OF-SELECTION. PERFORM f_get_data CHANGING lt_table_a lt_table_b. 把表B转为哈希表 lt_hash_b CORRESPONDING #( lt_table_b ). 交集A和B都有的行 lt_common FILTER #( lt_table_a IN lt_hash_b WHERE key_field key_field ). 只在A中的行A的每一行中KEY在B中不存在的行 lt_only_a VALUE #( FOR ls_a IN lt_table_a WHERE ( NOT line_exists( lt_hash_b[ key_field ls_a-key_field ] ) ) ( ls_a ) ). 只在B中的行B的每一行中KEY在A中不存在的行 lt_only_b VALUE #( FOR ls_b IN lt_table_b WHERE ( NOT line_exists( lt_table_a[ key_field ls_b-key_field ] ) ) ( ls_b ) ).这里用了VALUE FOR WHERE组合其中WHERE ( NOT line_exists( ... ) ) 这种写法在7.40以上版本里是合法的。它的语义很清晰遍历A表筛选出那些在B表中找不到对应键值的行直接存入lt_only_a。代码量比经典方案少了一半而且——“从A表中筛选出B表不存在的记录”——这句话几乎就是业务需求的直译可读性极强。3.2 用GROUP BY做分组对比和统计除了集合运算还有一种常见的对比需求是**“两列关系统计对比”**比如对比两个日期列是否有大量不一致、对比类型A和类型B的数量分布。这种需求用GROUP BY分组很顺手。我用过一个真实场景物料凭证表里有两个日期字段一个是凭证日期一个是过账日期用户想知道这两个日期在同一天内的所有记录以便核对财务入账是否有跨期。这种“逐行比较”用LOOP循环就行SELECT bukrs, belnr, gjahr, buzei, bldat, budat FROM bkpf INTO TABLE DATA(lt_bkpf) UP TO 10000 ROWS. DATA(lt_mismatch) VALUE tt_result( FOR ls_bkpf IN lt_bkpf WHERE ( bldat budat ) ( bukrs ls_bkpf-bukrs belnr ls_bkpf-belnr gjahr ls_bkpf-gjahr buzei ls_bkpf-buzei ) ).新语法的威力在“内表处理”上体现得淋漓尽致。你要写对比逻辑不再需要先声明一堆内表、个工作区然后建循环嵌套而是几行表达式解决然后直接输出到ALV或走后续逻辑。这在做一次性分析脚本或者调试辅助工具时特别香也得益于S/4HANA底层数据库对行式存储的优化这类纯内存运算快得惊人。当然新语法也不是没有代价。它要求系统版本足够新同时团队成员的ABAP水平要跟得上否则代码是写漂亮了后来接手的人看不懂也白搭。我的经验是如果这段代码要长期维护、别人也要改优先考虑经典方案如果只是自己做个临时工具、验证个想法新语法刷起来效率翻倍。3.3 新老方案怎么选一张表看懂对比维度经典方案排序二分新语法方案FILTER/HASHED兼容版本ECC 5.0 / 6.0 均可需 ABAP 7.40 或 S/4HANA代码量较长需多处循环精简表达式直译需求可读性一般需理解二分逻辑强语义贴近自然语言大数据性能很好二分查找更好哈希表O(1)团队维护门槛低老开发都熟偏高需新语法基础结果处理灵活性高可逐步加工高且更便于链式操作说实话我现在的习惯是新项目能用新语法就用新语法但必须确保代码注释到位。因为S/4HANA已经全面铺开新人培训也都在讲新语法没有必要抱着二十年前的写法不放。只是在遇到老系统改造时经典方案依然是“保底”的选择两条腿走路才是老练的做法。4. 结果展示与实用化改造从“能跑”到“好用”程序写出来只是第一步实际给业务用的时候还得考虑怎么展示结果。大部分ABAP开发者遇到“对比两列内容”的需求最后都是交个ALV报表把差异行标红再给个导出Excel的按钮。这中间有不少细节能提升使用体验我踩过的坑不少这里一并分享。4.1 用ALV展示差异结果并标记颜色假设我们的对比结果有三个集合只在左表set A、只在右表set B、两边共有。直接用三个ALV展示是可行的但业务方更想要的是“一张表里看到所有数据颜色区分状态”。实现思路是把所有结果合并到一个展示内表里加一个状态字段然后利用ALV的单元格颜色属性着色。TYPES: BEGIN OF ty_alv_out, key_field TYPE char30, 对比字段 status TYPE char10, 状态: 仅左表 / 仅右表 / 两表共有 cell_color TYPE lvc_t_scol, ALV单元格颜色 END OF ty_alv_out. DATA: lt_alv_out TYPE TABLE OF ty_alv_out. 合并三个结果集合到展示内表 LOOP AT lt_only_a ASSIGNING FIELD-SYMBOL(fs_only_a). APPEND VALUE #( key_field fs_only_a-key_field status 仅左表 ) TO lt_alv_out. ENDLOOP.颜色控制用ALV的LVC_T_SCOL结构即可每行可以给指定字段设置颜色。比如“仅左表”用红色“仅右表”用黄色、“两表共有”用绿色。这个功能很多开发都写过但我要提醒两个细节第一cell_color字段必须是内表本身的一个字段类型为LVC_T_SCOLALV会自动识别不需要额外设置FIELDCAT第二如果你要把颜色信息传给ALV必须在FIELDCAT里把对应列的EMPHASIZE属性热敏色设好或者使用“ COLOR ”列属性控制否则单元格颜色不会生效。好的ALV工具程序还应该让用户能“点击差异记录查看源数据”。这个实现也没什么高深技巧在ALV的HOTSPOT_CLICK事件里根据当前行的状态字段跳转到对应的明细内表。比如点“仅左表”的那一行弹出一个窗口显示这条记录在A表中的完整数据。这种交互看似简单但对业务用户来说体验提升极大——他们不需要再去原始数据里翻半天直接点击就能定位。4.2 加个导出Excel用户最常用的功能对比工具如果没有导出功能基本属于“半成品”。业务方拿到ALV结果后十有八九要导到Excel里做进一步分析。SAP里导出Excel的方式有好几种OLE2、DOI、类方法CLASS CL_GUI_FRONTEND_SERVICES。我自己的习惯是用类方法CL_GUI_FRONTEND_SERVICESFILE_SAVE_DIALOG配合LSM_WRITE或者直接用OLE2对象写。简单一点可以用SALV模型里的ON_FUNCTION添加一个“导出”按钮或者在ALV工具栏里直接追加一个功能码。如果你用的是复用类CL_ALV_GRID可以通过SET_TOOLBAR_INTERACTIVE加按钮或者直接使用ALV自带的本地导出Excel功能——默认ALV就有导出选项用户右键或点导出按钮就能存Excel这个不需要你额外开发。但这里要提醒ALV默认导出Excel大量数据时会丢格式、合并单元格会错乱、列宽要重新调整业务方经常会报怨。如果你需要“格式化导出”我建议直接用OLE2方式操作Excel对象或者用XLSX生成最新格式的Excel文件。有些项目里我会直接给用户提供“导出为CSV”的简单方案CSV文件导入Excel一样能用开发量小得多。根据我个人的实操SAP GUI ALV自带的“电子表格”功能导出大数据量时表头复杂时容易错位尤其是列很多的情况。所以如果是正式交付给用户长期使用的工具我还是推荐写一段专门的Excel导出逻辑虽然代码量多一点但稳定性完全不同。5. 真实项目中的常见问题与排查技巧工具开发最大的特点就是“看起来简单用起来全是坑”。我在给用户交付对比工具后陆续碰到了不少奇葩问题这里挑几个典型的连带排查思路一起写出来免得你以后再走弯路。5.1 大小写和前后空格数据对不上真凶之首最典型的问题是对比两个来源的数据时一个表里的物料号是大写另一个表里是首字母大写或混合大小写。SAP数据库里很多字段是默认强制大写的比如MATNR但如果是接口传过来的或者用户手工维护的字段大小写可能不一致。这种情况下无论你用二分查找还是哈希判断结果都会是“明明同一个物料却报差异”。解决方案很朴素在比对之前统一做一次数据清洗。可以用CONDENSE去掉多余前导和尾随空格用TO_UPPER统一转大写必要时还可以用CONVERSION_EXIT_MATN1_OUTPUT这类转换退出。说完这个我得强调一个更隐蔽的情况ALPHA转换。物料号、客户号、供应商号这些带前导零的字段在数据库里存的是10位、前导零补齐可是从Excel导入或外部系统传来的是8位无前导零。这种情况下直接对比必挂。正确做法是比对前都用CONVERSION_EXIT_ALPHA_INPUT补齐前导零或者统一用输出格式去掉前导零后对比两边规则必须一致。5.2 重复数据去重还是不去重前文提到过表A中有重复行、表B中只有一行业务上怎么定义结果严谨的做法是在程序里加一个配置项或者至少用CHECKBOX让用户选择是否去重。如果选择“不去重”A有2行“X”、B有1行“X”结果应该是A比B多出一行“X”。如果选择“去重”两边都有“X”视为共有A和B没有差异。这个差异看起来小对结果影响却很大尤其是对账类工具。以物料凭证核对为例一张凭证可能有多个行项目ID完全重复也不奇怪。我拿捏不准的时候就会直接问业务方“你是以记录行为单位还是以唯一ID为单位”这一步必须在设计阶段就明确否则返工成本极高。另外还要注意即便内表是SORTED TABLE或HASHED TABLE如果定义时用了NON-UNIQUE KEY那重复数据也能存进去所以去重逻辑要主动写不能依赖内表自动去重。5.3 大数据量性能问题加索引或换哈希别再傻循环在真实场景里用户拿过来一张表说“帮我跑一下这个分发逻辑和另一个系统的数据对比”一查内表行数两百万行。这种情况下如果你还用经典方案即使是二分查找每查一次也要建索引排序跑起来仍然吃力但也能接受。对于超大数据量我优先推荐上面提到过的哈希内表方案因为哈希查找的时间复杂度是O(1)基本上就是一次散列定位。如果你还在用老语法也可以用ASSIGN COMPONENT动态读取或者用COLLECT对数据进行预处理聚合把几十万行聚合到几百个聚合键再做对比性能会有质的提升。如果数据来源本身就是透明表那最有效的方案其实是直接在SQL层面做JOIN或子查询让数据库去处理集合运算。比如对比两个视图或者两个表的数据差异一条LEFT OUTER JOINWHERE B.MANDT IS NULL就能找出“只在A表中存在”的记录完全不必把数据全部捞到ABAP内表里。这个思路我在大型数据核对项目中几乎每次都用到既简单又高效。我建议一开始就评估数据量少于10万行内表操作完全没问题超过百万行先考虑数据库侧完成对比和过滤再拉回少量差异数据到ABAP层做展示这个策略最稳。5.4 动态列对比用户说“我今天要比A和B明天要比C和D”这种工具做得越灵活越会被问“你能不能支持任意两列对比”这是很自然的演进需求。实现动态对比需要用到ABAP的动态编程RTTS也就是RTTI/RTTS代码复杂度提升不少。核心思路是用CL_ABAP_TYPEDESCRDESCRIBE_BY_DATA获取内表结构信息。用READ TABLE ... ASSIGNING FIELD-SYMBOL(fs_row)遍历每一行。用ASSIGN COMPONENT l_fieldname OF STRUCTURE fs_row TO fs_value动态取字段值。对两个动态字段做逻辑比较。这样确实能实现任意列对比但每次对比前必须把两列的数据类型、长度、转换规则都确认好否则很容易踩“运行时字段类型不匹配”的坑。我的建议是如果只是内部给自己用的小工具动态实现一版也值得如果是给终端用户长期使用的工具最好还是限定列名和场景把界面做清楚避免用户乱配导致结果失真到时候反而反过来怪程序有问题。5.5 关于COMMIT和数据库更新对比程序也可能需要“修正数据”有些对比工具不止是展示差异后续可能还要执行数据修正。比如物料凭证的过账数量与发票校验数量不一致对比出来后用户希望程序能一键更新某个字段。这种需求就容易碰到热词里提到的一个问题“除了某个字段不更新其余都更新”。ABAP里更新数据库表的标准动作MODIFY ztable FROM ls_data.但如果你想“只更新部分字段其他字段保持原样”直接MODIFY整行会有风险因为MODIFY默认更新所有非KEY字段会把你不想改的字段一并覆盖。正确的做法是使用显式指定字段的UPDATE语句UPDATE ztable SET field1 lv_new_value WHERE key lv_key.如果有多个字段需要更新UPDATE ztable SET field1 lv_value1, field2 lv_value2 WHERE key lv_key.这种写法天然满足“除了某个字段不更新其余都更新”的需求——你只需要在SET子句里不加那个不想更新的字段即可。不过要注意事务控制如果涉及多行更新最好在循环里先收集到内表最后用一个数据库函数或MODIFY批量提交或者用BAPI_TRANSACTION_COMMIT显式提交避免每更新一行就提交一次导致性能太差。如果对比结果可能还要触发后续的异步处理热词里面有“sap abap bapi_transaction_commit异步调用”相关的提示这点确实经常被忽略。异步调用BAPI后数据库更新不是立即完成的如果你紧接着去查最新数据可能查到旧值排查起来会一头雾水。处理办法是在调用异步BAPI后用WAIT UP TO或者轮询机制确认更新完成再做后续判断。再补充一点涉及更新操作的程序一定要加事务码的权限检查。对比是只读的但一旦加上修正功能就变成了写操作必须用AUTHORITY-CHECK OBJECT S_TCODE验权限防止无权限用户误操作导致生产数据被改。6. 我留着的小经验工具越简单越需要设计感最后分享几个我在迭代这类工具时沉淀下来的小经验虽然不是必须的但有了它们程序会好用很多。第一个经验是把“数据来源”和“对比逻辑”彻底分开。我的工具里通常分成三个模块取数模块、对比模块、展示模块。取数模块从各种数据源透明表、Excel上传、接口报文拿到统一结构的数据对比模块只做纯粹的数学集合运算不关心数据来自哪里展示模块只负责把结果渲染成ALV或导出Excel。这样每次新增一个数据源只需改取数模块对比和展示完全不用动扩展性极好。第二个经验是在大数据量场景下加一个去重开关。默认开启去重保证结果干净但提供“不去重”选项让高级用户可以核对重复行的差异。这在物料凭证、销售订单等多行明细场景里非常实用。第三个经验是性能监控打点。我在程序关键节点用热词里的abap 获取毫秒时间戳思路记录每段耗时输出到屏幕下方状态栏。这个方法成本极低但因为SAP内表操作耗时用户感知不明显一旦加上耗时显示用户对“慢”的容忍度反而提高了因为他们能明确看到是取数慢还是对比慢心理预期不一样。第四个经验是永远预留一个“导出差异明细”按钮即使ALV自带导出也建议专门做一个。因为ALV导出大量差异行时业务经常要拿去做二次Excel处理格式规范非常重要。第五个经验也是我觉得最核心的一点工具程序的最終价值不在于代码多漂亮而在于用户能否用一行话描述清楚它的使用方式。如果一个工具需要写三页说明文档才能教会用户操作那设计一定失败了。好的对比工具应该让用户自己就是知道选择两个数据源、指定对比字段、点击“开始对比”、看结果和导出。其他全部自动化。我在实际项目里发现只要做到上面这几点哪怕逻辑只有上百行代码用户也会天天用甚至主动帮你在团队里推广。不少开发觉得写这种小工具没技术含量但我觉得能把一个简单的需求做到“业务人员用着顺手、开发人员看着明白、遇到问题能自己排查”才是最有成就感的事。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →