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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.06.2009, 22:57
papis papis вне форума
Прохожий
 
Регистрация: 11.04.2009
Сообщения: 10
Репутация: 10
По умолчанию БД-> TreeView -> БД -> DBGrid

Помогите с решением.

стоит такая задача:

необходимо из БД формировать дерево в виде TreeView и потом по нажатию на определенную ветку дерева отображать данные из БД, относящиеся к этой ветке.

Собственно проблема заключается вот в чем:

например вид дерева таков:
Предприятие
Отдел разработки
Группа проектирования платформы
Отдел тестирования

в БД это вглядит так:

id up nazvanie
0 0 Предприятие
1 0 Отдел разработки
2 0 Отдел тестирования
3 1 Группа проектирования платформы

данные же, которые выбираются из БД дальше, ссылаються на ID выбранной ветки дерева вот таким кодом по событию OnChange:


Код:
procedure Tkd_form.kd_tv_structChange(Sender: TObject; Node: TTreeNode);
begin
kd_form.kd_sql_struct_pers.Active := FALSE;
kd_form.kd_sql_struct_pers.Parameters.ParamByName('i_department').Value := node.AbsoluteIndex;
kd_form.kd_sql_struct_pers.Active := TRUE;
end;

в query прописан запрос:

Код:
select id, full_fio, department
from employers
where department = :i_department;


проблема же в том, что при нажатии на ветвь кода "Группа проектирования платформы" выводяться данные для отдела тестирования, т.к. для группы AbsolutIndex=2, а для отдела уже равен 3.

Подскажите, пожалуйста, как поправить такую ситуацию

Ниже процедура заполнения TreeView:
Код:
procedure FillTree(Tree: TTreeView; Query: TDataSet; idNode, idParent,
  cNodeName: string);
var
  i: integer;
begin
  // Корневой узелдолжен быть первым в выборке Query
  Query.First;
  Tree.Items.Clear;
  Tree.Items.AddObject(nil, Query.FieldByName(cNodeName).AsString,
    Pointer(Query.FieldByName(idNode).asInteger));
  Query.Next;
  while not Query.Eof do
  begin
    i := 0;
    while i < Tree.Items.Count do
      if Tree.Items.Item[i].Data = Pointer(Query.FieldByName(idParent).asInteger)
        then
      begin
        Tree.Items.AddChildObject(Tree.Items.Item[i],
          Query.FieldByName(cNodeName).AsString,
          Pointer(Query.FieldByName(idNode).asInteger));
        break;
      end
      else
        Inc(i);
    Query.Next;
  end;
end;
Ответить с цитированием
  #2  
Старый 04.06.2009, 18:37
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Если я верно понял, ты заполняешь Tree вручную ... но почему бы не взять для этой цели спец компонент. напр?
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #3  
Старый 11.06.2009, 20:51
papis papis вне форума
Прохожий
 
Регистрация: 11.04.2009
Сообщения: 10
Репутация: 10
По умолчанию

а подскажите, пожалуйста, кака установиь эти компоненты в Delphi7, а то я никогда вообще не устанавливал доп компоненты
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter