前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP 之二分法的常用方法及使用注意点

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

作者头像
百里丶落云
发布2022-12-07 14:17:41
6620
发布2022-12-07 14:17:41
举报
文章被收录于专栏:享~方法

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 .
image.png
image.png

数据操作

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

结果

image.png
image.png

使用注意点

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

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

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

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

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

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

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

技术总结

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

百里鸡汤

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

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

wallhaven-m3dqj8.jpg
wallhaven-m3dqj8.jpg
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二分法介绍
  • 技术介绍
  • 实例讲解
    • 数据定义
      • 数据操作
        • 结果
        • 使用注意点
          • 二分法查询一定要正向排序.
            • READ 多少字段我们就要排序多少字段
            • 技术总结
            • 百里鸡汤
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档