2010-01-12 1 views
0

Я пытаюсь отфильтровать некоторые записи из TADOQuery. Я установил свойство filter в true, и когда я установил фильтр в поле = 'значение', все работает нормально. Я хотел бы динамически создать этот фильтр, прилагаяФильтр TADOQuery и выражение всегда true

<space>AND field='value' 

к значению всегда правда, и я думал, что 1 = 1 будет делать трюк. Таким образом, я бы использовал 1 = 1 в качестве фильтра по умолчанию, а затем просто приложил AND field='value' к нему по мере необходимости.

Это, впрочем, не работает. Сообщение об ошибке выглядит следующим образом:

Аргументы неправильного типа, находятся в допустимом диапазоне или находятся в конфликте друг с другом.

Не могли бы вы рассказать мне, что я мог бы использовать в качестве универсального всегда истинного выражения для этого фильтра?

ответ

1

Я полагаю, это само собой разумеется, но это зависит от поставщика OLE DB независимо от того, работает оно или нет. Когда вы устанавливаете фильтр в существующем наборе записей, он заканчивает работу через другой интерфейс OLE DB (IViewFilter, если я правильно помню). Поэтому, даже если фильтр работает в предложении WHERE в инструкции SQL, это не обязательно означает, что он будет работать как фильтр. Фильтр, который вы установили, заканчивается разборкой на части компонентов, а затем передается в интерфейс OLE DB. Возможно, реализация провайдера не ожидает фильтра формы «constant = constant». В качестве обходного пути вы можете попробовать установить все это в предложении WHERE инструкции SQL.

+0

Спасибо за понимание. Я полагал, что это будет что-то вроде этого (вне пределов понимания;)). Я решил, что просто не буду беспокоиться о первом «И», и перед применением фильтра я удалю первые пять букв: «filter: = copy (filter, 5, length (filter) -4);' –

+1

You означает удаление первых ** 4 ** символов, не так ли? Вы можете написать это как 'filter: = Copy (filter, 5, MaxInt)' (вам не нужна часть Length (...). – Edelcom

+0

я не понимаю спасибо. Вернулся в delphi после двухлетнего перерыва :) –

1

Вы должны установить свойство «Filtered» в False, если вы что-то не фильтруете, и установите его «Истина» и ваше условие, когда вы хотите, чтобы набор результатов был отфильтрован.

Я бы динамически построил правильное свойство SQL, чтобы вы всегда точно знали, что отправляется в базу данных (и вы уверены, что ваша программа получает только те записи, которые вы хотите получить).

1

1 = 1 трюк отлично работает в предложении where, но не в отфильтрованном свойстве. Если вы хотите отключить фильтр, установите для фильтра значение false, и все записи будут возвращены.

Проблема с фильтрацией заключается в том, что она выполнена на стороне клиента. Если вы используете механизм базы данных, такой как SQL Server, и ожидаете, что у вас будет большой набор записей для фильтрации, тогда вам будет лучше работать, изменив SQL Query, который позволит серверу базы данных возвращать только запрошенные записи. Не забудьте сначала закрыть TAdoQuery, затем снова запустите SQL.

Трюк, который я использую, чтобы избежать возврата всего набора данных (используется для больших наборов данных), состоит в том, чтобы рассмотреть максимальное количество записей, которые я хочу отобразить, а затем использовать синтаксис TOP SQL, чтобы вернуть еще одно число, для отображения «n» ... если я дойду до этого числа, тогда я уведомию пользователя о том, что было возвращено больше n-1 записей и чтобы настроить критерии поиска/фильтра.

 Смежные вопросы

  • Нет связанных вопросов^_^