Форум: "Базы";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизПостроение дерева из базы данных Найти похожие ветки
← →
Mr.F (2005-05-05 10:09) [0]Здарово всем.
Моя проблема заключается в составлении алгоритма построение 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
Конечно чучуть не поместилось но надеюсь на понимания
Зарание спасибо.
← →
stud © (2005-05-05 10:13) [1]достаточно всего двух полей для построения дерева
id ключ
parent ссылка на родителя
fullname наименование
← →
Rule © (2005-05-05 10:14) [2]координально неправильный подход к решению проблеммы (ИМХО) ...
читай тут
http://ibase.ru/devinfo/treedb.htm
http://ibase.ru/devinfo/treedb2.htm
http://sdm.viptop.ru/articles/sqltrees.html
← →
Johnmen © (2005-05-05 10:17) [3]Тебе нужно соединить таблицу саму с собой (LEFT JOIN) столько раз, сколько у тебя сущностных групп.
← →
Mr.F (2005-05-05 10:21) [4]STUD Но уменя именно такая таблица
А насчёт твоего ответа я знаю.
Надо решить именно с этой таблицей
← →
Johnmen © (2005-05-05 10:38) [5]http://delphimaster.net/view/1-1115274265/
← →
Mr.F (2005-05-05 14:19) [6]Rule ==>
Спасибо дока крутая, и подход левый, но мне надо именно с этой таблицой разобратся.
← →
Sergey13 © (2005-05-05 14:30) [7]2[6] Mr.F (05.05.05 14:19)
Почему именно с этой таблицей и что значит построить дерево (просто показать деревом?)?
← →
Mr.F (2005-05-05 14:42) [8]Sergey13 ==>
Да
← →
stud © (2005-05-05 14:46) [9]так приведи его к класической структуре и отобрази стандартным компонентом
← →
Sergey13 © (2005-05-05 14:48) [10]Что да? Просто показать? Тогда наверное можно будет просто отсортировать и последовательно заполнять ТриВьюху реагируя на смену полей. Можно перегнать по тому же принципу в другую таблицу с указанной в [1] структурой и показать готовым ТриВьюером.
← →
Soft © (2005-05-05 23:07) [11]Структура таблицы
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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c