![]() |
|
|
#1
|
||||
|
||||
|
Доброго времени суток уважаемые форумчани
Подскажите пожалуйста как вывести парадоксавскую таблицу при помощи treeView уже очень долго парюсь над этой задачей и разными способами проповал, но все что то никак не выходит Вот сама таблица пользователь.rar Состоит из полей(ИД, ФАМИЛИЯ, ПРЕДПРИЯТИЕ, ЦЕХ, ОТДЕЛ, Должность) 1 уровень ПРЕДПРИЯТИЕ 2 уровень ЦЕХ 3 уровень ОТДЕЛ 4 уровень ФАМИЛИЯ (Должность) Подскажите пожалуйста как быть ![]() |
|
#2
|
||||
|
||||
|
Если можно то желательно с коментариями
Заранее благодарен. |
|
#3
|
|||
|
|||
|
Ну, для начала, неплохо было бы почитать о том, как проектировать БД. Т.е. твою одну таблицу надо привести к 3й НФ. Т.е. это должно быть 5 таблиц.
А выводить просто - тебе надо написать процку, которая будет находить нужный родительский узел, а потом просто добалять в него потомков. Для внутренней идентификации можно попробовать использовать свойство Data для указания типа узла (предприятие, отдел и т.д.). Если по простому, то где-то так: Код:
function TForm1.FindTypedNode(AType : Integer; ACaption : String) : TTreeNode;
var
I : Integer;
begin
Result := Nil;
For I := 0 To TreeView1.Items.Count-1 Do
If (Integer(TreeView1.Items[i].Data) = AType) And
(ACaption = TreeView1.Items[i].Caption) Then
Begin
Result := TreeView1.Items[i];
Break;
End;
end;
function TForm1.CreateTypedNode(AParent : TTreeNode; AType : Integer; ACaption :String) : TTreeNode;
begin
Result := TreeView1.Items.AddChild(AParent,ACaption);
Result.Data := Pointer(AType);
end;
procedure TForm1.AddNode(APredpr, ACeh, AOtdel, AFIO);
var
APNode : TTreeNode;
ACNode : TTreeNode;
AONode : TTreeNode;
AFNode : TTreeNode;
begin
APNode := FindTypedNode(1,APredpr);
If APNode = Nil Then APNode := CreateTypedNode(Nil,1,APredpr);
ACNode := FindTypedNode(2,ACeh);
If ACNode = Nil Then ACNode := CreateTypedNode(APNode,2,ACeh);
AONode := FindTypedNode(3,AOtdel);
If AONode = Nil Then AONode := CreateTypedNode(ACNode,3,AOtdel);
AFNode := FindTypedNode(4,AFIO);
If AFNode = Nil Then AFNode := CreateTypedNode(AONode,4,AFIO);
end;Код довольно "грязный" и не оптимальный, но идея должна быть понятна. |
|
#4
|
||||
|
||||
|
А можно как нибудь на весь модуль глянуть?
и желательно с комментариями , если конечно же не трудно...Просто я новичек в этом деле и не все еще понимаю И еще вопросик, а без нормализации никак? прост в дальнейшем у каждого сотрудника необходимо будет вывести оборудование закрепленное за ним, а там уйма таблиц ![]() |
|
#5
|
|||
|
|||
|
Да я только этот код то и написал. Даже не в дельфе, так что проверь именя свойств.
Без нормализации можно, но посуди сам. У тебя, например, 100 сотрудников. Так вот, у тебя будет повторено 100 раз название предприятия... А то, что будет еще 4 таблички - так это фигня, на самом деле. Вообще, уходи ты с этого парадокса... на FireBird, например. Но пример написан под существующую таблицу. Это просто отдельная фкнуция, так что ее просто надо вызвать в нужном месте. Из обязательности, только то, что дерево называется TreeView1, и то, можно переделать на параметр... |
|
#7
|
||||
|
||||
|
Вообщем я реализовал следующим образом
Код:
procedure TForm1.FormCreate(Sender: TObject);
var i1,i2,i3,i4,i5:integer;
j1,j2,j3,j4:integer;
k2,k3,k4,k5:integer;
rc1,rc2,rc3,rc4:integer;
s:string;
begin //построение дерева
TreeView1.Items.BeginUpdate;//запрет обновления
TreeView1.Items.Clear; //очистка списка
k2:=0;k3:=0;k4:=0;k5:=0;
Query1.Active:=true; //подключение баз
Query1.First;
//--------------Первый уровень-------------
Query1.Filtered:=true;
rc1:=Query1.RecordCount;
for i1:=1 to rc1 do
begin // ++i1
s:=Query1PREDPRIATIE.AsString;
TreeView1.Items.Add(nil,s);
j1:=i1+k2+k3+k4+k5;
//--------------Второй уровень-------------
rc2:=Query2.RecordCount;
if rc2>0 then
begin // ++rc2
Query2.First;
for i2:=1 to rc2 do
begin // ++i2
s:=Query2CEX.AsString;
TreeView1.Items.AddChild(TreeView1.Items.Item[j1-1],s);
k2:=k2+1;
j2:=i1+k2+k3+k4+k5;Query2.Next;
end;
//--------------Третий уровень-------------
rc3:=Query3.RecordCount;
if rc3>0 then
begin // ++rc3
Query3.First;
for i3:=1 to rc3 do
begin // ++i3
s:=Query3OTDEL.AsString;
// if QuStrName.AsString<>'' then s:=s+' ('+QuStrName.AsString+')';
TreeView1.Items.AddChild(TreeView1.Items.Item[j2-1],s);
k3:=k3+1;
j3:=i1+k2+k3+k4+k5;Query3.Next;
End;
//--------------Четвертый уровень-------------
rc4:=Query4.RecordCount;
if rc4>0 then
begin // ++rc4
Query4.First;
for i4:=1 to rc4 do
begin // ++i4
s:=Query4FAMILIA.AsString;
TreeView1.Items.AddChild(TreeView1.Items.Item[j3-1],s);
k4:=k4+1;
j4:=i1+k2+k3+k4+k5;Query4.Next;
// Query1.Next; Query2.Next;Query3.Next;
end;
end;
end;
End;
end;
TreeView1.Items.EndUpdate;//разрешение обновленияподскажите где ошибся ![]() |
|
#8
|
||||
|
||||
|
Никто не знает?
![]() |
|
#9
|
|||
|
|||
|
Честно говоря, за такой код руки надо отрывать. И никто не хочет в нем разбираться. Я же тебе дал процедуры создания узлов дерева. Там просто проходишь по всем записям и вызываешь эту процку с соотв. параметрами. Она тебе дерево и построит.
|
|
#10
|
||||
|
||||
|
Цитата:
Вообщем реализовал следующим образом: Код:
TreeView1.Items.Clear;
Query1.First;
ndApt:=TreeView1.Items.Add(nil,Query1PREDPRIATIE.Value);
Query2.First;
for i:=1 to Query2.RecordCount do begin
nd1:=TreeView1.Items.AddChild(ndApt, Trim(Query2CEX.Value));
Query3.First;
for j:=1 to Query3.RecordCount do begin
nd2:=TreeView1.Items.AddChild(nd1, Trim(Query3OTDEL.Value));
Query4.First;
for k:=1 to Query3.RecordCount do begin
nd3:=TreeView1.Items.AddChild(nd2, Trim(Query4FAMILIA.Value));
Query4.Next;
end;
Query3.Next;
end;
Query2.Next;
end;
Query1.Next;А Этот код тоже считается "ГРЯЗНЫМ"? ![]() |