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

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

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

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

Добавлено: 10 ноя 2009, 14:35
Dimitry Sibiryakov
Если лист может принадлежать нескольким ветвям одновременно, то это уже не дерево, а мутант какой-то.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 14 ноя 2009, 13:38
Dimitry Sibiryakov
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