![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
![]()
Доброго времени суток, такая проблема нужно сделать иерархическую структуру(дерево). В базе есть поле содержащее указатели нахождения объектов в дереве, выглядит примерно так 1.3.5.3 для каждого объекта. Как организовать дерево на сервере в хранимой процедуре, ну или на клиенте(точно не знаю, как лучше будет). пользуясь вот этими указателями 1.3.5.3. (FireBird 2.1, Delphi 7 используемые компоненты IBX) Буду благодарен любой помощи...
Последний раз редактировалось Cerber24; 11.03.2009 в 13:38. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 29.06.2008
Сообщений: 603
|
![]()
Я бы делал примерно так:
Список полей: ID ID_Parent ID_Parent_ID .... где ID_Parent - ссылка на ID, а ID_Parent_ID - номер в ветке только надо будет триггер на вставку прописать, чтобы инкрементил значение ID_Parent_ID, в принципе не сложно, и при правильных индексах работать быстро будет. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
Ну вообще для БД классическим вариантом является наличие в таблице полей ID_, PARENT_ID_ . Именно под такое заточено и большинство визуальных контролов для отображения таких структур. А уж 1.3.5.3 можно собирать хранимой процедурой при необходимости. Из удобных контролов могу посоветовать dbGridEh+MemTableEh (EhLib) или VirtualTreeView (точнее, его порт для BD. Там, правда, ориентировано на FIBPlus и есть некоторые конфликты из-за разности версий, но могу переслать уже поправленные исходники).
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
![]()
Дело в том, что структуру базы по возможности лучше не менять, а так как у меня в базе с такими указателями реально сделать? если можно наброски процедуры напишите, пытаюсь воспользоваться вот этим IBXExTrees5.0 компонентом. если что мыло вот Cerber24@km.ru.
Кнопку "Правка" видите? Она как раз для редактирования своих сообщений. А плодить подряд - наказуемо... Последний раз редактировалось mihali4; 11.03.2009 в 14:32. |
![]() |
![]() |
![]() |
#5 | ||
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
Cerber24, у меня реализовано вот так:
Цитата:
Цитата:
Последний раз редактировалось Антон Ю.Б.; 11.03.2009 в 14:46. |
||
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
![]()
Может я чего-то недопонял, если что извините. Здесь реализовано обычное дерево, как мне подступится вот с этим полем к нему?(1.3.5.3 типо у первого родителя третий потомок, далее идём по нему, у него есть 5 ребёнок идём по нему, и уже у этого потомка есть 3 потомок-требуемый объект)
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
В моей терминологии (обозначениях) у Вас есть сейчас поле PATH_ со значениями типа '1.3.1.7'. Наверное у Вас есть и поле ID_ . Заводите еще два целочисленных поля ORDER_ и PARENT_ID_. Создайте хранимую процедуру (конец моего прошлого ответа), которая поможет Вам с помощью запросов типа
update TRAIN_TREE TT set ORDER_=(select RES_ORFER_ from GET_NODE_INFO(TT.ID_)) заполнить эти два новых поля. После этого можете спокойно цеплять эту таблицу (или запросы из нее) к контролам, которые основаны на традиционном представлении дерева через поля (ID_,PARENT_ID_). P.S. Обратите внимание, что моя процедура составлена в предположении формата номеров, заканчивающихся точкой, а не цифрой, то есть обход строки и выделение подстрок надо немного поправить. |
![]() |
![]() |
![]() |
#8 | |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
![]() Цитата:
Последний раз редактировалось Cerber24; 12.03.2009 в 13:22. |
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
![]()
Cerber24, Вы даже название этого поля не привели
![]() Ну хорошо, есть у Вас таблица, что Вам непонятно-то из советов? Контролы традиционно работают со схемой (сами выстраивают и отображают дерево), когда в таблице есть два поля для представления дерева - код записи (ID_ в прежних обозначениях) и код родительской записи (PARENT_ID_), если надо представлять структурный номер, то нужно еще поле порядкового номера в своей группе (ORDER_) и поле под структурный номер (PATH_). Без последнего поля можно обойтись и составлять его хранимой процедурой (разумеется, если таблица с данными не очень велика по объему). У Вас сейчас есть, видимо, только поле с кодом записи (C_OBJECT) и поле со структурным номером (OBJINDEX). Создайте поле под код родительской записи и поле под порядок узла в своей группе. Создайте хранимую процедуру для заполнения новых полей, заполните эти поля и спокойно цепляйте таблицу к контролу указав ему поля ID_, PARENT_ID_ и отображаемые информационные поля. Мне либо неясна Ваша проблема, либо неясно как еще более подробно и ясно изложить ее решение ![]() Примечание: в хранимой процедуре я забыл обработать ситуацию с корневым узлом, ему в качестве PARENT_ID_ в зависимости от соглашений может указываться 0,-1 или null (иногда это явно прописывается в свойствах контрола). |
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
![]()
Спасибо всем, кто откликнулся, помогите плиз с такой проблемкой, как узнать ID элемента (в моем примере C_OBJECT) выбранного мышкой в TreeFiew???
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Firebird vs Delphi HELP! | paSHIZ | БД в Delphi | 4 | 13.01.2009 12:19 |
FireBird | Д'якон | БД в Delphi | 2 | 04.12.2008 11:15 |
FireBird 1.5.4 | Nikola__ | БД в Delphi | 2 | 17.11.2008 14:42 |
TSQLConnection и FireBird | Abercrombie | БД в Delphi | 5 | 12.02.2008 14:11 |
округление в Firebird | shurik_7866 | БД в Delphi | 0 | 05.07.2007 11:10 |