![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дерево БД
Itonix © (2007-02-19 16:03:00)Предположим есть три связаных таблицы *Интербейз):
Parent:
id,Name
Middle
id; id_parent; name;
Child:
id; id_midle; name;
не могу придумать алгоритм отображения этой связи в виде дерева , если учесть вариант того, что пользователь моежт просматривать дерево в двух режимах:
1) когда видно связь Parent->Middle->Child
2) Parent->child
что-то я совсем не соображаю :((((
подскажите плиз.
данніе будут строиться из одного запроса вида
select parent.name, middle.name,child.name from parent,childe,middle
where ... (тут их соединяем)
Itonix (2007-02-19 18:09:00) [1]вот решение проблемы для ЕлТри дерева. три таблицы Компания - ТМ - Продукт (вкус+вес). Выбираеться одним запросом
результ запроса лежит в Квери Sales
var i:Smallint;
tm,comp:string;
trItem2,trItem, ParentItem:TElTreeItem;
begin
comp:='';tm:='';
trBrands.Items.Clear;
i:=0;
ibSales.First;
comp:='';tm:='';
//------------------
while not ibSales.Eof do
begin
if ibSAles.FieldByName('Name_comp').Asstring<>comp then
begin
comp:=ibSAles.FieldByName('Name_comp').Asstring;
ParentItem:=trBrands.Items.AddItem(nil);
ParentItem.Text:=comp;
ParentItem.Tag:=ibSAles.FieldByName('KOD_COMP').AsInteger;
end
else
begin
if tm<>ibSales.FieldByName('NAME_TM').AsString then
begin
trItem:=trBrands.Items.AddChild(ParentItem,ibSAles.FieldByName('NAME_TM').AsStri ng);
trItem.Tag:=ibSAles.FieldByName('KOD_TM').AsInteger;
end;
if ibSAles.FieldByName('Name_tm').Asstring<>tm then
begin
tm:=ibSAles.FieldByName('Name_tm').Asstring;
trItem2:=trBrands.Items.AddChild(trItem,ibSAles.FieldByName('NAME_FLV').AsString );
trITem2.Text:=ibSAles.FieldByName('NAME_FLV').AsString+' [ '+ibSAles.FieldByName('Ves').AsString+' ]';
trItem2.Tag:=ibSAles.FieldByName('KOD_VES').AsInteger;
end
else
begin
trItem2:=trBrands.Items.AddChild(trItem,ibSAles.FieldByName('NAME_FLV').AsString );
trITem2.Text:=ibSAles.FieldByName('NAME_FLV').AsString+' [ '+ibSAles.FieldByName('ves').AsString+' ]';
trItem2.Tag:=ibSAles.FieldByName('KOD_VES').AsInteger;
end;
end;
ibSales.Next;
end;
ibSales.First;
наконецто заработало
Empleado (2007-02-19 17:31:00) [2]1)
> Храни все уровни одного и того же дерева в одной и той же
> таблице
2) либо объединяй три таблицы в одну с форматом id, id_parent, name
3) либо, не вижу проблемы представить дерево из трех таблиц, любым методом: например, как вариант, пробегая по первой таблице - создаешь первый уровень, затем по второй - второй уровень, затем третий; либо же делаешь мастер-детэйл и строишь уровни дерева.
ПС. Что такое ElTree - не знаю, возможно там все сложнее.
Val (2007-02-19 17:26:00) [3]При невозможности перестроить схему бд - напишите 2 соотв. "деревянных"(ну нет в классическом дереве понятия middle - ибо определить его нельзя, узлы соотносятся только как parent-child) обзора и их уж вяжите к компоненту при выборе структуры отображения пользователем.
Сергей М. (2007-02-19 17:17:00) [4]
> два или три уровня дерева строить из одного запроса
Храни все уровни одного и того же дерева в одной и той же таблице, тогда и вопрос сам по себе отпадет.
Твоя "трехтабличная" структурная схема ничем не оправдана, либо у тебя не древовидная, а сетевая структура.
Itonix (2007-02-19 16:26:00) [5]да я б и сам не против. да вот надо именно так сделать. два или три уровня дерева строить из одного запроса
Sergey13 (2007-02-19 16:21:00) [6]Три грида - нагляднее некуда, ИМХО конечно. С ElTree не работал, так что не помогу.
Itonix (2007-02-19 16:17:00) [7]надо так сделать. (задача так требует). что б видно біло двух или трех уровневое дерево
Sergey13 (2007-02-19 16:15:00) [8]> [0] Itonix © (19.02.07 16:03)
Мое ИМХО - при ограниченной вложенности использование дерева - только дополнительные тормоза.
Itonix (2007-02-19 16:04:00) [9]дополнение- я использую компонент ElTree