Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Построение дерева [D6, IB6.x]


Senator ©   (2004-02-11 13:17:00) 

Такой вопрос:
есть таблица с полями: ID(PK), Unit_ID,Parent
Unit_ID и Parent - связаны между собой иерархией.
Как построить дерево TTreeView по этой таблице ?
(FireBird,Delphi6)


HSolo   (2004-02-11 15:14:00) [1]

http://delphi.vitpc.com/helloworld/dbtreeview.htm

http://ibase.ru/develop.htm- раздел про древовидные структуры


VLAD-MAL   (2004-02-11 14:53:00) [2]

Ну и фиг с ним, с Child_Count, вместо него подзапросы делай типа:
Select count(*) where Parent_Unit_id = :My_Unit_id

Если > 0, то детки есть, если = 0, то нет.

А ХП тоже нельзя? - тогда на клиенте, только трафик большой будет, если все дерево грузить сразу. Я как-то делал раньше так:
- грузил только самый верхний уровень + вычислял, есть ли подуровни (чтобы отображать "крестики" в узлах)


Senator   (2004-02-11 14:48:00) [3]

все понятно, токо я не могу изменять структуру таблицы


VLAD-MAL   (2004-02-11 14:47:00) [4]

А как же! Еще на клиенте поработать придется - из полученного набора строить отображение. И опять ChildCount пригодился бы - чтобы знать, делать ли запрос построения подуровней текущей ветки.


Senator   (2004-02-11 14:42:00) [5]

еще варианты есть ?


VLAD-MAL   (2004-02-11 13:53:00) [6]

Ну, не создавай, ChildCount - это для оптимизации запросов при выборке, а Location - для корректного отображения.


Senator   (2004-02-11 13:48:00) [7]

Мне не надо создавать
поля Location и ChildCount


VLAD-MAL   (2004-02-11 13:44:00) [8]

Раз у тебя 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:41:00) [9]

Та слышал, и знаю, что надо ее сюда.
Но что то никак не соображу...


Vlad   (2004-02-11 13:38:00) [10]

Про рекурсию что нибудь слышал ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо