Конференция "Базы" » Визуализация Иерархической структуры [IB6.x]
 
  • Дима (29.04.08 14:14) [0]
    Подскажите пожалуйста, как реализовать следующее:
        есть таблица в БД (IB6.x), в ней такие поля
    - id - идентификатор уникальный
    - name - название подразделения
    - link_to - идентификатор родителя
     Т.е. простая иерархическая структура Подразделений.
    Необходимо на Дельфи визуализировать в виде дерева, при чём полностью раскрытого, т.е. показать все листья дерева, при этом не использую рекурсии.
    Как это сделать не меняя структуры таблицы?
  • Ega23 © (29.04.08 14:25) [1]
    1. Взять TTreeView, проанализировать набор данных, добавить в дерево нужные узлы.
    2. Написать (скачать из сети) какой-нибудь TDBTreeView. (Могу поделиться своим, но он у меня на специальные задачи заточен; комментариев и пояснений давать не буду, только голый исходник).
  • Sergey13 © (29.04.08 14:32) [2]
    > [0] Дима   (29.04.08 14:14)
    > при этом не использую рекурсии.

    Почему такое ограничение?
  • Ega23 © (29.04.08 14:34) [3]

    > Почему такое ограничение?


    Рекурсия в DataSet - бессмысленная штука.
    А вот пройти один раз, построить список и вычислить корневые элементы, а дальше с этим списком рекурсивно работать - вот это уже другое дело.
  • Reindeer Moss Eater © (29.04.08 14:34) [4]
    Наверное потому, что элементов дерева может быть слишком много и грузить его сразу целиком нет смысла.
  • Reindeer Moss Eater © (29.04.08 14:37) [5]
    Есть готовая библиотека VirtualControls. В том числе для DB.
  • Ega23 © (29.04.08 14:48) [6]

    > Наверное потому, что элементов дерева может быть слишком
    > много и грузить его сразу целиком нет смысла.


    Он же разом всё дерево раскрыть хочет?
  • Reindeer Moss Eater © (29.04.08 14:52) [7]
    Ну тады VirtualControls.
    Все что ему надо - два ключа в датасете.
  • Дима (29.04.08 14:56) [8]
    При запуске программы должно отобразиться полностью открытое дерево с показом всех листьев. Как просканировать всю базу и подобавлять в Дерево не использую рекурсии (т.к. элементов много и вложенность большая).
     А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.
  • Reindeer Moss Eater © (29.04.08 15:05) [9]
    Чот ты по ходу темы меняешь исходные данные вопроса.
  • Дима (29.04.08 15:08) [10]
    Почему меняю?
    Я просто пояснил, что надо показать полностью открытое дерево!
  • Reindeer Moss Eater © (29.04.08 15:14) [11]
    Полностью открытое? Да неужели?

    А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.
  • Reindeer Moss Eater © (29.04.08 15:15) [12]
    А в прочем по барабану.
    TVirtualDBTree и все.
  • Loginov Dmitry © (29.04.08 19:45) [13]
    > при этом не использую рекурсии.


    рекурсия = рекурсивный SELECT - запрос? Какая же там вложенность, если даже такой запрос не канает?
  • Дима (29.04.08 21:57) [14]
    запрос канает, но пользоваться рекурсией запрещено
  • Игорь Шевченко © (30.04.08 00:44) [15]

    > но пользоваться рекурсией запрещено


    религией ?
  • Павел Калугин © (30.04.08 01:33) [16]
    > [15] Игорь Шевченко ©   (30.04.08 00:44)

    да какая религия. я в МС наступал на ограничения вложенности вызовов пытаясь рекурсивно построить вожможные комбинации из 3-х бмажек. из 3-х еще строило а из 4-х уже все. столько раз сама себя хранимка вызвать не могеть
  • Reindeer Moss Eater © (30.04.08 01:49) [17]
    А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.

    У него вложенность - два уровня.
  • Ega23 © (30.04.08 07:54) [18]

    > да какая религия. я в МС наступал на ограничения вложенности
    > вызовов пытаясь рекурсивно построить вожможные комбинации
    > из 3-х бмажек. из 3-х еще строило а из 4-х уже все. столько
    > раз сама себя хранимка вызвать не могеть
    >


    Павель, не гони, ограничение на 32 вызова в глубину.
  • Павел Калугин © (30.04.08 09:10) [19]
    > [17] Reindeer Moss Eater ©

    обратимся к истокам
    - id - идентификатор уникальный
    - name - название подразделения
    - link_to - идентификатор родителя
    Т.е. простая иерархическая структура Подразделений.



    так вот ну не 2 так уж точно а до бесконечности. (ну почти)
    0. Холдинг (рога и копыта)
    1.   предприятие в холдинге (ЧОП Шапокляк)
    2.     отраслевой филиал (Сыскное Агентство Лриска)
    3.        региональный филиал (Лариска в Московской Области)
    4.           районный филиал  (Лариска в Красногорском районе)
    5.               местное отделение (Лариска в Опалихе)
    5.                управление (Вынюхивание)
    6.                    отдел    (запах денег)
    7.                      группа   (по нефтебаксам)

    Хотя да 32 уровня набрать сложно, но можно. Заказчики они такие. Им только дай расширяемую структуру - моментально за диапазоны разумные вылетят и будут орать что ты им каку подложил за их кровные.

    > [18] Ega23 ©   (30.04.08 07:54)

    помоему поболе но на него я и наступил:)
    толька задача веселее чем дерево подразделений собрать была...  грубо есть список акций А. выбираем любые (самые дорогие) N. построить список всех возможных комбинаций от A[1] до А[N] такой что стоимость комбинации не превышает стоимости 1*A[1]+1*A[2]+...1*A[N]
    от тут когда N 4- то через раз работало (от цен в зависимости) а при 5 уже стабильно за ограничение.
  • Reindeer Moss Eater © (30.04.08 09:21) [20]
    обратимся к истокам
    А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.

    То есть он не собирается сразу строить все дерево на всю его глубину.
    Первый шаг - отобразить верхний уровень иерархии.
    При выборе конкретного узла - построить всех его дочек.
    И так далее.
  • Reindeer Moss Eater © (30.04.08 09:21) [21]
    Либон он просто не умеет излагать мысли на родном языке.
  • Павел Калугин © (30.04.08 09:32) [22]
    > [20] Reindeer Moss Eater ©   (30.04.08 09:21)

    ну если раскрывать ветвь по клику то какая рекурсия? на королевство читать про DbTree своими руками. Там это и описано

    а если размотать сразу все дерево на пять экранов то ....

    > [21] Reindeer Moss Eater ©   (30.04.08 09:21)

    Мы все учились понемногу когда-нибудь и как-нибудь (С)
  • Ega23 © (30.04.08 09:49) [23]

    > помоему поболе но на него я и наступил:)


    Даже вот так:

    Nesting occurs when one stored procedure calls another. The nesting level is incremented when the called procedure begins execution, and it is decremented when the called procedure has finished. Exceeding the maximum of 32 nesting levels causes the entire calling procedure chain to fail. The current nesting level is stored in the @@NESTLEVEL function.


  • Павел Калугин © (30.04.08 10:51) [24]
    спорить не буду.. факт что не хватило. Эх завести что ли тему как размотать эту рекурсию в цикл:)
  • Ega23 © (30.04.08 11:15) [25]

    > Эх завести что ли тему как размотать эту рекурсию в цикл:


    sniknik давал тут скрипт...
  • Anatoly Podgoretsky © (30.04.08 15:48) [26]
    > Павел Калугин  (30.04.2008 09:10:19)  [19]

    Что бы не орали, должно быть или в ТЗ или в ТД указана максимальная глубина.
  • Павел Калугин © (30.04.08 16:06) [27]

    > Anatoly Podgoretsky ©   (30.04.08 15:48) [26]

    А ещё проверка в коде при попытке добавить уровень, и если он N+1 то посылать такого добавлятеля читать руководство пользователя.
  • Anatoly Podgoretsky © (30.04.08 16:23) [28]
    > Павел Калугин  (30.04.2008 16:06:27)  [27]

    Хорошое дело и пускать только после письменного подтверждения, что прочитал.
  • Anatoly Podgoretsky © (30.04.08 16:25) [29]
    > Павел Калугин  (30.04.2008 16:06:27)  [27]

    Да и учесть, что русские любое руководство/лицензию, на любом языке в состоянии прочитать за 0,5 секунды, так что таймер встроить из расчета 1 минута на страницу.
  • Дима (30.04.08 18:04) [30]
    Удалено модератором
    Примечание: Выражения выбираем, не в пивной
  • Павел Калугин © (30.04.08 19:28) [31]
    Ну на сервере запрещена? а на клиенте?
    или такой же гемморой как у мня - клиента нет как факт?
    тогда где дерево рисуешь?

    про пару вызовов и все
    а куда больше? сколько уровней вложенности у дерева? >3? это чтоза холдинг такой? я с трудом 7 насчитал,  половину выдумал.

    в чем сермяжная правда держать раскрытой более одной ветви дерева? Это действительно так необходимо? экрана хватает? Тем более что данные в отрисованном дереве могут менять другие пользователи? неполучится ли ситуации "на палубу вышел а палубы нет"
  • Павел Калугин © (30.04.08 19:31) [32]

    > Anatoly Podgoretsky ©   (30.04.08 16:23) [28]

    угу. пройти тест- зачет по мануалу.  в зависимости от баллов урезать права доступа:)
  • Anatoly Podgoretsky © (30.04.08 22:05) [33]
    > Павел Калугин  (30.04.2008 19:31:32)  [32]

    Количество минут равно глубине дерева, а при количестве минут 32 и более перезагружать компьютер, с сообщением куда ему идти.
  • MsGuns © (01.05.08 21:10) [34]
    1. Нечего советовать ставить сторонние компоненты там, где совершенно спокойно можно обойтись "родными" - в данном случае TTreeView
    2. Отображение дерева можно вполне делать без "рекурсии", выбирая входящие в узел только по требованию пользователя банальным запросом, однако при этом не будет выполнено условие "сразу все дерево до листьев".
    3. Алгоритм "деревянной" рекурсии прост как дерево ;) Примеров в сети масса.
 
Конференция "Базы" » Визуализация Иерархической структуры [IB6.x]
Есть новые Нет новых   [134432   +19][b:0.001][p:0.002]