ДЛЯ ВСЕХ ЗАПИСЕЙ через пустой itab выбирает все записи из БД - PullRequest
2 голосов
/ 05 августа 2020

У меня есть запрос, в котором я использую FOR ALL ENTRIES. Внутренняя таблица lt_customer не имеет записей.

SELECT *
    FROM bsid
    INTO CORRESPONDING FIELDS OF TABLE lt_customer2
    FOR ALL ENTRIES IN lt_customer
    WHERE bukrs EQ p_bukrs
      AND belnr EQ lt_customer-belnr
      AND gjahr EQ lt_customer-gjahr.

Теперь, поскольку lt_customer не имеет записи, я ожидаю здесь дампа. Но оказывается, что он выбирал все записи из bsid в lt_customer2. Я не понимаю, почему и как. Пожалуйста, просветите меня. Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 августа 2020

Это стандартное поведение, как описано в справке ABAP:

«Если внутренняя таблица itab пуста, все условие WHERE игнорируется.»

https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenwhere_logexp_itab.htm

Проверьте, не пуста ли таблица перед SELECT:

IF lt_customer IS NOT INITIAL.
  SELECT ...
  ...
  FOR ALL ENTRIES IN lt_customer
  ...
ENDIF.
0 голосов
/ 05 августа 2020

ДЛЯ ВСЕХ ЗАПИСЕЙ работает как оператор IN. Если itab пусто, это условие игнорируется. Вам необходимо выполнить ручную проверку или добавить фиктивную запись в lt_customer.

...