二分法在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.
再试试速度,是不是感觉要飞起?