Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Параметр "для любого значения"!


Автор: Rowi 3.3.2009, 18:12
Здравствуйте!

Используется Delphi5 + ADO + Access
Есть простейший запрос с фильтрацией типа:
Код

SELECT * FROM MyTable 
WHERE 
FieldName1=:Param1 
AND 
FieldName2=:Param2

С самой фильтрацией проблем нет, но если необходимо временно отключить фильтр по одному полю, какое значение параметра необходимо установить, чтобы, например, поле "FieldName1" не фильтровалось?
Пробовал
Код

ParamByName('Param1').Value:= '*';

Пробовал
Код

ParamByName('Param1').Value:= '%';

В результате - пустой набор записей!

Т.е. вопрос: какое значение параметра (для Access'а!) соответствует "равно любому значению"?

Текст запроса изменять не хотелось бы - тогда теряется всё преимущество использования параметров!
Есть ли такой способ? Или только изменять текст запроса?

P.S. Да, кстати, если это важно - тип поля: числовой (целые числа)

Автор: Kbl4AH 3.3.2009, 21:29
Цитата(Rowi @  3.3.2009,  18:12 Найти цитируемый пост)
Есть ли такой способ?

нет

Автор: Данкинг 3.3.2009, 22:03
Зачем что-то придумывать? Заведи переменную для AdoQuery.Text и меняй её по своему усмотрению, или две разные переменных сделай.

Автор: Akella 3.3.2009, 22:51
Цитата(Rowi @  3.3.2009,  18:12 Найти цитируемый пост)
ParamByName('Param1').Value:= '*';


Цитата(Rowi @  3.3.2009,  18:12 Найти цитируемый пост)
ParamByName('Param1').Value:= '%';


но в запросе у тебя 2 параметра

Автор: Kbl4AH 3.3.2009, 23:06
Цитата(Akella @  3.3.2009,  22:51 Найти цитируемый пост)
но в запросе у тебя 2 параметра

он написал, какие значения параметру1 он пробовал присвоить

Автор: Akella 4.3.2009, 00:26
а чему был равен в это время параметр 2?

Автор: Kbl4AH 4.3.2009, 09:02
Цитата(Akella @  4.3.2009,  00:26 Найти цитируемый пост)
а чему был равен в это время параметр 2?

какому-то нормальному значению

ЗЫ. 
2 Rowi Возможен такой способ:
Код
SELECT * FROM MyTable WHERE FieldName1=:Param1 AND FieldName2=:Param2

Поменять на:
Код
SELECT * FROM MyTable WHERE FieldName1 like перевод_в_строку(:Param1) AND FieldName2=:Param2

Автор: Rodman 4.3.2009, 09:58
если хошь достать все.. че просто не делать параметр?!

Автор: Rowi 4.3.2009, 17:31
Цитата(Kbl4AH @  4.3.2009,  09:02 Найти цитируемый пост)
Цитата(Akella @  4.3.2009,  00:26 )а чему был равен в это время параметр 2?
какому-то нормальному значению

Да, какому-то нормальному значению, при котором заведомо должны быть записи.

Цитата(Kbl4AH @  4.3.2009,  09:02 Найти цитируемый пост)
Возможен такой способ:
SELECT * FROM MyTable WHERE FieldName1=:Param1 AND FieldName2=:Param2
Поменять на:
SELECT * FROM MyTable WHERE FieldName1 like перевод_в_строку(:Param1) AND FieldName2=:Param2

Но FieldName1 ведь не строчного типа! 
Кроме того, перевод в строку вроде и не нужен: и '*' и '%' присваиваются для Param1 как строки. А по другому вроде никак такие значения не присвоишь...

Добавлено через 1 минуту и 22 секунды
Цитата(Rodman @  4.3.2009,  09:58 Найти цитируемый пост)
если хошь достать все.. че просто не делать параметр?!

эээм.........  не совсем понял...

Автор: Kbl4AH 4.3.2009, 18:28
Цитата(Rowi @  4.3.2009,  17:31 Найти цитируемый пост)
Но FieldName1 ведь не строчного типа! 

да, глюканул
Код

SELECT * FROM MyTable WHERE перевод_в_строку(FieldName1) like :Param1 AND FieldName2=:Param2

А тип Param1 (если в аксессе бывает тип переменной) делай строковый

Автор: Rowi 4.3.2009, 18:57
Цитата(Kbl4AH @  4.3.2009,  18:28, ost1802548)

SELECT * FROM MyTable WHERE перевод_в_строку(FieldName1) like :Param1 AND FieldName2=:Param2
А тип Param1 (если в аксессе бывает тип переменной) делай строковый

ОК, попробую...
А кстати, как в SQL-запросе перевод в строку делать? Там ведь IntToStr() не поставишь...

Автор: Kbl4AH 4.3.2009, 19:51
Цитата(Rowi @  4.3.2009,  18:57 Найти цитируемый пост)
Там ведь IntToStr() не поставишь...

не поставишь... зато поставишь другое)))
я access не знаю в отличие от google'a(((

Автор: Akella 4.3.2009, 20:51
Цитата(Rowi @  4.3.2009,  18:57 Найти цитируемый пост)
как в SQL-запросе перевод в строку делать? Т

Зависит от СУБД, в Firebird
Код
cast()

Автор: Rowi 10.3.2009, 19:09
Ура! Разобрался!!! smile 
Просто вместо
Код

SELECT * FROM MyTable 
WHERE 
FieldName1=:Param1 
AND 
FieldName2=:Param2

я ввожу
Код

SELECT * FROM MyTable 
WHERE 
FieldName1 LIKE :Param1 
AND 
FieldName2 LIKE :Param2

В итоге умный Access (или ADO - уж не знаю, кто именно))) автоматически (!) преобразует значение поля в строковый вид (а LIKE работает только со строковыми значениями) и в итоге все работет!!!
По крайней мере при значении '%' (при '*' не пробовал, но тоже должно по идее)
Код

ParamByName('Param1').Value:= '%';

всё работает: фильтруется только по FieldName2, а по FieldName1 - никакой фильтрации, выдаются все значения. Что и требовалось, без изменения текста запроса!

Автор: Akella 11.3.2009, 17:46
Цитата(Rowi @  10.3.2009,  19:09 Найти цитируемый пост)
вместо


Цитата(Rowi @  10.3.2009,  19:09 Найти цитируемый пост)
=:


Цитата(Rowi @  10.3.2009,  19:09 Найти цитируемый пост)
я ввожу


Цитата(Rowi @  10.3.2009,  19:09 Найти цитируемый пост)
LIKE

 smile  эх, как же мы недосмотрели smile 

Автор: Kbl4AH 12.3.2009, 08:26
Цитата(Akella @  11.3.2009,  17:46 Найти цитируемый пост)
эх, как же мы недосмотрели

Цитата(Kbl4AH @  4.3.2009,  18:28 Найти цитируемый пост)
SELECT * FROM MyTable WHERE перевод_в_строку(FieldName1) like :Param1 AND FieldName2=:Param2

все мы досмотрели, просто не понятно было, что человек хотел от запроса...


Автор: Rowi 21.9.2012, 23:18
Продолжая свою же тему...

Задача та же, но поле логического типа (true/false).
Если для строкового нужно ставить "%" (что соответствует любому значению), 
то что надо ставить для логического, чтобы соответствовало любому значению?

Добавлено через 9 минут и 29 секунд
Блин, дико извиняюсь - уже решил.

Оказывается, в свойствах параметра не нужно было менять тип данных:
при DataType=ftWideString и Type=OleStr всё работает! (Value=%)

Извините за беспокойство, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)