开启掘金成长之旅!这是我参与「掘金日新计划 · 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数据学会了本篇文章可以大大减少工作中的失误情况,避免造成小问题,大事故的情况.ε=(´ο`*)))唉 这都是血泪的教训.别问为什么.
百里鸡汤
做出承诺并且付出坚定且持续的行动就是成功. ---->公司一个大佬讲的,共勉励之 .
这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.