0

如果 carrid 正常,即使 lt_spfli 不正常,程序也会选择所有内容。并且没有任何带有该 carrid 的条目,它会出现运行时错误。如果我尝试所有条目,他只会选择整个 SFLIGHT。

PARAMETERS: pa_airp TYPE S_FROMAIRP,
            pa_carid TYPE S_CARR_ID.
DATA: lt_spfli TYPE RANGE OF SPFLI,
      lt_sflight TYPE TABLE OF SFLIGHT.

SELECT CONNID FROM SPFLI
INTO TABLE lt_spfli
WHERE AIRPFROM = pa_airp.

SELECT * FROM SFLIGHT
INTO TABLE lt_sflight
WHERE CARRID = pa_carid AND CONNID in lt_spfli.
4

3 回答 3

4

我只是假设,您希望从给定机场的每个航班连接...

请注意,RANGE结构在实际“比较值”前面还有两个字段。所以直接选择它会导致一个非常乱码的表。

可能的解决方案:

选择与RANGE

如果您真的想使用这个临时表,您可以在这里查看我的答案,其中我描述了填充RANGEs 的方法而没有任何开销。在这一步之后,您当前的代码段也将按照您想要的方式工作。只需确保它确实已被填充,否则将选择所有内容。


选择与FOR ALL ENTRIES

在使用此变体之前,您应该绝对确定您指定的数据对象已被填充。否则将导致与第一个解决方案相同的混乱。为此,您可以编写:

* select connid
IF lt_spfli[] IS NOT INITIAL.
*    select on SFLIGHT
ELSE.
*    no result
ENDIF.

选择与JOIN

在这种情况下,“正确”的方法JOIN类似于:

SELECT t~* 
  FROM spfli AS i
  JOIN sflight AS t
    ON t~carrid = @pa_carid
   AND t~connid = i~connid
  INTO TABLE @DATA(li_conns)
  WHERE i~airpfrom = @pa_airp.
于 2016-11-01T18:53:08.173 回答
1

使用 aFOR ALL ENTRIES而不是CONNID in lt_SPFLI.

如此:

SELECT * 
  FROM sflight 
  FOR ALL ENTRIES IN lt_spfli 
  WHERE carrid = pa_carid 
    AND connid = lt_spfli-connid
于 2016-11-01T14:00:45.833 回答
0

您误解了“范围表”是什么。你填错了。

这部分代码演示了误解(稍微调试一下,您会立即看到错误的内容):

DATA: lt_spfli TYPE RANGE OF SPFLI.

SELECT CONNID FROM SPFLI INTO TABLE lt_spfli ...

“范围表”是一个包含 4 个组件(SIGN、OPTION、LOW、HIGH)的内部表,在 Open SQL 中用于对一个数据库列进行复杂的选择(注意:它也可以在多个 ABAP 语句中用于测试值ABAP 变量)。

因此,使用您的 SQL 语句,您只初始化 Ranges 表的第一个组件,而您应该转移CONNID到第三个组件。

在“现代”开放 SQL 中,您最好这样做:

SELECT 'I' as SIGN, 'EQ' as OPTION, CONNID as LOW FROM SPFLI INTO TABLE @lt_spfli ...

有关范围表的更多信息,您可以在此处参考答案:范围表中的实际高低意味着什么

于 2021-09-18T07:24:16.317 回答