У меня проблемы с фильтром набора записей ADO в устаревшем коде ASP Classic, и я пытаюсь понять, не поддерживается ли то, что я пытаюсь сделать, или я просто делаю это неправильно.
У меня есть набор записей Предметов, и они имеют статус 1 (активный) или 0 (неактивный) и необязательную дату окончания. В моем административном пользовательском интерфейсе у меня есть элемент управления, чтобы показать все элементы или только те, которые должны отображаться для конечных пользователей: Status = 1 AND ( End_Date is null OR End_Date > Date() )
Чтобы реализовать эту логику, я попытался:
rs.Filter = "Status = 1 AND ( End_Date = null OR End_Date > #" & Date() & "# )"
но я получаю
ADODB.Recordset (0x800A0BB9)
Unknown runtime error
После долгих раздумий кажется, что ADO не нравится группировка паренов вокруг условий End_Date в сочетании с условием AND. Если я возьму парены, это сработает:
rs.Filter = "Status = 1 AND End_Date = null OR End_Date > #" & Date() & "#"
Но это просто случайность - похоже, условия фильтра оцениваются по порядку, и поэтому я получаю нужные результаты. Если я поменяю «И» на «ИЛИ», паренсы сработают:
rs.Filter = "Status = 1 OR ( End_Date = null OR End_Date > #" & Date() & "# )"
Но, конечно, эта логика неверна - она показывает активные, но просроченные элементы.
Странно, если я перенесу условия, это снова нарушится:
rs.Filter = "End_Date = null OR Status = 1 AND End_Date > #" & Date() & "# "
вылетает с той же ошибкой ADODB.
Я не могу предсказать, что будет и не будет работать, и документы, которые я прочитал, очень схематично в отношении ожидаемого синтаксиса (это не чистый T-SQL!), Ограничений и т. Д., И всего примеры, которые я видел, имеют не более двух условий. Я не думаю, что мои условия настолько сложны. Может кто-нибудь сказать мне, если то, что я пытаюсь сделать, поддерживается, если есть лучший способ сделать это, или указать мне всеобъемлющие документы и примеры, которые соответствуют логике такого рода?
Спасибо!