Показать сообщение отдельно
  #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;
Ответить с цитированием