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

2022-12-07 14:17:41 浏览数 (1)


开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

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

二分法介绍

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

技术介绍

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

代码语言:javascript复制
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 .

实例讲解

数据定义

代码语言:javascript复制
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 .

数据操作

代码语言:javascript复制
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 .

结果

使用注意点

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

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

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

代码语言:javascript复制
IF sy-subrc <> 0.  
........
MESSAGE '没有数据' TYPE 'E' .  
ENDIF.

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

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

代码语言:javascript复制
sort 内表 by 字段1 字段2 字段3 
MOVE-CORRESPONDING 内表 to 对应字段内表. 
read 对应字段内表 into 工作区 with key 条件  .

技术总结

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

百里鸡汤

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

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

0 人点赞