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;
|
и в результате
|
|
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 — выборку надо минимизировать максимально рано. лучше всего, когда с сервера прихрдит всего несколько десятков записей.
|
|