金色传说:SAP-ABAP-SELECT * FORM 内表语法

一、标题难取

你是否受够了同一个程序里不停的根据各种条件反复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内表的写法注意事项:

  1. gt_mara内表前的@一定不能省略,否则报错:GT_MARA没有在 ABAP 字典中定义为表
  2. gt_mara内表后的 AS a 一定不能省略,否则报错:必须为“GT MARA”指定别名
  3. INTO 内表必须写在SELECT语句的最后,否则报错:INTO/APPEND必须在语句最后
    内表的SELECT复用在逻辑越复杂的程序中越能够体现效果,提升运行速度图片,降低代码冗余度图片,如果是颜值控/强迫癌晚期,那么:代码美观性急剧升高!!!图片
    以上
    不妥之处欢迎留言指正。手动笑脸
    欢迎关注公众号,每日更新:在这里插入图片描述
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI云书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值