|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.03.2009, 13:26 | #1 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
Дерево в FireBird
Доброго времени суток, такая проблема нужно сделать иерархическую структуру(дерево). В базе есть поле содержащее указатели нахождения объектов в дереве, выглядит примерно так 1.3.5.3 для каждого объекта. Как организовать дерево на сервере в хранимой процедуре, ну или на клиенте(точно не знаю, как лучше будет). пользуясь вот этими указателями 1.3.5.3. (FireBird 2.1, Delphi 7 используемые компоненты IBX) Буду благодарен любой помощи...
Последний раз редактировалось Cerber24; 11.03.2009 в 13:38. |
11.03.2009, 13:56 | #2 |
Форумчанин
Регистрация: 29.06.2008
Сообщений: 603
|
Я бы делал примерно так:
Список полей: ID ID_Parent ID_Parent_ID .... где ID_Parent - ссылка на ID, а ID_Parent_ID - номер в ветке только надо будет триггер на вставку прописать, чтобы инкрементил значение ID_Parent_ID, в принципе не сложно, и при правильных индексах работать быстро будет. |
11.03.2009, 13:57 | #3 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Ну вообще для БД классическим вариантом является наличие в таблице полей ID_, PARENT_ID_ . Именно под такое заточено и большинство визуальных контролов для отображения таких структур. А уж 1.3.5.3 можно собирать хранимой процедурой при необходимости. Из удобных контролов могу посоветовать dbGridEh+MemTableEh (EhLib) или VirtualTreeView (точнее, его порт для BD. Там, правда, ориентировано на FIBPlus и есть некоторые конфликты из-за разности версий, но могу переслать уже поправленные исходники).
|
11.03.2009, 14:17 | #4 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
Дело в том, что структуру базы по возможности лучше не менять, а так как у меня в базе с такими указателями реально сделать? если можно наброски процедуры напишите, пытаюсь воспользоваться вот этим IBXExTrees5.0 компонентом. если что мыло вот Cerber24@km.ru.
Кнопку "Правка" видите? Она как раз для редактирования своих сообщений. А плодить подряд - наказуемо... Последний раз редактировалось mihali4; 11.03.2009 в 14:32. |
11.03.2009, 14:21 | #5 | ||
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Cerber24, у меня реализовано вот так:
Цитата:
Цитата:
Последний раз редактировалось Антон Ю.Б.; 11.03.2009 в 14:46. |
||
11.03.2009, 15:37 | #6 |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
Может я чего-то недопонял, если что извините. Здесь реализовано обычное дерево, как мне подступится вот с этим полем к нему?(1.3.5.3 типо у первого родителя третий потомок, далее идём по нему, у него есть 5 ребёнок идём по нему, и уже у этого потомка есть 3 потомок-требуемый объект)
|
11.03.2009, 17:46 | #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. Обратите внимание, что моя процедура составлена в предположении формата номеров, заканчивающихся точкой, а не цифрой, то есть обход строки и выделение подстрок надо немного поправить. |
12.03.2009, 12:06 | #8 | |
Пользователь
Регистрация: 07.05.2008
Сообщений: 38
|
Цитата:
Последний раз редактировалось Cerber24; 12.03.2009 в 13:22. |
|
12.03.2009, 13:33 | #9 |
Форумчанин
Регистрация: 03.01.2009
Сообщений: 116
|
Cerber24, Вы даже название этого поля не привели OBJINDEX, видимо? Заметьте, что Вы даже проблему толком не обозначили. Только по косвенным признакам (упоминание IBXExTrees5.0) можно сделать вывод, что Вам нужно наглядное представление этой иерархической структуры в каком-то контроле клиента.
Ну хорошо, есть у Вас таблица, что Вам непонятно-то из советов? Контролы традиционно работают со схемой (сами выстраивают и отображают дерево), когда в таблице есть два поля для представления дерева - код записи (ID_ в прежних обозначениях) и код родительской записи (PARENT_ID_), если надо представлять структурный номер, то нужно еще поле порядкового номера в своей группе (ORDER_) и поле под структурный номер (PATH_). Без последнего поля можно обойтись и составлять его хранимой процедурой (разумеется, если таблица с данными не очень велика по объему). У Вас сейчас есть, видимо, только поле с кодом записи (C_OBJECT) и поле со структурным номером (OBJINDEX). Создайте поле под код родительской записи и поле под порядок узла в своей группе. Создайте хранимую процедуру для заполнения новых полей, заполните эти поля и спокойно цепляйте таблицу к контролу указав ему поля ID_, PARENT_ID_ и отображаемые информационные поля. Мне либо неясна Ваша проблема, либо неясно как еще более подробно и ясно изложить ее решение Примечание: в хранимой процедуре я забыл обработать ситуацию с корневым узлом, ему в качестве PARENT_ID_ в зависимости от соглашений может указываться 0,-1 или null (иногда это явно прописывается в свойствах контрола). |
06.04.2009, 20:55 | #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 |