![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фильтры в виде дерева [D6, IB6.x]
sokoloff © (2002-07-22 13:07:00)Встала задача организовать фильтры к базе в виде дерева, причем с наследованием, т.е. например дерево выглядит так:
\__
|
|- Москва(city like "Moscow") -
| |
| |- Ивановы(name like "Ivanov")
| |
| |- Петровы(name like "Petrov")
|
|- Питер
. . .
При выборе узла "Москва" фильтр должен выглядеть как-
SELECT * FROM MAIN WHERE CITY LIKE "Moscow",
а при выборе "Ивановы" как-
SELECT * FROM MAIN WHERE CITY LIKE "Moscow" and NAME LIKE "Ivanov", т.е. добавляются все значения выше лежащих узлов.
(SQL запросы не реальные, приведены только для примера)
Как это сделать я вобщем представляю, даже вчерне работает.
Но разговаривал с другом и он сказал, что читал статью описывающую мой слычай, но не помнит где, говорит то-ли на мастаке, то-ли на королевстве, а может и еще где.
Интересно прочитать эту статью, может какие грабли обойду. Поиск через гугл ничего похожего не дал.
Может у кого осталась ссылка на эту статью, или хоть сайт точно назовете, а может друг чего и перепутал, тогда не буду ковырять инет впустую.
kalliopiy (2002-07-22 16:35:00) [21]Короче, я чего-то понял, чего-то - нет.
Откуда у тебя это дерево берется, вообще? Из таблицы? Или все забито в программе?
Ситуация такая - проще всего процесс фильтрации автоматизировать используя рекурсию. Пишешь, например, функцию NodeFilter с параметром Node - выбранный узел дерева, например. Она возвращает результат (string): NodeFilter(Node.parent)+<фильтр для узла Node>. Обычная рекурсия. Но для этого нужно, конечно, некоторые штучки предварительно проделать. Т.е. при построении дерева определить что это за узел (кто он - city или ЗАО или ...), а потом уже эту информацию использовать в своей рекурсивной функции.
Честно говоря, сомневаюсь, что я сам бы во всем этом разобрался по своим словам. Но если надо - спрашивай дальше.
Sokoloff (2002-07-22 16:06:00) [22]
> Откуда такая любовь к деревьям?
От пользователей+начальство. Вообще IMHO требование логично.
Прога - морда к базе данных, есть возможность создавать и сохранять фильтры, в первой версии был просто комбобокс с названиями фильтров, но количество последних растет, управлять ими стало неудобно. Попросили сделать иеерархию фильтров, чтоб проще с ними работать. Теперь интерфейс программы становиться похожим на почтового клиента, слева-вверху дерево фильтров (почтовые ящики), справа-вверху dbtable с краткими сведениями(спсок писем в ящике), внизу по всей ширине подробные сведения о выбранной записи(текст письма), для пользователей привычно, а это есть гуд.
> Если это тебе еще интересно, то можно было бы обсудить,
> но только хочется узнать побольше из того, что тебе требуется
> на выходе. Ну, например, насколько глубокое твое дерево,
Жосткого ограничения нет, сколько на создают - столько и будет
> и при каких условиях, вообще, ты собираешься фильтровать
> таблицу ( т.е. я так понимаю, что пользователь из TreeView
> выбирает узелок, а тут бац и табличка отфильтровалась...
Да, именно так.
Фильтры хочу хранить в самой базе, необходимо добавление/удаление/перемещение фильтра, изменение его значения.
Главное, что фильтры должны наследоваться, т.е. если родительский узел хранит "city like "Moscow" and firmtype like "ЗАО"", а дочерний по которому кликнули "name like "Pupkin""то запрс к базе буде типа
"SELECT * from main where city like "Moscow" and firmtype like "ЗАО" and name like "Pupkin"".
Соответственно если у родительского узла есть свой родитель, то к этому запросу должно прибавляться значение дедушки.
Значение может переопределяться детьми.
Отец - "city like "Moscow" and firmtype like "ЗАО""
Сын - "firmtype like "ООО"",
запрос - "SELECT * from main where city like "Moscow" and firmtype like "ООО"".
kalliopiy (2002-07-22 15:38:00) [23]Если это тебе еще интересно, то можно было бы обсудить, но только хочется узнать побольше из того, что тебе требуется на выходе. Ну, например, насколько глубокое твое дерево, и при каких условиях, вообще, ты собираешься фильтровать таблицу ( т.е. я так понимаю, что пользователь из TreeView выбирает узелок, а тут бац и табличка отфильтровалась... Илил еще как?).
Поподробнее, плз.
kaif (2002-07-22 14:39:00) [24]Откуда такая любовь к деревьям?