Помогите отсортировать дерево данных

Модераторы: kdv, CyberMax

Ответить
Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Помогите отсортировать дерево данных

Сообщение Zhekius » 10 ноя 2009, 12:20

Имеется дерево: прототип по статье Кузьменко Дмитрия "Древовидные (иерархические) структуры данных в реляционных базах данных Часть 1".
Забиты данные, всё строиться, всё замечательно, в Delphi всё хорошо.
Вопрос: Как отсортировать (т.е. перестроить дерево в визуальном компоненте), чтоб пользователь мог смотреть на дерево КАК БЫ сбоку, поясню:
есть родительские узлы, у этих узлов есть потомки, бывают одинаковые потомки у разных родителей. Так вот: нужно, чтоб сортировка прошла таким образом, чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА. Возможно ли хранить такие возможности в самой базе в каких-либо дополнительных полях? Жду совета.
Спасибо за внимание. Если я что-то не так объяснил, то потом могу еще добавить пояснения более конкретного характера.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Помогите отсортировать дерево данных

Сообщение Dimitry Sibiryakov » 10 ноя 2009, 14:35

Если лист может принадлежать нескольким ветвям одновременно, то это уже не дерево, а мутант какой-то.

А построение отображения что так что этак делается несложным программным кодом - циклами.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Помогите отсортировать дерево данных

Сообщение kdv » 10 ноя 2009, 17:46

чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА.
ух, ох. я кажется понял, что имеется в виду. Это надо искать или компоненты или соответствующий инструмент.
К сожалению, прямо сейчас не могу вспомнить как такие штуки называются. Не то визуализация деревьев, не то навигация по деревьям ...
Когда то (лет 10-12 назад) у людей сносило крышу от примеров такой визуализации и навигации, и были разные продукты.
Сейчас вроде как все это заглохло, или переехало в какую то невидимую для меня плоскость.
Типа такого
http://www.cs.umd.edu/hcil/spacetree/

В общем, думаю, помучиться с поиском придется, но найти можно. Но не уверен, что не понадобиться как то дополнять структуру дерева...

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Помогите отсортировать дерево данных

Сообщение Zhekius » 11 ноя 2009, 15:13

Dimitry Sibiryakov писал(а):Если лист может принадлежать нескольким ветвям одновременно, то это уже не дерево, а мутант какой-то.

А построение отображения что так что этак делается несложным программным кодом - циклами.
Для Дмитрия Сибирякова:
Поясню примером. Есть в древовидной базе главный родитель "ФИРМЫ". У него есть потомки поставщиков материала, т.е. названия фирм, такие как "АА", "ББ", "СС", "ДД". У каждой фирмы есть потомки. Имена их могут совпадать. Таким потомком может быть материал "ДСП", "ДВП". Так вот. Задача:
из простого отображения дерева сделать так, чтоб потомки с одинаковым именем стали узлом, а названия фирм стали Потомками, т.е. "ДСП" и "ДВП" станут родителями, а фирмы "АА", "ББ", "СС", "ДД" станут потомками у "ДСП", "ДВП". Конечно, же может быть много всяких наименований, поэтому нужен совет, как реализовать такую сортировку. Проще сделать это на сервере БД, или программным кодом в приложении. Жду советов.
kdv писал(а):
чтобы одинаковые потомки стали одним УЗЛОМ, а родители стали потомками от этого УЗЛА.
ух, ох. я кажется понял, что имеется в виду. Это надо искать или компоненты или соответствующий инструмент.
К сожалению, прямо сейчас не могу вспомнить как такие штуки называются. Не то визуализация деревьев, не то навигация по деревьям ...
Когда то (лет 10-12 назад) у людей сносило крышу от примеров такой визуализации и навигации, и были разные продукты.
Сейчас вроде как все это заглохло, или переехало в какую то невидимую для меня плоскость.
Типа такого
http://www.cs.umd.edu/hcil/spacetree/

В общем, думаю, помучиться с поиском придется, но найти можно. Но не уверен, что не понадобиться как то дополнять структуру дерева...
Дмитрий, я прошел по ссылке, посмотрел, не совсем врубился, чего за тема. Я так понял, что там просто удобный инструментарий для создания древовидных структур. Иль я ошибаюсь. Но всё-равно жду помощи. )))

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Помогите отсортировать дерево данных

Сообщение kdv » 11 ноя 2009, 22:13

а чего ждать-то? надо копать инет в поисках подходящих компонент или инструмента.
В ссылку я не вникал, я просто не помню в упор как динамический просмотр дерева называется.
Смотрели фильм Ночной Дозор? Когда там искали связи между событиями и людьми? Ну вот я примерно об этом.
Грубо говоря, подобный вывод (для меня уже) слишком тяжел, чтобы писать его самостоятельно. Надо пользоваться готовыми решениями, тем более что тема существует лет десять, это точно.

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Помогите отсортировать дерево данных

Сообщение Zhekius » 12 ноя 2009, 07:01

гм, тож верно. Ладно, благодарю за наводящие идеи и мысли. Буду искать. Где-то видел, как ребята тоже пытались эту проблему решить ))) :roll:

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Помогите отсортировать дерево данных

Сообщение Dimitry Sibiryakov » 12 ноя 2009, 13:26

Zhekius писал(а):Проще сделать это на сервере БД, или программным кодом в приложении.
Как я уже сказал - в приложении это простенький цикл по запросу. Я вообще не понимаю проблемы: в том же TTreeView развернуть у материала в качестве детей список фирм - работы на 15 минут.

PS: "Потомки с одинаковыми именами" это нарушение третьей нормальной формы.

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Помогите отсортировать дерево данных

Сообщение Zhekius » 12 ноя 2009, 15:08

Zhekius писал(а):PS: "Потомки с одинаковыми именами" это нарушение третьей нормальной формы.
Как нарушение? Ведь в диске C:\ есть разные папки, а в них могут лежать два одинаковых файла. Иль я чего-то не догоняю? :roll:
Блин, как быть то? ))

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Помогите отсортировать дерево данных

Сообщение kdv » 13 ноя 2009, 08:25

Ведь в диске C:\ есть разные папки, а в них могут лежать два одинаковых файла.
одинаковые по содержанию - это еще ничего не значит, на самом деле эти файлы разные.
Даже если во второй папке лежит ССЫЛКА на файл в первой папке, опять же, там файл, а тут ссылка.
Мне, кстати, тоже не понравилась идея "склеивать" объекты, находящиеся на разных уровнях.

Zhekius
Сообщения: 25
Зарегистрирован: 08 июл 2008, 14:57

Re: Помогите отсортировать дерево данных

Сообщение Zhekius » 13 ноя 2009, 11:09

Нет, я не говорю про ссылки, а про копии одинаковых файлов в разных папках. Я не говорю про содержание файлов и про их физическое расположение на диске. Я говорю про их названия - они ведь идентичны....Вот.
Ну ладно, если что - жду советов по этой теме.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Помогите отсортировать дерево данных

Сообщение Dimitry Sibiryakov » 13 ноя 2009, 14:21

Zhekius писал(а):Ну ладно, если что - жду советов по этой теме.
Если сам не в состоянии написать простенький цикл по результатам запроса - найми программиста.

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Re: Помогите отсортировать дерево данных

Сообщение Antoxa » 14 ноя 2009, 10:59

Dimitry Sibiryakov писал(а):Если сам не в состоянии написать простенький цикл по результатам запроса - найми программиста.
Простенький? Ну, тогда приведите небольшой пример построения дерева (хотя бы перебор данных) с неизвестным кол-вом уровней... Ломал как-то голову, но так и не сломал :) Сделала 5-ть вложенных циклов (этого хватало для решения задачи) и все, а так хотелось сделать для неизвесного количества уровней, уже не до скорости...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: Помогите отсортировать дерево данных

Сообщение Dimitry Sibiryakov » 14 ноя 2009, 13:38

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

Ответить