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


Автор: youriy86 29.3.2011, 13:24
Всем привет!
У меня следующая проблема: Использую ZEOS + MySQL. Хочу выводить записи соответствующие некоторому условию (делаю поиск). Устанавливаю в поле Filter следующее значение:
Код

  TZQuery1.Filter := 'doc_title like ''*' + edtSearch.Text + '*''';


Отображаются все нужные мне записи и еще те записи, у которых длина = 1.
Подскажите плиз, в чем особенность оператора '*' и как его правильно использовать для фильтра, либо какой другой? Как ни странно, но % не работает - вообще ничего не выдает.

Автор: Antimol 29.3.2011, 17:15
А там разве вместо звездочек не знак % нужно ставить?

Код

 TZQuery1.Filter := 'doc_title like ''%' + edtSearch.Text + '%''';

Автор: youriy86 30.3.2011, 08:11
Со знаком "%" вообще записи не отображаются!

Добавлено через 2 минуты и 2 секунды
Кстати думал, что у меня возможно старая версия, обновил ZEOS до 6.6.6 stable. Tа же проблема...

Автор: Akella 30.3.2011, 09:20
Цитата(youriy86 @  29.3.2011,  13:24 Найти цитируемый пост)
TZQuery1.Filter := 'doc_title like ''*' + edtSearch.Text + '*''';

А что, в документации и в примерах именно так показано?

Добавлено через 2 минуты и 27 секунд
Покажи пример или приведи цитату из документации, где используется локальная фильтрация с помощью like

Автор: youriy86 30.3.2011, 09:26
Bообще мне нужно сделать быстрый поиск. Человек вводит букву в TEdit и на его OnChange должны фильтроваться данные в TDBGridEh. K гриду привязан TZDataSet. Я подумал, что логично установить фильтр в самом датасэте. B примерах использование LIKE не показано. Залез в исходники TZDataSet, добрался до парсера, увидел LIKE в списке токенов и решил попробовать. Искал в нете, такой же вопрос задавали несколько человек, но внятного ответа так и не получили...

Автор: Akella 30.3.2011, 09:29
Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
Bообще мне нужно сделать быстрый поиск. 

 smile круто
Программист не может отличить поиск и фильтрацию. Может тебе ещё пояснить, что такое сортировка?


Вначале нужно определиться, что ДЛЯ тебя или для твоих пользователей означает слово "поиск". Потому как обычному пользователю, да и программистам бывает пофиг, что поиск, что фильтрация. 
Если нужен поиск, то смотри в сторону locate и похожих команд.

Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
сделать быстрый поиск.


Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
фильтроваться данные


Давай рассказывай, что же всё-таки тебе или твоим пользователям нужно. Поиск или фильтрация.


Тебе нужно просто отсечь ненужные записи и показать только те, которые удовлетворяют некоему условию? Да, это фильтрация.
Почему ты не хочешь использовать SQL?

Добавлено @ 09:34
Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
B примерах использование LIKE не показано.

 smile Ага, сам придумал. smile

Добавлено @ 09:35
Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
Залез в исходники TZDataSet, добрался до парсера, увидел LIKE в списке токенов и решил попробовать.

Книги читать уже не модно и документацию читать религия не позволяет. Правильно, зачем читать? Я щас закину на несколько форумов свой вопрос, попью чайку и мне всё по быстренькому сделают. Ну-ну smile

Автор: youriy86 30.3.2011, 09:35
Я планировал так:
  Пользователь вводит букву и в гриде остаются только те записи в названии которых есть эта буква и т.д., то есть это фильтрация...

Автор: Akella 30.3.2011, 09:36
да, я уже ответил и дал совет  на счет SQL smile

Добавлено через 1 минуту и 8 секунд
Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
Искал в нете, такой же вопрос задавали несколько человек, но внятного ответа так и не получили...

Потому что это азЫ! Об этом пишут в любой книжке типа "Базы данных для чайнегов"  smile 

Автор: youriy86 30.3.2011, 09:38
Bообще насчет чая и всего остального ты не прав, я вообще не хотел писать что-то на форуме из-за такого отношения... Посмотри мое количество сообщений, и думаю ты поймешь как часто я "пью чай"

Добавлено через 1 минуту и 8 секунд
A зачем мне использовать еще один SQL запрос? Объясни мне! Когда у меня уже выдраны все необходимые записи. Зачем мне еще раз выполнять запрос, я хочу локально отфильтровать их

Добавлено через 3 минуты и 41 секунду
Цитата(Akella @ 30.3.2011,  09:36)
да, я уже ответил и дал совет  на счет SQL smile

Добавлено @ 09:37
Цитата(youriy86 @  30.3.2011,  09:26 Найти цитируемый пост)
Искал в нете, такой же вопрос задавали несколько человек, но внятного ответа так и не получили...

Потому что это азЫ! Об этом пишут в любой книжке типа "Базы данных для чайнегов"  smile

Если бы я знал ответ на вопрос, я бы его не задавал. Я и есть чайник, и раздел этот для чайников...

Автор: Vas 30.3.2011, 09:55
Цитата(youriy86 @  30.3.2011,  09:35 Найти цитируемый пост)
Пользователь вводит букву и в гриде остаются только те записи в названии которых есть эта буква и т.д., то есть это фильтрация... 

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

Автор: youriy86 30.3.2011, 10:09
Пользователю отображаются входящие документы на подпись, их может быть штук 100 (например служебки, распоряжения и т.д.). Он должен видеть их все сразу, но допустим, какой-то из них срочный, ему звонят по телефону и говорят, документ такой-то срочно подписать, вот тут удобно воспользоваться поиском.

Автор: youriy86 30.3.2011, 11:07
Вообщем, как я и ожидал, нафлудили а результата никакого.
Полазил по официальному сайту ZEOS. Там на форуме уже поднимался мой вопрос с использованием like и *. Конструкция, использованная мною правильная. Пользователь, поднявший такой же вопрос на форуме, заметил, что в модуле ZMatchPattern.pas ошибка в логике функции MatchAfterStar. И именно поэтому выдаются помимо правильных результатов, еще и записи с длиной 1. Пользователь посоветовал скачать оригинальный код модуля, написанный Kevin Boylan совместно с Sergey Seroukhov...

Вот ссылка: http://zeos.firmos.at/viewtopic.php?t=1763&highlight=filter

Автор: superVad 30.3.2011, 12:04
В событии onFilterRecord фильтруй все сам руками.
Мне так даже проще, чем формировать строки.

Автор: Vas 30.3.2011, 12:06
Цитата(youriy86 @  30.3.2011,  11:07 Найти цитируемый пост)
Вообщем, как я и ожидал, нафлудили а результата никакого.

Боюсь, что если бы не флудили, ты бы сидел и ждал ответа, а не лазил на иностранные форумы  

Цитата(youriy86 @  30.3.2011,  11:07 Найти цитируемый пост)
Пользователь посоветовал скачать оригинальный код модуля, написанный Kevin Boylan совместно с Sergey Seroukhov...

Ну качай и пробуй.

Автор: Akella 30.3.2011, 12:09
Цитата(youriy86 @  30.3.2011,  09:38 Найти цитируемый пост)
я хочу локально отфильтровать их

вот я тебя и спросил: покажи в документации или в примерах информацию про локальный фильтр, где используется LIKE

Добавлено через 32 секунды
Если ты вообще конечно читал  smile  или ты не читатель, а только писатель?

Добавлено через 1 минуту и 48 секунд
Цитата(youriy86 @  30.3.2011,  09:38 Найти цитируемый пост)
, и раздел этот для чайников... 

Этот раздел для всех, а не для чайников. А чайник в первую очередь должен быть читателем, а не писателем.

Добавлено через 8 минут и 3 секунды
Цитата(Akella @  30.3.2011,  09:29 Найти цитируемый пост)
Почему ты не хочешь использовать SQL?

Цитата(Akella @  30.3.2011,  09:36 Найти цитируемый пост)
да, я уже ответил и дал совет  на счет SQL smile

Цитата(Vas @  30.3.2011,  09:55 Найти цитируемый пост)
формируй новый SQL запрос и отображай. 

 smile 

Автор: Frees 30.3.2011, 12:33
Цитата(Vas @  30.3.2011,  12:55 Найти цитируемый пост)
Ну пусть вводит, а потом тыркает применить, тогда и формируй новый SQL запрос и отображай. 

когда фильтруется по мере ввода - это удобнее.

Filter - будет предпочтительнее, если записей не миллионы а сотни,можно сделать что они все забираются 1 раз, а потом только фильтруются, нагрузка на сервер меньше.

Автор: youriy86 30.3.2011, 16:14
Цитата(Vas @  30.3.2011,  12:06 Найти цитируемый пост)
Боюсь, что если бы не флудили, ты бы сидел и ждал ответа, а не лазил на иностранные форумы  

  Tы абсолютно прав.

Цитата(Akella @  30.3.2011,  12:09 Найти цитируемый пост)
Если ты вообще конечно читал  smile  или ты не читатель, а только писатель?

  Cлушай, вот что ты ко мне придрался, ты "великий ГУPУ", а про * не знал и почему она так работает.
  Я взял и прочел...

Добавлено через 1 минуту и 22 секунды
Цитата(Frees @  30.3.2011,  12:33 Найти цитируемый пост)
когда фильтруется по мере ввода - это удобнее.

Filter - будет предпочтительнее, если записей не миллионы а сотни,можно сделать что они все забираются 1 раз, а потом только фильтруются, нагрузка на сервер меньше. 

  Я именно так и хотел сделать, но Filter  в ZEOS не доведен до ума, поэтому и консультируюсь у Вас...

Автор: Akella 31.3.2011, 09:00
Цитата(youriy86 @  30.3.2011,  16:14 Найти цитируемый пост)
Cлушай, вот что ты ко мне придрался, ты "великий ГУPУ", а про * не знал и почему она так работает.

знал

Цитата(youriy86 @  30.3.2011,  16:14 Найти цитируемый пост)
 Я взял и прочел...

Это очень здорово  smile 

Но ты так и не ответил на мою просьбу :(

Добавлено через 1 минуту и 11 секунд
Цитата(youriy86 @  30.3.2011,  16:14 Найти цитируемый пост)
Filter  в ZEOS не доведен до ума

Ты так считаешь, потому что like не хочет работать? Или почему?

Добавлено через 5 минут и 24 секунды
Я просто посмотрел стандартную справку по TDataSet.Filter и не нашёл там ни единого упоминания о возможности использования LIKE. Поэтому я тебе и просил показать рабочий пример или цитату из справки по ZeosDBO, где бы упоминалось о LIKE. Всего-то.

Автор: superVad 31.3.2011, 10:35
Цитата(superVad @  30.3.2011,  11:04 Найти цитируемый пост)
В событии onFilterRecord фильтруй все сам руками.

Что - никак не подходит?

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