Помогите с решением.
стоит такая задача:
необходимо из БД формировать дерево в виде 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;