SAP ABAP范围表并且行为不正常

时间:2016-11-01 12:37:16

标签: select parameters sap abap

即使没有使用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.

2 个答案:

答案 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