![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Приветствую.
Суть: юзер заходит в прогу, создает или меняет дерево (иерархия сотрудников), сохраняет в базу (mysql), в следующий раз загружает это дерево и опять меняет - создает... Как дерево сделать в базе?? |
|
#2
|
||||
|
||||
|
Вам структуру БД для формирования дерева? Обычно так: ID, ParentID, Context
|
|
#3
|
||||
|
||||
|
а алгоритм разворачивания из БД?
у меня у дедки может и пра-пра-правнучка(и) быть) зачем context? |
|
#4
|
||||
|
||||
|
Цитата:
Цитата:
Допустим есть такая иерархия: Точка - Линия - Многоугольник - Прямоугольник - Квадрат Точка - Линия - Многоугольник - Трапеция - Ромб В базу запишется: ID, ParentID, Context 1, -1, Точка 2, 1, Линия 3, 2, Многоугольник 4, 3, Прямоугольник 5, 4, Квадрат 6, 3, Трапеция 7, 6, Ромб Иерархию можно продолжать до бесконечности. Последний раз редактировалось Страдалецъ, 29.07.2013 в 17:07. |
|
#5
|
||||
|
||||
|
и вместо обычного treeView использовать DBVirtualTreeView (или подобные)
|
|
#6
|
||||
|
||||
|
получается, дерево строится, но только если имена в базе упорядочены, начиная с корня, сверху-вниз, вот так
имя | начальник зам.директор1 | директор зам.директор2 | директор зам.директор3 | директор ст.менеджер | зам.директор1 ст.монтажник | зам.директор2 прораб | зам.директор3 менеджер | ст.менеджер код: Код:
TreeView1.Items.Clear;
TreeView1.Items.AddChild(nil, 'root');
dm.ADOQuery1.SQL.Text:='select surname, boss from stryktyra';
dm.ADOQuery1.Open;
dm.ADOQuery1.First;
while not dm.ADOQuery1.Eof do
begin
for i:=0 to TreeView1.Items.Count-1 do
begin
if TreeView1.items[i].Text = dm.ADOQuery1.FieldByName('boss').AsString then
TreeView1.Items.AddChild(TreeView1.items[i], dm.ADOQuery1.FieldByName('surname').AsString);
end;
dm.ADOQuery1.Next;
end;а если структура не упорядочена, например имя | начальник зам.директор1 | директор прораб | зам.директор3 зам.директор2 | директор менеджер | ст.менеджер зам.директор3 | директор ст.менеджер | зам.директор1 ст.монтажник | зам.директор2 то это получается нужно делать несколько прогонов с условием, что имени нет в дереве. то есть все это пихать еще в FOR от 1 до количества записей в БД... примерно прикинул - доолго!! мой метод в лоб и нубский, какие еще алгоритмы существуют? |
|
#7
|
||||
|
||||
|
Ну а что мешает сделать запрос с сортировкой?
Код:
select surname, boss from stryktyra order by boss Последний раз редактировалось Страдалецъ, 30.07.2013 в 17:22. |
|
#8
|
||||
|
||||
|
Цитата:
причем тут сортировка по алфавиту?? |
|
#9
|
||||
|
||||
|
в структуру имя | начальник добавляется поле priority которое содержит порядок вывода записи (такая себе искуственная сортировка)
|
| Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение: | ||
Mrak (31.07.2013)
| ||
|
#10
|
||||
|
||||
|
Цитата:
Вот вам еще раз показываю с вашими уже данными: КодДолжности, КодНачальника, Должность 1, -1, Директор 2, 1, Зам. директора1 3, 1, Зам. директора2 4, 1, Зам. директора3 5, 4, Прораб 6, 2, ст.менеджер 7, 6, менеджер 8, 3, ст.монтажник Последний раз редактировалось Страдалецъ, 30.07.2013 в 19:45. |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Mrak (31.07.2013)
| ||
|
#11
|
||||
|
||||
|
У treeview собственная индексация возникает, в результате дерево строится неправильно, вот
![]() код Код:
TreeView1.Items.Clear;
TreeView1.Items.AddChild(nil, 'root');
dm.ADOQuery1.SQL.Text:='select id, surname, boss from asyp.stryktyra';
try
dm.ADOQuery1.Open;
except
end;
dm.ADOQuery1.First;
while not dm.ADOQuery1.Eof do
begin
TreeView1.Items.AddChild(TreeView1.items[dm.ADOQuery1.FieldByName('boss').AsInteger], dm.ADOQuery1.FieldByName('surname').AsString);
dm.ADOQuery1.Next;
end;или я что-то не так понял? |
|
#12
|
||||
|
||||
|
ну говорил же тебе взять DBVirtualTreeView и не париться
|
|
#13
|
||||
|
||||
|
Ой-вей, как сложно. Делается таблица с колонкой parent_node (key) и все. Корень не имеет предка. Разворачивать из бд можно иерархическим запросом (connect by ... prior) и все. Набить дерево породительским ключам - как два пальца об асфальт.
|
|
#14
|
||||
|
||||
|
Цитата:
как базу выгрузить? какой-то спартанский компонент... ![]() |
|
#15
|
||||
|
||||
|
А мой вариант не подходит?
|