|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
treeView в базу и обратно
Приветствую.
Суть: юзер заходит в прогу, создает или меняет дерево (иерархия сотрудников), сохраняет в базу (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 (или подобные)
Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#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 которое содержит порядок вывода записи (такая себе искуственная сортировка)
Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
Этот пользователь сказал Спасибо 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 и не париться
Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#13
|
||||
|
||||
Ой-вей, как сложно. Делается таблица с колонкой parent_node (key) и все. Корень не имеет предка. Разворачивать из бд можно иерархическим запросом (connect by ... prior) и все. Набить дерево породительским ключам - как два пальца об асфальт.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#14
|
||||
|
||||
Цитата:
как базу выгрузить? какой-то спартанский компонент... Я за здоровый экстрим! Спасибо за "спасибо") |
#15
|
||||
|
||||
А мой вариант не подходит?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |