Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 856

/ вопрос открыт /

Здравствуйте! Помогите пожалуйста с такой задачкой:
Есть база данных подразделений, где PODR_ID-идентификатор, PARENT_ID-идент. родительского подразделения, PODR_NAME-название подразделения и TreeView в котором отображаются данные таблицы:
Главный узел
|
|---------Узел1
| |------------Цех1
| |------Подразд1
|---------Узел2
|------------Цех1
|------Подразд1
Помогите пожалуйста связать имена ветвей дерева с базой данных, при каком запросе это можно сделать, если можете пришлите пожалуйста исходник. У меня при запросах например Найти Подразд1 прога ищет первый в списке а не тот что нужен. А ведь в разных цехах может быть подразд. с одинаковыми названиями. Пишу код выгрузки в дерево:

Заранее спасибо.

Приложение:
  1. procedure TDM.LoadTreeView;
  2. type
  3. PItemData=^TItemData;
  4. TItemData=record
  5. index: Integer;
  6. end;
  7. var
  8. TNNew: TTreeNode;
  9. idNewItem: PItemData;
  10. i: Integer;
  11. begin
  12. MainForm.TreeView1.Items.Clear;
  13. with DM.PodrQuery do
  14. begin
  15. Active:=False;
  16. SQL.Clear;
  17. SQL.Add('SELECT * FROM PODR');
  18. SQL.Add('ORDER BY PODR_ID, PODR_NAME');
  19. Active:=True;
  20. if DM.PodrTable.IsEmpty then
  21. begin
  22.  
  23. Exit;
  24. end
  25. else
  26. First;
  27. end;
  28. while DM.PodrQuery.Eof<>True do
  29. begin
  30. TNNew:=Nil;
  31. if DM.PodrQuery.Fields[1].AsInteger>0 then
  32. for i:=0 to MainForm.TreeView1.Items.Count-1 do
  33. if PItemData(MainForm.TreeView1.Items[i].Data).index=
  34. DM.PodrQuery.Fields[1].AsInteger then
  35. TNNew:=MainForm.TreeView1.Items[i];
  36. with MainForm.TreeView1.Items.AddChild(TNNew, DM.PodrQuery.Fields[0].AsString) do
  37. begin
  38. ImageIndex:=1;
  39. SelectedIndex:=0;
  40. idNewItem:=new(PItemData);
  41. Data:=idNewItem;
  42. idNewItem.index:=DM.PodrQuery.Fields[0].AsInteger;
  43. end;
  44. DM.PodrQuery.Next;
  45. end;
  46. MainForm.TreeView1.Items[0].Selected:=True;
  47. end;
  48.  


Димон Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Димон (статус: Посетитель)
Вопрос отправлен: 27 августа 2008, 21:43
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Димон!
Таким хитрым образом как Вы добавляете, Вы будете это делать долго. А как только понадобиться функциональность типа "переименовать" - утоните в строках кода. Всё делается на порядок проще.
Писать готовый код не буду (так как в таком случае програмист стаёт ленивым и не может даже одну строку заменить). Но набросок схематический кода сделаю.
Итак, первое, что надо сделать, это отказаться от использования имён нод в качестве опорной точки. В структуру TItemData надо добавить поле которое будет ассоциироваться с id строки для этого поля в базе. (возможно Ваш index это и есть).
Второе - это добавлять методом рекурсии. в таком случае код заметно упрощается.
Допустим, что у нашей таблички такие поля id - ключевое, text - имя, выводимое пользователю, parentid - id родительского элемента. Для элементов верхнего уровня он равен 0.
Ну где то так.

Procedure AddNodesLevel(parentNode:TTreeNode; ParentId:integer);
var node:TTreeNode;
  rs :_RecordSet;
begin
  ADOCommand.Command :='select id, text from mytable where parentid = ' + inttostr(Parentid);
  rs := ADOCommand.Execute;
  while not rs.eof do begin
    Node := TreeView.addChild(parentNode);
    Node.text := rs.Fieldbyname[1];
   AddNodesLevel(Node, rs.Fieldbyname[0]);
  end;
rs.close;
end;
Я писал применимо к АДО. Вариант с БДЕ я просто не рассматриваю - это тихий ужас. В этом случае прийдётся создавать в процедуре компонент TQuery, так как процедура запускает себя рекурсивно.

Код написан схематически и напильником доводиться до той кондиции, до которой нужно. Как видно, я вообще опустил создание записей - они просто не нужны. Но можете добавить (и даже нужно, если хочеться делать поиск и подобное).
Если уточните компоненты/базу - уточню детали кода:)
И на последнее. строка вида
 for i:=0 to MainForm.TreeView1.Items.Count-1 do
Это самое худшее, что можно написать. при кол-ве итемов порядка сотни, загрузка будет происходит минут 10.

Это всё было лично испытано на себе:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 августа 2008, 02:32
Оценка за ответ: 5


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 августа 2017, 07:52
Выполнено за 0.04 сек.
Рейтинг@Mail.ru