Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2016, 09:20   #1
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
Смущение Adoquery Filter проблемы с or и and

Доброе утро всем форумчанам.
У меня тут нарисовалась проблемка, которую я пока не могу никак решить...
Имеется ADOQuery, с SQL запросом
Код:
"select * from TOVARI where KeyCity=370"
Далее, я добавляю фильтр в ADOQuery
Код:
ADOQuery.Filter:='KeyTovar=13 or keytovar=17';
Фильтрует нормально.
Но когда я добавляю другой фильтр:

Код:
ADOQuery.Filter:='keygroup=22 and (KeyTovar=13 or keytovar=17)';
Тут программа выдает ошибку:
"Аргументы имеют неверный тип, выходят за пределы допустимого диапозона или вступают в конфликт друг с другом"
Понимаю, что можно просто переписать запрос в АДОшке, но в связи с тем что там куда данных, всё будет очень долго грузится...
Следовательно, мне нужно как то правильно записать фильтр... Но у меня не выходит... Что я делаю не правильно? Подскажите ...
Janger вне форума Ответить с цитированием
Старый 28.01.2016, 09:31   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Известный глюк датасета. По-моему так решается
Код:
ADOQuery.Filter:='(keygroup=22 and KeyTovar=13) or (keygroup=22 and keytovar=17)';
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.01.2016, 09:38   #3
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Ну, я понял, что можно скобки раскрыть.
Просто ситуация в том, что у меня куча куча ключей с условиями or, и пару ключей с and.
Будет очень очень большая строка фильтра...
Janger вне форума Ответить с цитированием
Старый 28.01.2016, 09:41   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну не совсем просто скобки раскрыть. Посмотри внимательно на условие из #2. Не нравится - используй OnFilterRecord. Там уж нагородить условий можно любых. А еще лучше в запросе фильтровать. И длинные условия в Filter ни когда и не пихал, не знаю как оно будет себя вести, и вообще практически не использую такой способ фильтрования
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.01.2016 в 09:45.
Аватар вне форума Ответить с цитированием
Старый 28.01.2016, 10:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

думаю, что вместо
Цитата:
Код:
ADOQuery.Filter:='keygroup=22 and (KeyTovar=13 or keytovar=17)';
прокатит
Код:
ADOQuery.Filter:='(keygroup=22) and (KeyTovar=13 or keytovar=17)';
суть в том, что AND и OR в условиях могут быть применимы только к операндам логического типа. а сравнение имеет более низкий приоритет,
поэтому пытается сделать 22 and (...) и выдаёт ошибку.

В остальном я согласен с тем, что советует Аватар.
onFilterRecord, конечно, не панацея, но иногда его удобнее использовать, чем пытаться сложный фильтр заставить работать. Особенно если есть поля типа Datе, Time и т.п.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.01.2016, 11:32   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
прокатит
Не-а. Это в движок адо заложено

https://msdn.microsoft.com/en-US/lib...bts.10%29.aspx

Цитата:
One restriction on these combinations is that OR clauses can only be used at the highest (major) level of the logical operation.

Examples of acceptable Criteria meeting these conditions are:

* recordset.Filter = "(Title='Manager' AND Salary>30000) OR (Title='Administrator' AND Salary>50000)"
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.01.2016, 11:46   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

А нельзя так?
Код:
(keygroup, keytovar) in ((22, 13), (22, 17))
Vapaamies вне форума Ответить с цитированием
Старый 28.01.2016, 11:55   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Такого и SQL не поймет. Хотя может и придумали такое расширение для каких-то СУБД в новых версиях. А Filter вообще об IN понятия не имеет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.01.2016, 13:02   #9
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Аватар прав.
Не катит.
IN тоже не работает.
И Between не работает
......
Сделал, как посоветовал Аватар
Код:
ADOQuery.Filter:='(keygroup=22 and KeyTovar=13) or (keygroup=22 and keytovar=17)'
Все работает нормально.
Всем спасибо, тему можно закончить
Janger вне форума Ответить с цитированием
Старый 28.01.2016, 13:24   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не-а. Это в движок адо заложено
понятно. спасибо. я не знал!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Filter cannot be opened BoozZzilla БД в Delphi 7 26.12.2012 16:58
проблемы с AdoQuery Azam693 Помощь студентам 2 23.02.2012 20:16
2 проблемы: вставка в ADODataset и с ADOQuery Шани БД в Delphi 18 23.07.2008 20:38