一、标题难取
你是否受够了同一个程序里不停的根据各种条件反复SELECT同一个表?
你是否受够了大量冗余代码的压迫?
你是否…
好吧,编不下去了,总之,起来!不愿做"奴隶"的ABAP们!今天给大家介绍金色传说语法:ABAP 新语法–SELECT FORM 内表
二、正文在此
假设场景:
要取出创建时间在date1和date2之间的,物料类型为Z100的所有物料,然后根据不同的物料组再进行逻辑处理。
这样一个场景,你脑阔里想到的代码是什么样的?
是这样的?
还是这样的?
上面的两种方式都可以达到预期的目的(小声bb:相信还有很多人会写出更复杂的代码图片)。但是仔细分析,不难发现,MARA表的物料类型和物料组是表索引,但创建日期并不是。大家都知道的是,表索引查询数据更快速!
所以上面两段代码中,要么查询出的数据太多,查询时间很长,数据里大,循环处理同样耗时长;要么冗余代码太多,像个“裹脚布”。
而有了新语法的我们,完全不需要这样处理,它应该是这样shei滴:
"1.通过索引快速取到轻量级的数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mara
FROM mara
WHERE ( mtart EQ 'Z100' AND matkl EQ '010502' ) OR
( mtart EQ 'Z100' AND matkl EQ '050501' ).
"2.将gt_mara内表复用,使用其轻量级数据处理非索引项,并用ENDSELECT代替LOOP循环
SELECT * FROM @gt_mara AS a WHERE matkl EQ '010502' AND ersda BETWEEN @date1 AND @date2 INTO @DATA(gs_mara1).
"处理逻辑写在这里
ENDSELECT.
SELECT * FROM @gt_mara AS b WHERE matkl EQ '050501' AND ersda BETWEEN @date1 AND @date2 INTO @DATA(gs_mara2).
"处理逻辑写在这里
ENDSELECT.
金色传说
很多人的WHERE条件中,有AND和OR时,习惯写成 :
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mara
FROM mara
WHERE mtart EQ 'Z100' AND
( matkl EQ '010502' OR matkl EQ '050501').
但其实这样的写的OR会导致优化器无法使用索引,查询速度会比较慢!
金色传说 SELECT内表的写法注意事项:
- gt_mara内表前的@一定不能省略,否则报错:GT_MARA没有在 ABAP 字典中定义为表
- gt_mara内表后的 AS a 一定不能省略,否则报错:必须为“GT MARA”指定别名
- INTO 内表必须写在SELECT语句的最后,否则报错:INTO/APPEND必须在语句最后
内表的SELECT复用在逻辑越复杂的程序中越能够体现效果,提升运行速度图片,降低代码冗余度图片,如果是颜值控/强迫癌晚期,那么:代码美观性急剧升高!!!图片
以上
不妥之处欢迎留言指正。手动笑脸
欢迎关注公众号,每日更新: