Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Построение дерева из базы данных


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 наименование


Наверх

Титульная страница Поиск, карта сайта Написать письмо