ABAP BINARY SEARCH--二分法



二分法检索(binary search)又称折半检索,其基本思想是设字典中的元素从小到大有序地存放在数组(array)中:  

 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;    

  否则,

若key小,则在字典前半部分中继续进行二分法检索;           

若key大,则在字典后半部分中继续进行二分法检索。    

 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。   

 二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序

对于二分查找,表必须根据特殊的搜索关键字来升序排列,否则这个搜索不会找到正确的行。

例子:

CLEARlv_gl_s,lv_gl_h.
      READ TABLE it_gl_result INTO lv_gl_s   WITH KEY  racct <fs_gl>-racct drcrk 'S' BINARY SEARCH.
      READ TABLE it_gl_result INTO lv_gl_h WITH KEY  racct <fs_gl>-racct drcrk 'H' BINARY SEARCH.
      lv_gl_data-ba_amount lv_gl_s-hslvt ABSlv_gl_h-hslvt ).


__________________________________________________________________________________________________________________________________________

在维护公司SAP的过程中,遇到一个问题,困扰了很久!

简单描述一下问题:(为了不牵扯公司业务,这是抽取问题)将主要的三个字段

存在一个内表TAB2,如图所示:

需要强调一下,真是的内表比TAB2要多很多字段,(这是重点

 

首先对系统中真实的内表进行了排序,其中主要的三个字段的排序如TAB2所示,

(如果是内表TAB2,对COLUMN1排序的话,默认的COLUMN3也会自动安装升序排列):

SORT  TAB2  BY COLUMN1 .

得到下图:

 

使用二分查找:

READ TABLE TAB2 WITH KEY COLUMN1 = '0800113864' COLUMN2 = '2012' COLUMN3 = '3018054318' BINARY SEARCH.

返回 SY-SUBRC = 8.

即查询没有相关数据!

 

这就是问题的情况所在!!

 

我发现问题的过程可以理解为如下步骤:

1. 首先定位到5条记录的中间那条记录,即第3条记录,然后对比COLUMN3。

2. 第3条记录的COLUMN3数据如果不等于 '3018054318' ,则从第3条至第5条记录的中间那条记录,即第4条记录,然后对比COLUMN3。

3. 第4条记录的COLUMN3数据如果不等于 '3018054318' ,则比较第5条记录然后对比COLUMN3。

4. 由于都没有等于 '3018054318' 的记录,则返回SY-SUBRC = 8。

 

解决此问题的关键:

在于对内表的排序,如果在

READ TABLE TAB2 WITH KEY COLUMN1 = '0800113864' COLUMN2 = '2012' COLUMN3 = '3018054318' BINARY SEARCH.

时候,使用到COLUMN1 = '0800113864' COLUMN2 = '2012' COLUMN3 = '3018054318' ,则对此系统中内表排序的时候需要依照此三个字段进行排序。

______________________________________________________________________________________________________________________________

1、使用where语句
不推荐
Select * from zflight.
Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.
Endselect.
推荐
Select * from zflight where airln = ‘LF’ and fligh = ‘BW222’.
Endselect.

2、使用聚合函数
不推荐
Maxnu = 0.
Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.
Check zflight-fligh > maxnu.
Maxnu = zflight-fligh.
Endselect.
推荐
Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry = ‘IN’.


3、使用视图代替基本表查询
不推荐
Select * from zcntry where cntry like ‘IN%’.
Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’.
Endselect.
推荐
Select * from zcnfl where cntry like ‘IN%’ and airln = ‘LF’.
Endselect.

4、使用INTO table 代替select endselect
不推荐
Refresh: int_fligh.
Select * from zflight into int_fligh.
Append int_fligh. Clear int_fligh.
Endselect.
推荐
Refresh: int_fligh.
Select * from zflight into table int_fligh.

5、使用批量修改内表代替逐行修改
不推荐
Loop at int_fligh.
If int_fligh-flag is initial.
Int_fligh-flag = ‘X’.
Endif.
Modify int_fligh.
Endloop.
推荐
Int_fligh-flag = ‘X’.
Modify int_fligh transporting flag where flag is initial.

6、使用二分法查询,提高查询内表数据速度
不推荐
Read table int_fligh with key airln = ‘LF’.
推荐
Read table int_fligh with key airln = ‘LF’ binary search.


SAP ABAP 性能优化技巧 — 使用二分查找(Binary Search)选项

READ命令使用顺序查找数据表,这会降低处理速度。取而代之,使用binary search的附加命令,可以使用二分查找算法,可以帮助加快内表查找速度。 在使用binary search之前必须首先将内表排序,否则有可能找不到记录,因为二分查找反复将查找区间对半划分,如果要查找的值小于查找区间的中间位置的数据项值,则查找区间将缩小到前半个区间,否则查找将局限于后半区间.

 

不推荐使用:

 

Read table int_fligh with key airln = ‘LF’.

 

 

推荐使用:

SORT int_fligh by airln.
Read table int_fligh with key airln = ‘LF’ binary search.

 

应用:

with key 后面不能使用比较符 < >.  

read table itab with key   matnr lt_mseg_n-matnr

                            pvprs 0 .   这种写法不对。

 

可以变通的写这条语句。

  LOOP at lt_ckmlcr WHERE  matnr lt_mseg_n-matnr AND pvprs 0.

.........

  exit.

endloop.

7、两个内表添加使用批量增加代替逐行
不推荐
Loop at int_fligh1.
Append int_fligh1 to int_fligh2.
Endloop.
推荐
Append lines of int_fligh1 to int_fligh2.

8、 使用FOR ALL Entries
不推荐
Loop at int_cntry.
Select single * from zfligh into int_fligh where cntry = int_cntry-cntry.
Append int_fligh.
Endloop.
推荐
Select * from zfligh appending table int_fligh
For all entries in int_cntry
Where cntry = int_cntry-cntry.

9、使用sort by 代替order by

10、避免使用SELECT DISTINCT语句
使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替.


11、两个实例

DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_mara.
第一种写法:
Select matnr
INTO it_mara
FROM mara.
APPEND it_mara.
ENDSelect.
第二种写法(high performace):
Select matnr
INTO TABLE it_mara
FROM mara.
==========================================
DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_mara.
DATA: BEGIN OF it_makt OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_makt.
第一种写法:
LOOP AT it_mara.
Select SINGLE maktx
INTO it_mara-maktx
FROM makt
Where matnr = it_mara-matnr AND
spras = sy-langu.
MODIFY it_mara TRANSPORTING maktx.
ENDLOOP.
第二种写法(high performace)
Select matnr maktx
INTO TABLE it_makt
FROM makt
FOR ALL ENTRIES IN it_mara
Where matnr = it_mara-matnr and
spras = sy-langu.
=========================================

1 数据——>工作区,工作区——>内表,
2 数据——>内表
很明显少了一个过程 效率自然高了 如果数据量越大,效果是可想而知的


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP是一种用于SAP系统开发的编程语言,其中pp模块是SAP系统中的生产计划模块,主要用于生产计划、生产过程控制和生产数据记录等。 ABAP开发在pp模块中的要点如下: 1. 熟悉pp模块的基础知识:了解pp模块的功能和流程,包括物料需求计划、生产订单、工作中心、生产版本等。这些知识对于正确理解和开发与pp模块相关的程序非常重要。 2. 掌握ABAP语言特性:ABAP作为SAP系统的开发语言,开发人员需要掌握其语法和特性,例如数据类型、变量声明、循环语句、条件语句等。这些知识将帮助开发人员编写高效且可靠的pp模块程序。 3. 理解生产计划数据结构:pp模块涉及的数据结构较为复杂,包括物料清单、工艺路线、生产订单等。开发人员需要了解这些数据结构的组成和关系,以便能够正确地读取和处理这些数据。 4. 开发报表和界面程序:PP模块通常需要输出各种类型的报表,如生产订单报表、工序报表等。开发人员需要根据用户需求设计和开发这些报表,并保证它们的准确性和易用性。 5. 数据验证和错误处理:在pp模块开发中,数据的准确性和可靠性非常重要。开发人员需要编写适当的代码来验证用户输入的数据,并能够处理各种可能的错误情况,以保证系统的稳定性和可靠性。 总之,ABAP开发在pp模块中需要掌握相关的知识和技术,包括pp模块的基础知识、ABAP语言特性、数据结构、报表和界面开发以及数据验证和错误处理等方面。只有掌握这些要点,才能够开发出高质量和高效率的pp模块程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值