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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2012, 14:46   #1
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию Filter cannot be opened

Delphi, ADOTable, БД Access

На ввод фильтра как
Код:
Table.Filter:='ZNom LIKE 'xxx*' '
ругается тем самым "Filter cannot be opened"

Проблема точно не в формате данных - ошибка другая.
На подстановку % вместо * говорит абсолютно то же самое.
И вообще когда я впихиваю что либо конкретное (без знака *) поиск проходит нормально, но хотелось бы сделать фильтр а не поиск.

Борожу просторы интернетов уже с неделю как и так и не нашёл ответа. Удивлен кстати тем что на этом форуме нету такой темы.
Хотелось бы совета, что не так я делаю, заранее всем благодарен.

И ещё - уже много раз натыкался на совет использовать OnFilterRecord, но почитав немного так и не понял что с ним делать, как с помощью него фильтровать? Киньте в меня ссылкой где понятно написано.
BoozZzilla вне форума Ответить с цитированием
Старый 26.12.2012, 14:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А разве так можно ковычками окружать?
может так: Table.Filter:='ZNom LIKE '+QuotedStr('xxx*')
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2012, 15:02   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

К OnFilterRecord DataSet обращается последовательно для каждой записи из своего буфера. Если Accept вернулся True - запись доступна пользователю, иначе её просто не видно. Обращение к OnFilterRecord идет при Filtered=True в момент активизации датасета и после вставки или редактирования записи. В активном состоянии датасета изменив значение Filtered мы или заставляем отработать OnFilterRecord или отказываемся от фильтра. В самом обработчике Accept-у нужно присвоить логическое значение в зависимости от состояния данных текущей записи
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.12.2012 в 15:05.
Аватар вне форума Ответить с цитированием
Старый 26.12.2012, 15:22   #4
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А разве так можно ковычками окружать?
И через двойные одинарные кавычки пробовал и через QuotedStr, сейчас через QuotedStr у меня все "окавычено" Я не уделил этому внимания так как пробовал множеством способов, и когда ошибался с кавычками ошибка обычно выскакивала что "Type mismatch", так тчо вот

upd:
Оказывается я просто протупил неделю, он ругается когда я так ищу в цифровых значениях, причём про Type mismatch ни слова зараза не говорит! Сейчас попробовал поискать в строковых - отлично находит все.

А как бы мне тогда искать по частичному совпадению в числовых значениях? Может подскажете легкий путь?

Последний раз редактировалось BoozZzilla; 26.12.2012 в 15:31.
BoozZzilla вне форума Ответить с цитированием
Старый 26.12.2012, 15:45   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Например так
Код:
procedure TForm1.TableFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  {только те у которых ZNom int и предпоследние 3 цифры 123, а последняя любая}
  Accept:=(DataSet.FieldByName('ZNom').AsInteger mod 10000 >= 1230) and
          (DataSet.FieldByName('ZNom').AsInteger mod 10000 <= 1239);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.12.2012, 15:47   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну попробуй в фильктре CAST() для преобразования в строку использовать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.12.2012, 16:00   #7
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Например так...
Ну не описывать же все случаи, для ввода от одного до девяти знаков, а так - вообще - спасибо

про CAST пошёл читать, спасибо
BoozZzilla вне форума Ответить с цитированием
Старый 26.12.2012, 16:58   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Ну не описывать же все случаи, для ввода от одного до девяти знаков
та ладно, три переменные в Private формы, заменяющие соответственно 10000, 1230 и 1239, эти переменные вместо констант в OnFilterRecord. Всех делов: Filtered:=False; поменять значения переменных и Filtered:=True;

Сформировать Filter с помощью CAST программного кода не меньше потребует для вашего случая, чем сформировать новые значения в трех переменных. Кстати даже не знаю - съест ли дельфи CAST в Filter, никогда не пробовал
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.12.2012 в 17:07.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BindingSource.Filter VB 4eburator Помощь студентам 2 15.03.2012 00:27
BindingSource.Filter doober Общие вопросы .NET 2 12.10.2010 03:25
ADO filter like Spot БД в Delphi 8 08.02.2010 16:30