Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-25802
Германн
2004-02-19 02:33
2004.03.09
Exceptions. Можно ли получить полный контроль над ними?


14-25885
Andryk
2004-02-12 11:45
2004.03.09
Давайте еще раз пообсуждаем наш закон об ОСАГО


14-25907
Grugan
2004-02-10 19:32
2004.03.09
WinInet функции


14-25864
Думкин
2004-02-17 10:54
2004.03.09
Задачка. Зачем ждать пятницы?


11-25724
puky
2003-05-23 19:16
2004.03.09
Kol и Shareware





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский