Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.09;
Скачать: CL | DM;

Вниз

Построение дерева   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
14-25940
vajo
2004-02-14 18:54
2004.03.09
Компаненты Semples для D7


6-25845
csr
2004-01-04 12:46
2004.03.09
Проверка IP на наличие в RBL списках


1-25762
Zyb
2004-02-27 08:46
2004.03.09
Антивирусник


4-25964
uns
2004-01-01 22:36
2004.03.09
Контектное меню IE


14-25928
Домарощинер
2004-02-14 15:17
2004.03.09
Непонятные куки