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

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

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

例如:

DATABEGIN OF itab1 OCCURS 0,
        matnr 
TYPE matnr,
        werks 
TYPE werks_d,
        menge 
TYPE menge_d,
        meins 
TYPE meins,
      
END OF itab1.
DATAitab2 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.

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

7b5d162b023b5e95b9f2ef164e91a07a.jpeg

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值