Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.07.2013, 16:08
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию treeView в базу и обратно

Приветствую.
Суть: юзер заходит в прогу, создает или меняет дерево (иерархия сотрудников), сохраняет в базу (mysql), в следующий раз загружает это дерево и опять меняет - создает...
Как дерево сделать в базе??
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
  #2  
Старый 29.07.2013, 16:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вам структуру БД для формирования дерева? Обычно так: ID, ParentID, Context
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
  #3  
Старый 29.07.2013, 16:33
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

а алгоритм разворачивания из БД?
у меня у дедки может и пра-пра-правнучка(и) быть)

зачем context?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
  #4  
Старый 29.07.2013, 17:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
зачем context?
А содержимого у вас не будет? Только индексы узлов? Сами пишете, иерархия сотрудников, значит Context - Сотрудник
Цитата:
а алгоритм разворачивания из БД?

Допустим есть такая иерархия:
Точка - Линия - Многоугольник - Прямоугольник - Квадрат
Точка - Линия - Многоугольник - Трапеция - Ромб
В базу запишется:
ID, ParentID, Context
1, -1, Точка
2, 1, Линия
3, 2, Многоугольник
4, 3, Прямоугольник
5, 4, Квадрат
6, 3, Трапеция
7, 6, Ромб

Иерархию можно продолжать до бесконечности.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 29.07.2013 в 17:07.
  #5  
Старый 29.07.2013, 20:30
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

и вместо обычного treeView использовать DBVirtualTreeView (или подобные)
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
  #6  
Старый 30.07.2013, 17:09
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

получается, дерево строится, но только если имена в базе упорядочены, начиная с корня, сверху-вниз, вот так

имя | начальник

зам.директор1 | директор
зам.директор2 | директор
зам.директор3 | директор
ст.менеджер | зам.директор1
ст.монтажник | зам.директор2
прораб | зам.директор3
менеджер | ст.менеджер

код:
Код:
TreeView1.Items.Clear;
  TreeView1.Items.AddChild(nil, 'root');
  dm.ADOQuery1.SQL.Text:='select surname, boss from stryktyra';
  dm.ADOQuery1.Open;
  dm.ADOQuery1.First;
  while not dm.ADOQuery1.Eof do
  begin
      for i:=0 to TreeView1.Items.Count-1 do
      begin
        if TreeView1.items[i].Text = dm.ADOQuery1.FieldByName('boss').AsString then
        TreeView1.Items.AddChild(TreeView1.items[i], dm.ADOQuery1.FieldByName('surname').AsString);
      end;
      dm.ADOQuery1.Next;
  end;

а если структура не упорядочена, например

имя | начальник

зам.директор1 | директор
прораб | зам.директор3
зам.директор2 | директор
менеджер | ст.менеджер
зам.директор3 | директор
ст.менеджер | зам.директор1
ст.монтажник | зам.директор2

то это получается нужно делать несколько прогонов с условием, что имени нет в дереве. то есть все это пихать еще в FOR от 1 до количества записей в БД... примерно прикинул - доолго!!
мой метод в лоб и нубский, какие еще алгоритмы существуют?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
  #7  
Старый 30.07.2013, 17:13
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну а что мешает сделать запрос с сортировкой?
Код:
select surname, boss from stryktyra order by boss
Но вы зря отказались от кода родителя а работаете с текстом. Если у вас более одного подразделения с одинаковыми должностями - фигня выйдет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 30.07.2013 в 17:22.
  #8  
Старый 30.07.2013, 17:20
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ну а что мешает сделать запрос с сортировкой?
Код:
select surname, boss from stryktyra order by boss
в моем случае это ничего не даст
причем тут сортировка по алфавиту??
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
  #9  
Старый 30.07.2013, 18:49
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

в структуру имя | начальник добавляется поле priority которое содержит порядок вывода записи (такая себе искуственная сортировка)
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение:
Mrak (31.07.2013)
  #10  
Старый 30.07.2013, 19:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Mrak
в моем случае это ничего не даст
причем тут сортировка по алфавиту??
Ну поскольку вы отказались от кода родителя, то ничего более подходящего, чем сортировка по названию родителя, я не вижу.

Вот вам еще раз показываю с вашими уже данными:

КодДолжности, КодНачальника, Должность
1, -1, Директор
2, 1, Зам. директора1
3, 1, Зам. директора2
4, 1, Зам. директора3
5, 4, Прораб
6, 2, ст.менеджер
7, 6, менеджер
8, 3, ст.монтажник
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 30.07.2013 в 19:45.
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Mrak (31.07.2013)
  #11  
Старый 31.07.2013, 16:16
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

У treeview собственная индексация возникает, в результате дерево строится неправильно, вот


код
Код:
TreeView1.Items.Clear;
  TreeView1.Items.AddChild(nil, 'root');
  dm.ADOQuery1.SQL.Text:='select id, surname, boss from asyp.stryktyra';
  try
    dm.ADOQuery1.Open;
  except
  end;
  dm.ADOQuery1.First;
  while not dm.ADOQuery1.Eof do
  begin
    TreeView1.Items.AddChild(TreeView1.items[dm.ADOQuery1.FieldByName('boss').AsInteger], dm.ADOQuery1.FieldByName('surname').AsString);
    dm.ADOQuery1.Next;
  end;

или я что-то не так понял?
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
  #12  
Старый 31.07.2013, 16:42
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

ну говорил же тебе взять DBVirtualTreeView и не париться
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
  #13  
Старый 31.07.2013, 16:58
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Ой-вей, как сложно. Делается таблица с колонкой parent_node (key) и все. Корень не имеет предка. Разворачивать из бд можно иерархическим запросом (connect by ... prior) и все. Набить дерево породительским ключам - как два пальца об асфальт.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
  #14  
Старый 31.07.2013, 17:19
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от Yurk@
ну говорил же тебе взять DBVirtualTreeView и не париться
хехе, а где у него editor хотя бы?
как базу выгрузить?
какой-то спартанский компонент...
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
  #15  
Старый 31.07.2013, 17:34
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А мой вариант не подходит?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter