-
Подскажите пожалуйста, как реализовать следующее:
есть таблица в БД (IB6.x), в ней такие поля
- id - идентификатор уникальный
- name - название подразделения
- link_to - идентификатор родителя
Т.е. простая иерархическая структура Подразделений.
Необходимо на Дельфи визуализировать в виде дерева, при чём полностью раскрытого, т.е. показать все листья дерева, при этом не использую рекурсии.
Как это сделать не меняя структуры таблицы?
-
1. Взять TTreeView, проанализировать набор данных, добавить в дерево нужные узлы.
2. Написать (скачать из сети) какой-нибудь TDBTreeView. (Могу поделиться своим, но он у меня на специальные задачи заточен; комментариев и пояснений давать не буду, только голый исходник).
-
> [0] Дима (29.04.08 14:14)
> при этом не использую рекурсии.
Почему такое ограничение?
-
> Почему такое ограничение?
Рекурсия в DataSet - бессмысленная штука.
А вот пройти один раз, построить список и вычислить корневые элементы, а дальше с этим списком рекурсивно работать - вот это уже другое дело.
-
Наверное потому, что элементов дерева может быть слишком много и грузить его сразу целиком нет смысла.
-
Есть готовая библиотека VirtualControls. В том числе для DB.
-
> Наверное потому, что элементов дерева может быть слишком
> много и грузить его сразу целиком нет смысла.
Он же разом всё дерево раскрыть хочет?
-
Ну тады VirtualControls.
Все что ему надо - два ключа в датасете.
-
При запуске программы должно отобразиться полностью открытое дерево с показом всех листьев. Как просканировать всю базу и подобавлять в Дерево не использую рекурсии (т.к. элементов много и вложенность большая).
А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.
-
Чот ты по ходу темы меняешь исходные данные вопроса.
-
Почему меняю?
Я просто пояснил, что надо показать полностью открытое дерево!
-
Полностью открытое? Да неужели?
А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.
-
А в прочем по барабану.
TVirtualDBTree и все.
-
> при этом не использую рекурсии.
рекурсия = рекурсивный SELECT - запрос? Какая же там вложенность, если даже такой запрос не канает?
-
запрос канает, но пользоваться рекурсией запрещено
-
> но пользоваться рекурсией запрещено
религией ?
-
> [15] Игорь Шевченко © (30.04.08 00:44)
да какая религия. я в МС наступал на ограничения вложенности вызовов пытаясь рекурсивно построить вожможные комбинации из 3-х бмажек. из 3-х еще строило а из 4-х уже все. столько раз сама себя хранимка вызвать не могеть
-
А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.
У него вложенность - два уровня.
-
> да какая религия. я в МС наступал на ограничения вложенности
> вызовов пытаясь рекурсивно построить вожможные комбинации
> из 3-х бмажек. из 3-х еще строило а из 4-х уже все. столько
> раз сама себя хранимка вызвать не могеть
>
Павель, не гони, ограничение на 32 вызова в глубину.
-
> [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 уже стабильно за ограничение.
-
обратимся к истокам
А затем уже по нажатии на определённый элемент - сканировать только данное поддерево.
То есть он не собирается сразу строить все дерево на всю его глубину.
Первый шаг - отобразить верхний уровень иерархии.
При выборе конкретного узла - построить всех его дочек.
И так далее.
-
Либон он просто не умеет излагать мысли на родном языке.
-
> [20] Reindeer Moss Eater © (30.04.08 09:21)
ну если раскрывать ветвь по клику то какая рекурсия? на королевство читать про DbTree своими руками. Там это и описано
а если размотать сразу все дерево на пять экранов то ....
> [21] Reindeer Moss Eater © (30.04.08 09:21)
Мы все учились понемногу когда-нибудь и как-нибудь (С)
-
> помоему поболе но на него я и наступил:)
Даже вот так:
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.
-
спорить не буду.. факт что не хватило. Эх завести что ли тему как размотать эту рекурсию в цикл:)
-
> Эх завести что ли тему как размотать эту рекурсию в цикл:
sniknik давал тут скрипт...
-
> Павел Калугин (30.04.2008 09:10:19) [19]
Что бы не орали, должно быть или в ТЗ или в ТД указана максимальная глубина.
-
> Anatoly Podgoretsky © (30.04.08 15:48) [26]
А ещё проверка в коде при попытке добавить уровень, и если он N+1 то посылать такого добавлятеля читать руководство пользователя.
-
> Павел Калугин (30.04.2008 16:06:27) [27]
Хорошое дело и пускать только после письменного подтверждения, что прочитал.
-
> Павел Калугин (30.04.2008 16:06:27) [27]
Да и учесть, что русские любое руководство/лицензию, на любом языке в состоянии прочитать за 0,5 секунды, так что таймер встроить из расчета 1 минута на страницу.
-
Удалено модератором
Примечание: Выражения выбираем, не в пивной
-
Ну на сервере запрещена? а на клиенте?
или такой же гемморой как у мня - клиента нет как факт?
тогда где дерево рисуешь?
про пару вызовов и все
а куда больше? сколько уровней вложенности у дерева? >3? это чтоза холдинг такой? я с трудом 7 насчитал, половину выдумал.
в чем сермяжная правда держать раскрытой более одной ветви дерева? Это действительно так необходимо? экрана хватает? Тем более что данные в отрисованном дереве могут менять другие пользователи? неполучится ли ситуации "на палубу вышел а палубы нет"
-
> Anatoly Podgoretsky © (30.04.08 16:23) [28]
угу. пройти тест- зачет по мануалу. в зависимости от баллов урезать права доступа:)
-
> Павел Калугин (30.04.2008 19:31:32) [32]
Количество минут равно глубине дерева, а при количестве минут 32 и более перезагружать компьютер, с сообщением куда ему идти.
-
1. Нечего советовать ставить сторонние компоненты там, где совершенно спокойно можно обойтись "родными" - в данном случае TTreeView
2. Отображение дерева можно вполне делать без "рекурсии", выбирая входящие в узел только по требованию пользователя банальным запросом, однако при этом не будет выполнено условие "сразу все дерево до листьев".
3. Алгоритм "деревянной" рекурсии прост как дерево ;) Примеров в сети масса.