abap中select single和select endselect有啥相同和不同之处?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了abap中select single和select endselect有啥相同和不同之处?相关的知识,希望对你有一定的参考价值。
single 根据条件找到一条数据,就出来了。select endselect是在里面循环,每次找一条,依次放到into table中,或者放到into work area中,下面append table 。
实际开发中不建议这么操作,对效率都有影响,基本都是select 具体字段,into 对应内表中,一次性处理,效率高,快捷。具体使用数据,read table by 二叉方式。 参考技术A select single 查询 到一行数据之后就会终止查询 跳出来
select endselect在代码里面添加一个断点F5 就会看到代码在select于endselect之间循环执行,每次出来一行数据,这种方式在list的报表中比较常见
另外,在ALV中,常用select …… into corresponding fields of table * from
这样子F5直接跳过查询语句,所有的数据行都出来了本回答被提问者采纳 参考技术B 后者效率低,作用一样。 参考技术C select single , 找到第一条符合条件的记录
select endselect 。。 找到所有符合条件的记录
在 ABAP 中使用一个或多个 IF 语句的 SELECT 查询
【中文标题】在 ABAP 中使用一个或多个 IF 语句的 SELECT 查询【英文标题】:SELECT query with one or multiple IF statements in ABAP 【发布时间】:2021-12-27 09:17:55 【问题描述】:我正在开发一项网络服务。我有一个这样的 select 语句(它比这有更多的字段和 2 个连接,但为了保持简单):
SELECT acdoca~augbl,
open_amount, "I need to add value to this field based on the IF statement below
acdoca~koart
FROM acdoca
LEFT JOIN bseg ON acdoca~belnr EQ bseg~belnr
AND acdoca~gjahr EQ bseg~gjahr
AND acdoca~buzei EQ bseg~buzei
AND acdoca~rbukrs EQ bseg~bukrs
INTO table @it_acdoca.
我需要添加这个 IF 语句:
IF bseg-KOART = 'D' or bseg-KOART = 'K'
IF acdoca-AUGBL is INITIAL THEN open_amount = DMBTR
ELSE open_amount = 0
ENDIF.
ELSE open_amount = 0
ENDIF.
我需要一个不会影响服务性能的答案。因为 ACDOCA 和 BSEG 是 SAP 中一些最大的数据库表。我尝试在 SELECT 之后使用 LOOP,然后在该 LOOP 中添加这个 IF,但这完全破坏了性能。
This Is What IT_ACDOCA table should look like after
希望快速回复。 最好的问候。
【问题讨论】:
如果您担心 ACDOCA 性能,请使用CTE 或CDS 是的,不要直接使用 ACDOCA(或任何其他表)!它非常大,里面有很多语义,而且还在不断变化。您将 (a) 无法获得您想要的结果或 (b) 您的逻辑将在未来停止工作或 (c) 性能很糟糕。而是使用特定于您的用例的已发布 CDS 实体之一,例如 I_SalesOrderItem 或类似的。有了这个,您有 (1) 适当的授权检查,(2) 清除迁移路径以防发生变化,以及 (3) 您不必维护连接 :) 【参考方案1】:DATA: BEGIN OF it_acdoca OCCURS 0,
augbl TYPE acdoca-augbl,
open_amount TYPE bseg-dmbtr,
koart TYPE acdoca-koart.
DATA: END OF it_acdoca.
SELECT acdoca~augbl,
CASE WHEN ( bseg~koart EQ 'D' OR bseg~koart EQ 'K' ) AND acdoca~AUGBL is INITIAL THEN dmbtr
ELSE 0
END AS open_amount,
acdoca~koart
FROM acdoca
LEFT JOIN bseg ON acdoca~belnr EQ bseg~belnr
AND acdoca~gjahr EQ bseg~gjahr
AND acdoca~buzei EQ bseg~buzei
AND acdoca~rbukrs EQ bseg~bukrs
INTO TABLE @it_acdoca.
如果您的版本不支持 CASE,您可以将您的语句添加到 JOIN 端,如下所示。
SELECT acdoca~augbl,
dmbtr AS open_amount,
acdoca~koart
FROM acdoca
LEFT JOIN bseg ON acdoca~belnr EQ bseg~belnr
AND acdoca~gjahr EQ bseg~gjahr
AND acdoca~buzei EQ bseg~buzei
AND acdoca~rbukrs EQ bseg~bukrs
AND ( bseg~koart EQ 'D' OR bseg~koart EQ 'K' )
AND acdoca~AUGBL is INITIAL
INTO TABLE @it_acdoca.
【讨论】:
尊敬的 mkysoft,感谢您的回答,案例陈述部分解决了我的问题。第二部分对我不起作用,因为我在选择中有更多字段,这些字段将通过在 JOIN 中添加这些行来实现。不过,感谢您的帮助!以上是关于abap中select single和select endselect有啥相同和不同之处?的主要内容,如果未能解决你的问题,请参考以下文章
SAP ABAP语法 Select single 和 FOR ALL ENTRIES IN 到底哪个性能更好
ABAP:SELECT SINGLE当没有发现数据时不会更改INTO后的变量