90的 ABAPer 不知道二分法的这个用法

作者:ABAP老白 约 3 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程

二分法在READ TABLE的时候效率很好,在内表数据量不是太大,效率要求不苛刻的时候,可以代替哈希表。

现在有这么一个场景:根据指定的字段判断内表是否有数据,没有数据就新加一行,有数据就累加后面的数值字段,其实就是指定字段的COLLECT。

例如:

DATA : BEGIN OF itab1 OCCURS 0 ,

matnr TYPE matnr ,

werks TYPE werks_d ,

menge TYPE menge_d ,

meins TYPE meins ,

END OF itab1 .

DATA : itab2 LIKE itab1[] WITH HEADER LINE .

要把itab1的数据根据matnr werks meins累计到itab2,

如果使用正常的写法,应该是这样写:

LOOP AT itab1 . READ TABLE itab2 WITH KEY matnr = itab1 \- matnr werks = itab1 \- werks meins = itab1 \- meins . IF sy \- subrc = 0 . itab2 \- menge = itab2 \- menge + itab1 \- menge . MODIFY itab2 INDEX sy \- tabix .

ELSE .

APPEND itab1 TO itab2 . ENDIF . ENDLOOP .

在数据量大的时候,这个效率很差,极差。

把READ TABLE换成二分法的话呢,读数就很快了,但是在 APPEND 数据后还要再重新排序,这个更不能忍受!

其实SAP已经考虑到这个问题了,在二分法搜索没有查到数据的时候,会把SY-

TABIX的值置为这条数据应该在内表的位置,也就是说,只要INSERT数据到内表的这个位置就可以了,如下:

SORT itab2 BY matnr werks meins .

LOOP AT itab1 . READ TABLE itab2 WITH KEY matnr = itab1 \- matnr werks = itab1 \- werks meins = itab1 \- meins

BINARY SEARCH .

IF sy \- subrc = 0 . itab2 \- menge = itab2 \- menge + itab1 \- menge . MODIFY itab2 INDEX sy \- tabix .

ELSE .

INSERT itab1 INTO itab2 INDEX sy \- tabix . " 关键代码

ENDIF . ENDLOOP .

再试试速度,是不是感觉要飞起?

90的 ABAPer 不知道二分法的这个用法 - 封面图
90的 ABAPer 不知道二分法的这个用法 - 封面图
ABAP老白

关于作者:ABAP老白

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

来源说明:本文内容由「90的ABAPer不知道二分法的这个用法.md」整理生成,仅用于内部技术分享与学习交流。