Страница 1 из 2

Загрузка дерева из БД

Добавлено: 04 май 2006, 13:53
Лелик_1044
Лазил по инету примеров не нашел только пару статей

Допустим есть база

[Name] [Num] [Lev]
Республика Беларусь 1 1
Минская область 2 2
г. Минск 3 3
5 магазинов 4 4
Республика Беларусь 5 1
Минская область 6 2
г. Заславль 7 3
15 магазинов 8 4
[Name] - название
[Num] - порядок дерева
[Lev] - уровень ноды

В результате должен получить следующее

Республика Беларусь
- Минская область
- - г. Минск
- - - 5 магазинов
- - г. Заславль
- - - 15 магазинов

Как это все прдестаывить в виде дерева?
Протсо когда делаю проверку на существование ноды (в даном примере нода Минская область повторяется) на это тратится время
Дерево строится но с большим временем

Или может кто подскажет как производить поиск по ноде на один уровень ниже.
Допустим я сейчас стою на ноде Минская область, следовательно поиск должен происходить только на 2 нода уровнем ниже (г.Минск и г. Заславль)

Добавлено: 05 май 2006, 09:10
LAngel
Не знаю, верно ли делаю, но обычно, для хранения подчиненных данных (оно же, деревьев), использую просто ссылку на родителя.
например:
id, parent, text
0, , Минская область
1, 0, г. Минск
2, 1, 5 магазинов
3, 0, г. Заславль
4, 3, 15 магазинов

при выборке - фильтруем по полю parent, сначала по пустому (ну или можно -1 задать на некоторых базах)
потом пробегаем по сету и для каждого элемента делаем выборку по parent=id родителя и т.д. пока
выборка не будет пустая

Добавлено: 05 май 2006, 11:13
Игорь Акопян
LAngel, что называется +1 :)

Добавлено: 05 май 2006, 11:16
LAngel
Игорь Акопян, имелось ввиду кол с плюсом ;) ?

Добавлено: 05 май 2006, 12:53
Лелик_1044
4, 3, 15 магазинов
почему 3???

так это всем сводится к моему примеру.
дерво я могу загружать меня интересует вопрос как уменишть время на проверк уникальных нодов?

Добавлено: 05 май 2006, 15:21
Игорь Акопян
LAngel, имелось ввиду "аналогично" :)

Лелик,
ID = 4
RefParent = 3
Text = "15 магазинов"
refparent ссылается на ID родителя

Добавлено: 10 май 2006, 12:31
vunder
У меня дерево формируется так:
ищутся элементы с нулевым ID - коревые, затем для каждого элемента ищутся его потомки, и т.д.

Добавлено: 10 май 2006, 17:51
Лелик_1044
А енсли нода уже существует?

Добавлено: 11 май 2006, 11:55
vunder
Если уже есть, то здесь по-сложнее. Придется делать лишние проверки и поиски родителя - а это время. Так что при существующем списке быстро сделать не получится. Основная проблема - перебор нодов.
Так делатьнеправильно
for i := 0 to Tree.Items.Count-1 do
if Tree.Items='ddfdf' then

Лучше так (и намного быстрее)
Noddy := MyTreeView.Items[0];
Searching := true;
while (Searching) and (Noddy <> nil) do
begin
if Noddy.text = SearchTarget then
begin
Searching := False;
MyTreeView.Selected := Noddy;
MyTreeView.SetFocus;
end
else
begin
Noddy := Noddy.GetNext
end;
end;

Добавлено: 11 май 2006, 16:02
Blood_Magic
vunder
а по моему ничем не отличается