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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2015, 09:06   #1
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию Фильтрация в ADOQuery

В общем, проблема в следующем ...
Написал программу, с базой данных магазина.
И сделал так, что если данные о товаре введены не полностью, то в базе имя товара с тремя звёздочками в начале названия товара. (Пример: "***кастрюля")
Вот, я на форму кинул checkbox, что бы по нажатию на него либо отображались все товары, либо только те, которые полностью заполнены (т.е. без звёздочек)
Пишу так:
Код:
ADOQuery1.Filter:='NameTovar not like ' + QuotedSTR('***%');
ADOQuery1.Filtered:=true;
Но когда я запускаю данный фильтр, АДОшка мне выдаёт следующее сообщение: " Аргументы имеют неверный тип, выходят за пределы допустимого диапозона или вступают в конфликт друг с другом"
Если же,я убираю из условия "not" то фильтр работает хорошо, правда выдаёт мне все данные со звёздочками. Ну это понятно почему.
Новый запрос, я не хочу для фильтрации писать, т.к. программа уже вся написана, и осталось только это доделать, а во вторых, данных очень много, и пока запрос выполняется, программа висит в режиме погрузки весьма долго ... Секунд 8 , засекал ...
===========================
В общем, дайте совет, как поступить в данной ситуации.
Спасибо.
Janger вне форума Ответить с цитированием
Старый 13.08.2015, 09:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если NOT NameTovar like ... не прокатит, тогда событие OnFilterRecord и в нем проверка
Цитата:
Секунд 8 , засекал
В базе сотни тысяч записей и все одновременно в память загружаются? Даже в этом случае 8 секунд очень много
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2015, 10:23   #3
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если NOT NameTovar like ... не прокатит, тогда событие OnFilterRecord и в нем проверка
В базе сотни тысяч записей и все одновременно в память загружаются? Даже в этом случае 8 секунд очень много
1) условие с not в начале не помогла
2) собыие, onFilterRecord не могу написать правильно ...
Пишу так:
Код:
accept := ansipos ('***', adoquery1.fieldbyname('nametovar').asstring)=o;
но не срабатывает ...
3) да, записей очень много ... А то что по времени много, так это ещё то, что у меня напо каждой строке 'калкулейт' происходит ... Т.е. он на каждой строке делает запрос, ещё в одну базу и там делает подсчёты, а потом выводит результат
Janger вне форума Ответить с цитированием
Старый 13.08.2015, 10:34   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
accept := Copy(adoquery1.fieldbyname('nametovar').asstring),1,3)<>'***';
Ну и Filtered:=True. И внимательно по индексам в базах пройдись. Сделаешь правильно - запрос будет летать. Да и *** не удачное решение, лучше поле специальное с признаком для этого
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.08.2015 в 10:36.
Аватар вне форума Ответить с цитированием
Старый 13.08.2015, 11:37   #5
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
accept := Copy(adoquery1.fieldbyname('nametovar').asstring),1,3)<>'***';
Ну и Filtered:=True. И внимательно по индексам в базах пройдись. Сделаешь правильно - запрос будет летать. Да и *** не удачное решение, лучше поле специальное с признаком для этого
В событие входит, проверил showmessage, но ничего не фильтрует ...
Все как было, так и осталось ...

Правда вот что мне не понятно ... Это событие, не по всем строкам проходит ... Только до 42 записи, и дольше не идёт .... Тоже не пойму почему

Последний раз редактировалось Janger; 13.08.2015 в 11:40.
Janger вне форума Ответить с цитированием
Старый 13.08.2015, 11:40   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Свойство Filter очистил?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2015, 11:59   #7
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Свойство Filter очистил?
Фильтр пока пустойпустой, я хочу проверить что бы он просто работал

Аааа... Я понял как это событие работает, тогда вопрос, как мне обновить данные в DBGrid-e?

ВСЁ!!!
Проблему решил, это моя невнимательности... Простите....
Просто, в конце моей процедуры, значение Фильтред назначался false ... Из за этого не срабатывает
Аватар, спасибо большое!! Выручил
==≠=========================
Возникла проблема...
ADOQuery1.RecordCount не меняется, если проводить фильтрацию через это событие ... Что делать?

Последний раз редактировалось Janger; 13.08.2015 в 15:28.
Janger вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADOQuery Janger Общие вопросы Delphi 8 07.10.2013 16:38
ADOQuery subbota БД в Delphi 2 20.12.2012 12:25
Фильтрация AdoQuery по пустому значению a_n_n_a БД в Delphi 1 07.02.2012 08:43
Фильтрация ADOQuery Builder6 mirra88 C/C++ Базы данных 3 08.08.2011 06:58
Фильтрация в Adoquery с использованием or and ArtInt БД в Delphi 20 13.05.2009 21:24