Проблемы с фильтром записей - PullRequest
0 голосов
/ 02 октября 2009

У меня проблемы с фильтром набора записей 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!), Ограничений и т. Д., И всего примеры, которые я видел, имеют не более двух условий. Я не думаю, что мои условия настолько сложны. Может кто-нибудь сказать мне, если то, что я пытаюсь сделать, поддерживается, если есть лучший способ сделать это, или указать мне всеобъемлющие документы и примеры, которые соответствуют логике такого рода?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 23 октября 2009

Свойство фильтра объектов записей ADO :

Между И и ИЛИ нет приоритета. Предложения могут быть сгруппированы в скобках. Однако вы не можете сгруппировать предложения, объединенные оператором OR, а затем присоединить группу к другому предложению с помощью AND, например:

(LastName = 'Smith' ИЛИ ​​LastName = «Джонс») AND FirstName = «Джон»

Вместо этого вы должны построить это отфильтровать как:

(LastName = 'Smith' AND FirstName = «Джон») ИЛИ

(LastName = 'Джонс' И FirstName = 'Джон')

Итак, вы должны построить свой фильтр так:

rs.Filter = "( Status = 1 AND End_Date = null ) OR ( Status = 1 AND End_Date > #" & Date() & "# )"
0 голосов
/ 25 октября 2009

Что происходит, когда вы пытаетесь это ...

<code>Dim strToday
strToday = Now()
rs.Filter = "Status=1 AND (End_Date = null OR End_Date > """ & strToday & """)" 
0 голосов
/ 21 октября 2009

Я знаю, что вы работаете с унаследованным кодом и, возможно, работают другие вещи, но как открыть набор записей на этой конкретной странице? Вы используете некоторую константу, определенную в adovbs.inc?

Например:

rs.Open "SELECT * FROM table1", db, adOpenStatic, adLockPessimistic
0 голосов
/ 03 октября 2009
...