Помогите отсортировать дерево данных
Помогите отсортировать дерево данных
Имеется дерево: прототип по статье Кузьменко Дмитрия "Древовидные (иерархические) структуры данных в реляционных базах данных Часть 1".
Забиты данные, всё строиться, всё замечательно, в Delphi всё хорошо.
Вопрос: Как отсортировать (т.е. перестроить дерево в визуальном компоненте), чтоб пользователь мог смотреть на дерево КАК БЫ сбоку, поясню:
есть родительские узлы, у этих узлов есть потомки, бывают одинаковые потомки у разных родителей. Так вот: нужно, чтоб сортировка прошла таким образом, чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА. Возможно ли хранить такие возможности в самой базе в каких-либо дополнительных полях? Жду совета.
Спасибо за внимание. Если я что-то не так объяснил, то потом могу еще добавить пояснения более конкретного характера.
Забиты данные, всё строиться, всё замечательно, в Delphi всё хорошо.
Вопрос: Как отсортировать (т.е. перестроить дерево в визуальном компоненте), чтоб пользователь мог смотреть на дерево КАК БЫ сбоку, поясню:
есть родительские узлы, у этих узлов есть потомки, бывают одинаковые потомки у разных родителей. Так вот: нужно, чтоб сортировка прошла таким образом, чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА. Возможно ли хранить такие возможности в самой базе в каких-либо дополнительных полях? Жду совета.
Спасибо за внимание. Если я что-то не так объяснил, то потом могу еще добавить пояснения более конкретного характера.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Помогите отсортировать дерево данных
Если лист может принадлежать нескольким ветвям одновременно, то это уже не дерево, а мутант какой-то.
А построение отображения что так что этак делается несложным программным кодом - циклами.
А построение отображения что так что этак делается несложным программным кодом - циклами.
Re: Помогите отсортировать дерево данных
ух, ох. я кажется понял, что имеется в виду. Это надо искать или компоненты или соответствующий инструмент.чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА.
К сожалению, прямо сейчас не могу вспомнить как такие штуки называются. Не то визуализация деревьев, не то навигация по деревьям ...
Когда то (лет 10-12 назад) у людей сносило крышу от примеров такой визуализации и навигации, и были разные продукты.
Сейчас вроде как все это заглохло, или переехало в какую то невидимую для меня плоскость.
Типа такого
http://www.cs.umd.edu/hcil/spacetree/
В общем, думаю, помучиться с поиском придется, но найти можно. Но не уверен, что не понадобиться как то дополнять структуру дерева...
Re: Помогите отсортировать дерево данных
Для Дмитрия Сибирякова:Dimitry Sibiryakov писал(а):Если лист может принадлежать нескольким ветвям одновременно, то это уже не дерево, а мутант какой-то.
А построение отображения что так что этак делается несложным программным кодом - циклами.
Поясню примером. Есть в древовидной базе главный родитель "ФИРМЫ". У него есть потомки поставщиков материала, т.е. названия фирм, такие как "АА", "ББ", "СС", "ДД". У каждой фирмы есть потомки. Имена их могут совпадать. Таким потомком может быть материал "ДСП", "ДВП". Так вот. Задача:
из простого отображения дерева сделать так, чтоб потомки с одинаковым именем стали узлом, а названия фирм стали Потомками, т.е. "ДСП" и "ДВП" станут родителями, а фирмы "АА", "ББ", "СС", "ДД" станут потомками у "ДСП", "ДВП". Конечно, же может быть много всяких наименований, поэтому нужен совет, как реализовать такую сортировку. Проще сделать это на сервере БД, или программным кодом в приложении. Жду советов.
Дмитрий, я прошел по ссылке, посмотрел, не совсем врубился, чего за тема. Я так понял, что там просто удобный инструментарий для создания древовидных структур. Иль я ошибаюсь. Но всё-равно жду помощи. )))kdv писал(а):ух, ох. я кажется понял, что имеется в виду. Это надо искать или компоненты или соответствующий инструмент.чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА.
К сожалению, прямо сейчас не могу вспомнить как такие штуки называются. Не то визуализация деревьев, не то навигация по деревьям ...
Когда то (лет 10-12 назад) у людей сносило крышу от примеров такой визуализации и навигации, и были разные продукты.
Сейчас вроде как все это заглохло, или переехало в какую то невидимую для меня плоскость.
Типа такого
http://www.cs.umd.edu/hcil/spacetree/
В общем, думаю, помучиться с поиском придется, но найти можно. Но не уверен, что не понадобиться как то дополнять структуру дерева...
Re: Помогите отсортировать дерево данных
а чего ждать-то? надо копать инет в поисках подходящих компонент или инструмента.
В ссылку я не вникал, я просто не помню в упор как динамический просмотр дерева называется.
Смотрели фильм Ночной Дозор? Когда там искали связи между событиями и людьми? Ну вот я примерно об этом.
Грубо говоря, подобный вывод (для меня уже) слишком тяжел, чтобы писать его самостоятельно. Надо пользоваться готовыми решениями, тем более что тема существует лет десять, это точно.
В ссылку я не вникал, я просто не помню в упор как динамический просмотр дерева называется.
Смотрели фильм Ночной Дозор? Когда там искали связи между событиями и людьми? Ну вот я примерно об этом.
Грубо говоря, подобный вывод (для меня уже) слишком тяжел, чтобы писать его самостоятельно. Надо пользоваться готовыми решениями, тем более что тема существует лет десять, это точно.
Re: Помогите отсортировать дерево данных
гм, тож верно. Ладно, благодарю за наводящие идеи и мысли. Буду искать. Где-то видел, как ребята тоже пытались эту проблему решить )))
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Помогите отсортировать дерево данных
Как я уже сказал - в приложении это простенький цикл по запросу. Я вообще не понимаю проблемы: в том же TTreeView развернуть у материала в качестве детей список фирм - работы на 15 минут.Zhekius писал(а):Проще сделать это на сервере БД, или программным кодом в приложении.
PS: "Потомки с одинаковыми именами" это нарушение третьей нормальной формы.
Re: Помогите отсортировать дерево данных
Как нарушение? Ведь в диске C:\ есть разные папки, а в них могут лежать два одинаковых файла. Иль я чего-то не догоняю?Zhekius писал(а):PS: "Потомки с одинаковыми именами" это нарушение третьей нормальной формы.
Блин, как быть то? ))
Re: Помогите отсортировать дерево данных
одинаковые по содержанию - это еще ничего не значит, на самом деле эти файлы разные.Ведь в диске C:\ есть разные папки, а в них могут лежать два одинаковых файла.
Даже если во второй папке лежит ССЫЛКА на файл в первой папке, опять же, там файл, а тут ссылка.
Мне, кстати, тоже не понравилась идея "склеивать" объекты, находящиеся на разных уровнях.
Re: Помогите отсортировать дерево данных
Нет, я не говорю про ссылки, а про копии одинаковых файлов в разных папках. Я не говорю про содержание файлов и про их физическое расположение на диске. Я говорю про их названия - они ведь идентичны....Вот.
Ну ладно, если что - жду советов по этой теме.
Ну ладно, если что - жду советов по этой теме.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Помогите отсортировать дерево данных
Если сам не в состоянии написать простенький цикл по результатам запроса - найми программиста.Zhekius писал(а):Ну ладно, если что - жду советов по этой теме.
Re: Помогите отсортировать дерево данных
Простенький? Ну, тогда приведите небольшой пример построения дерева (хотя бы перебор данных) с неизвестным кол-вом уровней... Ломал как-то голову, но так и не сломал Сделала 5-ть вложенных циклов (этого хватало для решения задачи) и все, а так хотелось сделать для неизвесного количества уровней, уже не до скорости...Dimitry Sibiryakov писал(а):Если сам не в состоянии написать простенький цикл по результатам запроса - найми программиста.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: Помогите отсортировать дерево данных
Antoxa писал(а):Простенький? Ну, тогда приведите небольшой пример построения дерева (хотя бы перебор данных) с неизвестным кол-вом уровней... Ломал как-то голову, но так и не сломал Сделала 5-ть вложенных циклов (этого хватало для решения задачи) и все, а так хотелось сделать для неизвесного количества уровней, уже не до скорости...
Код: Выделить всё
procedure TFrmMain.TVwRplExpanding(Sender: TObject; Node: TTreeNode;
var AllowExpansion: Boolean);
{ Scan all children for expanding node and add grandchildren if necessary.
Grandchildren have to be added if the child node has HasChildren true
but ChildCount=0. }
var
NodeIterator : TTreeNode; // child node, which must be parent for grandchildren
begin //TVwRplExpanding
NodeIterator := Node.getFirstChild;
While NodeIterator<>nil do
begin
If NodeIterator.HasChildren and (NodeIterator.GetFirstChild=nil) then
begin // Node marked as expandable but doesn't have children -> load them
NodeIterator.HasChildren := False; // reset '+' sign
NodeToFill := NodeIterator;
case NodeIterator.ImageIndex of
CRplTgtDbs: Cfg.ForEachTargetDb(AddTargetDatabase, PPublishedDb(Node.Data)^.ReplNo);
CRplTables: With PSubscribedDb(Node.Data)^ do
Cfg.ForEachRelation(AddRelationToTree, ReplNo, DbNo);
CRplColKeys: begin
Cfg.StartTransaction;
try
With PRelation(Node.Data)^ do
Cfg.ForEachKeyField(AddFieldToTree, ReplNo, TgtDbNo, RelationNo);
Cfg.CommitTransaction;
except
Cfg.RollbackTransaction;
raise;
end;
end;
CRplColData: begin
Cfg.StartTransaction;
try
With PRelation(Node.Data)^ do
Cfg.ForEachDataField(AddFieldToTree, ReplNo, TgtDbNo, RelationNo);
Cfg.CommitTransaction;
except
Cfg.RollbackTransaction;
raise;
end;
end;
end; //case
NodeIterator.CustomSort(@CompareProc, NodeIterator.ImageIndex);
end; // if
NodeIterator := NodeIterator.GetNextSibling;
end;
end; //TVwRplExpanding