Таблица диапазонов и IN ведут себя неправильно

Программа просто выбирает все, если каррид в порядке, даже если не в порядке с lt_spfli. И нет никаких записей с этим карридом, он получает ошибку времени выполнения. Если я попробую с для всех записей, он просто выделит абсолютно весь 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.

person Codrin Strîmbei    schedule 01.11.2016    source источник
comment
Я абсолютно понятия не имею, чего вы на самом деле пытаетесь достичь и в чем может заключаться предполагаемая проблема. Очень вероятно, что вы не читали документацию по ключевому слову и столкнулись с одним из недоразумений, которые уже объяснялись тысячу раз, но я, честно говоря, не могу сказать.   -  person vwegert    schedule 01.11.2016
comment
Чего вы на самом деле хотите?   -  person Suncatcher    schedule 01.11.2016
comment
Почему бы тебе не JOIN?   -  person    schedule 01.11.2016
comment
И если SELECT выдает всю таблицу при использовании FOR ALL ENTRIES - ваша lt_spfli в 99% случаев просто пуста   -  person    schedule 01.11.2016


Ответы (2)


Я просто предполагаю, что вам нужны все стыковки рейсов из данного аэропорта...

Обратите внимание, что структура 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.
person Community    schedule 01.11.2016

Используйте FOR ALL ENTRIES вместо CONNID in lt_SPFLI.

As so:

SELECT * 
  FROM sflight 
  FOR ALL ENTRIES IN lt_spfli 
  WHERE carrid = pa_carid 
    AND connid = lt_spfli-connid
person Koen Schouten    schedule 01.11.2016