![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Построение дерева из базы данных
Mr.F © (2005-05-05 10:09:00)Здарово всем.
Моя проблема заключается в составлении алгоритма построение 7 уровнего дерева из таблицы в базе данных в компоненте TABLE, кот. Описана ниже:
Я разработал алгоритм но в нем глюки прошу помощи
Структура таблицы.
ID Счётчик
Department Строка
GroupGoods Строка
SubGrouop1 Строка
SubGrouop2 Строка
SubGrouop3 Строка
SubGrouop4 Строка
FullName Строка Имя товара который относится к группам.
Как будет видеть пользователь .
Department GroupGoods SubGrouop1 SubGrouop2 bGrouop3SubGrouop4 FullName
Продажа Автоиобили Б/У
Nexia
Продажа Автоиобили Б/У BMV
BMV 535
Покупки Автоиобили Б/У
Nexia 2
Покупки Канцтовары Карандаши
HB 2
Прчём как видно из данных в таблице могут быть и пустые значения в группах, их не надо выводить в дерево.
Вид дерева на основании выше указанных данных в раскрытом виде
Если в переди стоит значок * , то он является элементом а не группой
Продажа
Автомоболи
Б/У
BMV
*BMV 535
*Nexia
Покупки
Автомоболи
Б/У
*Nexia 2
Канцтовары
Карандаши
*HB 2
Конечно чучуть не поместилось но надеюсь на понимания
Зарание спасибо.
Soft (2005-05-05 23:07:00) [1]Структура таблицы
CREATE TABLE FOLDERS (
ID INTEGER NOT NULL,
FOLDERNAME VARCHAR(255),
FOLDERDEPENDENCE INTEGER DEFAULT null,
FOLDERFIXING INTEGER DEFAULT 0
);
Код построения дерева(тормозит, но работает).
Procedure LoadFoldersToList(var LoadFolderQuery:TSDQuery;var LoadFolderTree:TTreeView);
var Node: TTreeNode;
var index:integer;
begin
LoadFolderTree.Items.Clear;
LoadFolderQuery.Active:=False;
LoadFolderQuery.SQL.Clear;
LoadFolderQuery.SQL.Add('select * from folders order by folderdependence,id;');
LoadFolderQuery.Active:=True;
//создаем основной корень
if (LoadFolderQuery.Locate('folderfixing',3,[loCaseInsensitive])) then
begin
Node:=LoadFolderTree.Items.Insert(nil,LoadFolderQuery.FieldByName('foldername').AsString);
Node.ImageIndex:=LoadFolderQuery.FieldByName('folderfixing').AsInteger;
Node.StateIndex:=LoadFolderQuery.FieldByName('id').AsInteger;
Node.SelectedIndex:=LoadFolderQuery.FieldByName('folderfixing').AsInteger;
end;
LoadFolderQuery.Delete;
if (LoadFolderTree.Items.Count>0) then
begin
LoadFolderQuery.First;
while not LoadFolderQuery.Eof do
begin
index:=0;
while ((index<LoadFolderTree.Items.Count) and (LoadFolderQuery.FieldByName('folderdependence').AsInteger<>LoadFolderTree.Items[index].StateIndex)) do inc(index);
Node:=LoadFolderTree.Items.AddChild(LoadFolderTree.Items[index],LoadFolderQuery.FieldByName('foldername').AsString);
Node.ImageIndex:=LoadFolderQuery.FieldByName('folderfixing').AsInteger;
Node.StateIndex:=LoadFolderQuery.FieldByName('id').AsInteger;
Node.SelectedIndex:=LoadFolderQuery.FieldByName('folderfixing').AsInteger;
LoadFolderQuery.Delete;
end;
end;
LoadFolderQuery.Active:=False;
end;
Sergey13 (2005-05-05 14:48:00) [2]Что да? Просто показать? Тогда наверное можно будет просто отсортировать и последовательно заполнять ТриВьюху реагируя на смену полей. Можно перегнать по тому же принципу в другую таблицу с указанной в [1] структурой и показать готовым ТриВьюером.
stud (2005-05-05 14:46:00) [3]так приведи его к класической структуре и отобрази стандартным компонентом
Mr.F (2005-05-05 14:42:00) [4]Sergey13 ==>
Да
Sergey13 (2005-05-05 14:30:00) [5]2[6] Mr.F (05.05.05 14:19)
Почему именно с этой таблицей и что значит построить дерево (просто показать деревом?)?
Mr.F (2005-05-05 14:19:00) [6]Rule ==>
Спасибо дока крутая, и подход левый, но мне надо именно с этой таблицой разобратся.
Johnmen (2005-05-05 10:38:00) [7]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1115274265&n=0
Mr.F (2005-05-05 10:21:00) [8]STUD Но уменя именно такая таблица
А насчёт твоего ответа я знаю.
Надо решить именно с этой таблицей
Johnmen (2005-05-05 10:17:00) [9]Тебе нужно соединить таблицу саму с собой (LEFT JOIN) столько раз, сколько у тебя сущностных групп.
Rule (2005-05-05 10:14:00) [10]координально неправильный подход к решению проблеммы (ИМХО) ...
читай тут
http://ibase.ru/devinfo/treedb.htm
http://ibase.ru/devinfo/treedb2.htm
http://sdm.viptop.ru/articles/sqltrees.html
stud (2005-05-05 10:13:00) [11]достаточно всего двух полей для построения дерева
id ключ
parent ссылка на родителя
fullname наименование