Автор Тема: Конструкция IN в условиях - внимательнее надо быть  (Прочитано 4693 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 761
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Абаперы помните если вы используете конструкцию IN в условиях, внимательно относитесь к тому что пишете и используете. Например, 30 минут выброшенного времени:
Код: You are not allowed to view links. Register or Login
DELETE tmp_tab WHERE
    belnr = tmp_tab-belnr AND
    gjahr = tmp_tab-gjahr and
    kunnr = tmp_tab-kunnr and
    not ( ( belnr in range2010 AND gjahr = '2010' ) or 
          ( belnr in range2011 AND gjahr = '2011' ) ).
Данное условие удаления удаляет сторнированные документы из выборки, но по замыслу автора, типа в 2010 и 2011 годах были документы, которые сторнированными считать не нужно и поэтому автор заполнил два диапазона range2010[] и  range2011[], т.е. если будут документы занесенные в эти таблицы, то такие документы из выборки не удалять. Все было вроде как ничего, пока, опять же по каким-то причинам, таблица range2010[] стала пустой, ну не нужны стали документы для исключения. К чему это приводит? К тому, что последние две строки всегда будут возвращать = FALSE и это значит, что никакие сторнированные документы удаляться этой операций не будут, т.е. вообще никакие, потому что эта команда  belnr in range2010 AND gjahr = '2010' с пустой таблицей range2010[] всегда возвращает = TRUE что далее конвертируется опять же всегда в FALSE. Так что аккуратненько используем IN.

Да, как это исправить, по быстрому и чтобы не перелопачивать весь код программы? Ну скажем добавить в таблицу range2010[] фиктивный номер документа, так сказать одна строка, но все станет на место.