C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Фильтрация записей, Не работает фильтр
Kuks
Отправлено: 15.09.2005, 11:23


Станционный диспетчер

Группа: Участник
Сообщений: 108



Не работает фильтр,
TADQuery->Filter = "Field_Name = *xxx*";
Нужно фильтровать по полю — вхождение ххх в любом месте значения поля,
опция foNo.... — выключена. Почему не работает?

Заранее спасибо!!!!!!
Guest
Отправлено: 15.09.2005, 11:33


Не зарегистрирован







DataSet-Filter слишком прост для разбора шаблонов.
Используйте фильтр сервера
В запрос добавить Where Field_Name like ('%xxx%') или как там у вас положено по синтаксису.
Замечание: вместо константы ххх можно (и нужно) использовать параметр.
Kuks
Отправлено: 15.09.2005, 11:44


Станционный диспетчер

Группа: Участник
Сообщений: 108



Это уже будет не фильтрация, а другой сиквел-запрос,
а нужно фильтровать уже полученный в результате
запроса рекордсет.
Guest
Отправлено: 15.09.2005, 11:52


Не зарегистрирован







Другой, и что в этом страшного ?
Напишите Where Field_Name like ('%' || :Podstroka || '%') и он опять станет одним. Если параметр пуст — все записи иначе нужные.

QUOTE

а нужно фильтровать уже полученный в результате

Ну тогда "ручками" в OnFilterRecord

QUOTE

а нужно фильтровать уже полученный в результате

Совершенно неправильно. Размер выборки нужно уменьшать на самых ранних этапах выполнения запроса. Кроме того сервер это сделает за вас значительно эффективнее.
Gedeon
Отправлено: 15.09.2005, 12:06


Ветеран

Группа: Модератор
Сообщений: 1742



Посмотрите в сторону EhLib, там фильтры работают отлично.
olegenty
Отправлено: 15.09.2005, 12:34


Ветеран

Группа: Модератор
Сообщений: 2412



угу.
CODE

STFiler->Local = true;
STFiler->Visible = true;

и в результате
CODE

Happiness = true;
Kuks
Отправлено: 15.09.2005, 12:43


Станционный диспетчер

Группа: Участник
Сообщений: 108



Спасибо огромное, все понял!!!!!!!!!!!!!
Zoth
Отправлено: 16.09.2005, 10:34


Не зарегистрирован







А если сделать вот так

void __fastcall TForm1::ADOQuery1FilterRecord(TDataSet *DataSet,
bool &Accept)
{
Accept=ADOQuery1->FieldByName("myfield")->AsString.Pos(MySubString);
}

А потом соответственно
ADOQuery1->Filtered=false;
ADOQuery1->Filtered=true;
olegenty
Отправлено: 16.09.2005, 10:37


Ветеран

Группа: Модератор
Сообщений: 2412



то код не универсален. фильтр жестко вшит в программный код. плохо, другими словами.
Zoth
Отправлено: 16.09.2005, 10:49


Не зарегистрирован







Хм.... я немного не понял... а какие могут быть изменения в этой фильтрации? просто я не представляю ситуацию... приведи пример плиз....
olegenty
Отправлено: 16.09.2005, 11:37


Ветеран

Группа: Модератор
Сообщений: 2412



пожалуйста: я могу хотеть фильтровать по одному полю, могу — по двум, могу — по трём и т.д., могу по любой произвольной комбинации... тогда твой обработчик OnFilterRecord никак не решит моих проблем.
AVC
Отправлено: 16.09.2005, 12:28


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

я могу хотеть фильтровать по одному полю, могу — по двум, могу — по трём и т.д., могу по любой произвольной комбинации... тогда твой обработчик OnFilterRecord никак не решит моих проблем

Конкретный, приведенный Zoth нет. Но ведь можно сделать достаточно универсальную "навороченную" функцию.
Хотя, как я писал выше это "плохой стиль" для SQL — запрос нужно ограничивать как можно раньше и на стороне сервера.
Zoth
Отправлено: 16.09.2005, 12:40


Ученик-кочегар

Группа: Участник
Сообщений: 14



QUOTE (AVC @ 16/09/2005, 12:28)

Конкретный, приведенный Zoth нет. Но ведь можно сделать достаточно универсальную "навороченную" функцию.
Хотя, как я писал выше это "плохой стиль" для SQL — запрос нужно ограничивать как можно раньше и на стороне сервера.

ну конечно я не имею в виду одну строчку которую я написал, у меня функция такая фильтруе по разным полям, по началу и т.д. приведенный мной код лишь иллюстрация приема...

А применять его мне приходилось...
Когда у меня клиента работает со спровочником в 30 тысяч позици причем справочник комбинированный куча данных из кучи таблиц... окрытие его на клиента занимало примерно 2-5 секунд в зависилости от загрузки сервера, и каждый раз при попытке фильровать это весьма доставало сотрудниклв..
если же датасет не большой то я просто перепосылаю запрос на сервер, плюсы очевидны... это проще, это корректнее... клиент имеет на себе более актуальную информацию и т.д.

народ... а глянте вот эту тему
https://rxlib.ru/forums/index.php?ac...934922788ab9953

Zoth
Отправлено: 16.09.2005, 12:44


Ученик-кочегар

Группа: Участник
Сообщений: 14



QUOTE (olegenty @ 16/09/2005, 11:37)
пожалуйста: я могу хотеть фильтровать по одному полю, могу — по двум, могу — по трём и т.д., могу по любой произвольной комбинации... тогда твой обработчик OnFilterRecord никак не решит моих проблем.

А вообще есть некие границы необходимой фильтрации.. например нет смысла давать клиенту возможность фильтровать по всем полям сразу... ну нету такой, надо обозначить эти границы с самом начале и работать уже от них.... а как это реализуешь в конечном счете не важно тому кто работает.... ИМХО грамотное ТЗ это уже 70% выполненой работы
olegenty
Отправлено: 17.09.2005, 07:36


Ветеран

Группа: Модератор
Сообщений: 2412



да всё я понимаю, и про то, что универсальную функцию написать не сложно, и то, что не надо фильтровать по всему и вся. сам же придерживаюсь того же принципа, что и AVC — выборку надо минимизировать максимально рано. лучше всего, когда с сервера прихрдит всего несколько десятков записей.

Вернуться в Работа с базами данных в C++Builder