ABAP 之二分法的常用方法及使用注意点

举报
百里丶落云 发表于 2023/08/10 11:38:05 2023/08/10
【摘要】 序HELLO.这里是百里,一个学习中的ABAPER,在工作学习中肯定会经常使用READ 内表进行读取单条工作区数据,此时如果数据量非常大,是一个令人头疼的故事,此时我们使用二分法可以显著的提高数据查找的效率.那么什么是二分法,从此展开. 二分法介绍二分法为一种通过索引索索的方式,进行快速查询的方式,基本思想就是数据大小先排序,放在队列中,将KEK值每次从中间获取,如果相等则把值取出,如果不...

HELLO.这里是百里,一个学习中的ABAPER,在工作学习中肯定会经常使用READ 内表进行读取单条工作区数据,此时如果数据量非常大,是一个令人头疼的故事,此时我们使用二分法可以显著的提高数据查找的效率.那么什么是二分法,从此展开.

二分法介绍

二分法为一种通过索引索索的方式,进行快速查询的方式,基本思想就是数据大小先排序,放在队列中,将KEK值每次从中间获取,如果相等则把值取出,如果不等的话,如果KEY小,则在队列的前半部检索,如果KEY大,则在队列后半部检索. 这样对应的工作区间就对半减小了.
说句人话呢就是玩过猜炸弹游戏么?100个数,随机才猜一个数,怎么猜最快,肯定是中中间砍半然后大或者小的获取,不过二分法取得是大的如果没有则小的,就这么回事.
对于二分法查找,必须按照关键字KEY采用升序的排序方式.否则搜索不到正确数据.

技术介绍

一般是把对应的数据获取到内表中,然后对内表进行正序排序,然后在去重,之后再LOOP 循环中通过read 的方式读到工作区在赋值.

select 数据1, 数据2 from 透明表 into table 内表 .
sort 内表 by 数据1 数据2 .
DELETE ADJACENT DUPLICATES FROM itab(内表名) COMPARING针对的字段.

loop 内表 into  工作区 .

read 内表 into 工作区 with key1 =1 BINARY SEARCH .
modify 内表 from 工作区 .
endloop .

实例讲解

数据定义

TYPES:BEGIN OF ty_Data  ,  
  
    doccode TYPE char20 ,  
   zrowid TYPE char20 ,  
  matcode TYPE char20 ,  
  matname TYPE char20 ,  
  uom TYPE char20 ,  
  memo TYPE char20 ,  
  

  
  END OF ty_Data .
  data :gs_DAta TYPE ty_Data .   
data :gt_Data TYPE TABLE of ty_Data .

image.png

数据操作

select *  from  ZWDEMOTABLE1 into CORRESPONDING FIELDS OF TABLE gt_Data .  
  
sort  gt_Data by  doccode  zrowid.  
READ TABLE gt_Data  into   gs_DAta WITH  KEY doccode = '2001' BINARY SEARCH .  
  
WRITE :gs_DAta-doccode .  
WRITE :gs_DAta-zrowid .  
WRITE :gs_DAta-matcode .  
WRITE :gs_DAta-matname .

结果

image.png

使用注意点

此项功能虽然简单,但是在实际工作中遇到的问题可不少,百里就遇到到过,单独查询没啥问题,已批量查询直接完蛋的情况.
那么哪些情况会出现问题,我们该注意什么呢?

二分法查询一定要正向排序.

还是刚才的案例,我们把二分法排序的地方拿掉.使用sy-subrc 判断read 的数据是否有值,如果=0 则说明获取了值,如果不等于0 这说明没获取数据,显然是获取不到的,触发了我们增加的条件没有数据 .


IF sy-subrc <> 0.  
........
MESSAGE '没有数据' TYPE 'E' .  
ENDIF.

image.png

READ 多少字段我们就要排序多少字段

没错就是字面意思,我们读到工作区多少字段,我们排序时候就要对应的by 多少字段,否则也会出现没有问题取不到值,或者取的数据不是我们所需要的值的内容.

sort 内表 by 字段1 字段2 字段3 
MOVE-CORRESPONDING 内表 to 对应字段内表. 
read 对应字段内表 into 工作区 with key 条件  .

技术总结

今天讲述的内容是工作中天天用到的一个动作,read数据学会了本篇文章可以大大减少工作中的失误情况,避免造成小问题,大事故的情况.ε=(´ο`*)))唉 这都是血泪的教训.别问为什么.

百里鸡汤

做出承诺并且付出坚定且持续的行动就是成功. ---->公司一个大佬讲的,共勉励之 .

这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.

wallhaven-m3dqj8.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。