一个 SORT 引起的 BUG

作者:郑德鼎 约 4 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, MM, SD, 开发, 数据工程, 物料管理, 销售分销
一个 SORT 引起的 BUG - 封面图
一个 SORT 引起的 BUG - 封面图

**关于SORT的测试**

REPORT ytest_sort. PARAMETERS: p_count TYPE i.PARAMETERS: p_stable TYPE c AS CHECKBOX.DATA: BEGIN OF lt_tab OCCURS 0, a TYPE i, b TYPE c,      END OF lt_tab.DO p_count TIMES. APPEND VALUE #( a = sy-index ) TO lt_tab.ENDDO.IF p_stable = 'X'. SORT lt_tab STABLE BY b.ELSE. SORT lt_tab BY b.ENDIF.cl_demo_output=>display( lt_tab[] ).

如上代码,字段B一直是空的,我们按照B排序(P_STABLE不勾选),结果如下:

一个 SORT 引起的 BUG - 封面图
一个 SORT 引起的 BUG - 封面图

当COUNT为21行时,还是正序的。大于21行之后,就出现了各种各样的情况。

怎么样,出乎意料吧?

(如果勾选了P_STABLE,结果都是正序的。)

你可以理解为SAP的SORT底层的排序算法比较特殊,而且SAP提供了STABLE这样的关键字,让我们可以在不改变原来顺序的基础上进行排序,所以SORT语法的结果不算是BUG。

但是这里有几个事情要说明:

1、当一个内表 ** 被排序的 ** 字段 ** 有重复值的时候 ** 的时候,SORT可能会引起不稳定,如果想要稳定排序,就要加上STABLE。

2、使用ALV时,SORT语法可能和ALV的排序结果不一致,要保持一致,可以加上 **AS TEX** **T** 关键字试一下。

3、当情况1出现在标准程序中的时候,就是妥妥的BUG了吧。

**一个标准程序的BUG**

下面的内容是针对某SRM程序BUG的分析,不感兴趣的朋友可以跳过啦。

SRM产品中,对RFx数据进行供应商比价时,当RFx行项目数据较多(22行或以上),WDA界面中展示的行项目顺序是错乱的,与创建RFx时的行项目顺序不一致,给业务操作带来很大的困扰和不便。

为此我们找到了我们的运维厂商,希望他们解决这个问题。结果经过他们辛辛苦苦一个周的调试,最后认为是我们自己改了标准程序。

然后……把问题关闭了……

没办法,自己上。我刚开始接触WDA一两个月,真的不想自己上。

然后摸索了一个下午,最终发现了上述BUG。好像比某广的运维人员效率高一点。

下面是解决问题的思路:

由于WDA界面上的表格是通过BIND_TABLE设置上的,于是我在所有可能的BIND_TABLE方法中打上断点,然后执行WDA程序,顺利找到debug的入口。

之后在堆栈中,找到BIND_TABLE所传递的内表的相关逻辑,在相应的方法中打断点,找到了关键代码。

一个 SORT 引起的 BUG - 封面图
一个 SORT 引起的 BUG - 封面图

内表中的EXLIN是空值,且内表行数较多,SORT引起了不稳定。

而且标准程序的SORT没有加STABLE关键字。

除此之外,还有一些 **辅助证据** 证明这是个BUG。

比如:标准程序中针对ITEM的排序规则,除了根据字段EXLIN之外,还可以根据字段NUMBER_INT进行排序。而且SAP还提供了相应的函数BBP_PDH_ITEMLIST_SORT_HIER做排序,我在执行WDA程序时也进入到了此Function

Module。

一个 SORT 引起的 BUG - 封面图
一个 SORT 引起的 BUG - 封面图

虽然上图中IV_SORT_BY_NUMBER_INT的默认值是空,但在实际执行时,代码进入了下图中的第60行,BY_NUMBER_INT被设置为X。

一个 SORT 引起的 BUG - 封面图
一个 SORT 引起的 BUG - 封面图

而且,66行和74行,分别是采用不同排序方式的代码。

至此,我觉得可以确定这是一个BUG了。

向运维厂商的不专业表示不满,向他们随便关闭问题的做法表示谴责。

郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「一个SORT引起的BUG.md」整理生成,仅用于内部技术分享与学习交流。