即使没有使用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.
答案 0 :(得分:3)
我想,你想要从一个特定机场的每个航班连接......
请注意,RANGE
结构在实际“比较值”前面还有两个字段。因此,直接选择它将导致一个非常胡言乱语的表。
选择RANGE
如果你真的想使用这个临时表,你可以查看我的答案here,其中我描述了填充RANGE
的方法而没有任何开销。完成此步骤后,您当前的代码段将按照您想要的方式工作。只需确保它已经填满或者所有内容都将被选中。
选择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.
答案 1 :(得分:0)
使用FOR ALL ENTRIES
代替CONNID in lt_SPFLI
。
如此:
SELECT *
FROM sflight
FOR ALL ENTRIES IN lt_spfli
WHERE carrid = pa_carid
AND connid = lt_spfli-connid