-1

我试图对选择语句中的所有条目进行选择 - abap。我不清楚 select for entries 的作用。有人知道吗 ?

请查看以下声明:

1.

select bukrs belnr xblnr budat 
    from bkpf 
    into table it_bkpf 
    where belnr in s_belnr

2.

 select bukrs belnr buzei gsber zuonr wrbtr kunnr 
    from bseg 
    into table it_bseg  
    for all entries in it_bkpf 
    where belnr = it_bkpf-belnr.

请让我知道两种说法的区别。

湿婆

4

3 回答 3

4

一些明显的区别:

  1. 不同的表
  2. 不同的目标字段
  3. 第二个选择有一个语法问题:你form改用了from(我用我的编辑更正了它)

其他区别:

选择 1.)inwhere子句中使用。所以它使用一个select-options(或一个range-object)。

for all entries in it_bkpf表示内部表it_bkpf包含要选择的元素列表。或者换句话说:选择bseg中的所有条目,其中归档的belnr是hte内部表bseg的元素。

于 2012-02-26T17:57:12.110 回答
3

通过ST05交易,您将得到明确的答案。

  • 您可以执行 st05 事务,选择跟踪 SQL 并激活跟踪。
  • 之后运行你的代码。
  • 再次输入 st05 选择 deactivate trace,然后查看 trace 结果。

在那里,您可以看到转发到数据库服务器的确切 SQL 代码。由于 BSEG 是聚集表,因此您无法使用直观的标题项连接来检索所需的财务变动信息。只是因为单个数据库表中存储了包括BSEG在内的多个表,因此数据库服务器在技术上无法分离BSEG行并找到BSEG特定字段进行正确连接。

因此,您可以在应用程序服务器上进行类似连接的构建。首先,您从标题表 (BKPF) 中检索所有与标题相关的列。接下来,当SELECT ... FOR ALL ENTRIES IN ...执行时,应用程序服务器将获取一小部分标题行(通常为 5 个)并构造 SQL 查询以检索与该部分相对应的项目包。接下来,所有这些部分将合并到单个内部表中。因此,如果您可以执行正常连接,则只会有所需文档的项目。

于 2012-02-27T02:05:32.930 回答
2

这是我理解的方式。这两条语句可能是依次执行的:

  1. 第一条语句从 bkpf 表中选择一些条目。这些条目存储在内部表 it_bkpf(比如 belnr 1、2、3)中。

  2. 然后将这些条目中的每一个用作选择#2 的一部分。“for all entries”将表 bseg 中的 belnr 与第一条语句中的内部表 it_bkpf 中的 belnr 匹配。然后将匹配的条目放入内部表 it_bseg。

where belnr in s_belnr对于您给出的示例,如果 SQL #2 中的 where 子句是(而不是所有条目的全部),这几乎是相同的。仅当您出于其他目的需要 it_bkpf 的内容时,这才有意义。另一种典型情况是,如果您使用某些程序逻辑而不是直接从数据库中读取它来确定 for all entries 子句中使用的内部表的内容。

“对于所有条目”的一个问题:确保内部表for all entries不为空 - 然后将选择 from 子句中的整个表。

于 2012-03-06T22:00:33.480 回答