Форум: "Базы";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
ВнизПостроение дерева Найти похожие ветки
← →
Senator (2004-02-11 13:17) [0]Такой вопрос:
есть таблица с полями: ID(PK), Unit_ID,Parent
Unit_ID и Parent - связаны между собой иерархией.
Как построить дерево TTreeView по этой таблице ?
(FireBird,Delphi6)
← →
Vlad (2004-02-11 13:38) [1]Про рекурсию что нибудь слышал ?
← →
Senator (2004-02-11 13:41) [2]Та слышал, и знаю, что надо ее сюда.
Но что то никак не соображу...
← →
VLAD-MAL (2004-02-11 13:44) [3]Раз у тебя IB6, рекомендую юзать ХП, которая будет тебе возвращать дерево как набор данных. Трафик сети будет лучше.
Пример:
CREATE TABLE PART_CATEGORY (
PART_CATEGORY_ID T_PART_CATEGORY_ID NOT NULL,
BASE_PART_CATEGORY_ID T_BASE_PART_CATEGORY_ID NOT NULL,
FNAME_SHORT T_FNAME_SHORT NOT NULL,
LOCATION T_LOCATION,
CHILD_COUNT T_CHILD_COUNT
);
Тогда процедура будет такая:
CREATE PROCEDURE GET_TREE_PART_CATEGORY (
MASTER_PART_CATEGORY_ID INTEGER)
RETURNS (
PART_CATEGORY_ID INTEGER,
BASE_PART_CATEGORY_ID INTEGER,
FNAME_SHORT VARCHAR(84),
LOCATION INTEGER,
CHILD_COUNT INTEGER)
AS
begin
for select part_category_id, base_part_category_id, fname_short, location, child_count
from Part_Category T
where Base_Part_Category_id =:MASTER_Part_Category_id
order by T.Location, T.FName_Short
into :part_category_id, :base_part_category_id, :fname_short, :location, :child_count
do begin
suspend;
if (Child_Count > 0) then
for select part_category_id, base_part_category_id, fname_short, location, child_count
from get_tree_part_category(:Part_Category_id)
into :part_category_id, :base_part_category_id, :fname_short, :location, :child_count
do suspend;
end
end
Обращаешься к ней просто:
Select * from GET_TREE_PART_CATEGORY(0) - и получаешь все, начиная с корня...
Посмотри на IBASE.RU - там много всего интересного.
← →
Senator (2004-02-11 13:48) [4]Мне не надо создавать
поля Location и ChildCount
← →
VLAD-MAL (2004-02-11 13:53) [5]Ну, не создавай, ChildCount - это для оптимизации запросов при выборке, а Location - для корректного отображения.
← →
Senator (2004-02-11 14:42) [6]еще варианты есть ?
← →
VLAD-MAL (2004-02-11 14:47) [7]А как же! Еще на клиенте поработать придется - из полученного набора строить отображение. И опять ChildCount пригодился бы - чтобы знать, делать ли запрос построения подуровней текущей ветки.
← →
Senator (2004-02-11 14:48) [8]все понятно, токо я не могу изменять структуру таблицы
← →
VLAD-MAL (2004-02-11 14:53) [9]Ну и фиг с ним, с Child_Count, вместо него подзапросы делай типа:
Select count(*) where Parent_Unit_id = :My_Unit_id
Если > 0, то детки есть, если = 0, то нет.
А ХП тоже нельзя? - тогда на клиенте, только трафик большой будет, если все дерево грузить сразу. Я как-то делал раньше так:
- грузил только самый верхний уровень + вычислял, есть ли подуровни (чтобы отображать "крестики" в узлах)
← →
HSolo (2004-02-11 15:14) [10]http://delphi.vitpc.com/helloworld/dbtreeview.htm
http://ibase.ru/develop.htm - раздел про древовидные структуры
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c