Hola Lenocb: yo tuve que hacer un sistema que hacia algo parecido, mostraba los datos de una tabla en un treeview y, modificando la estructura del treeview, modificaba las relaciones padre-hijo en la tabla. Esta hecho para un sistema que gestiona auditorías y permite realizar análisis de arbol de causas.
Te paso a continuación el código para mostrar la tabla en el treeview con comentarios:
Código Delphi
[-]
procedure TFrmAuditoriaArbolCausa.CargarTree(Sender: TObject; SQL: String);
var
I, X, N: Integer;
Nod: TTreeNode;
NodSuplementario: TTreeNode;
MiPunteroInteger: PunteroInteger;
begin
Query1.SQL.Clear;
Query1.SQL.ADD(SQL);
Query1.Active := True;
Query1.First;
for X:=0 to (Query1.RecordCount-1) do
begin
I:=Query1.fieldByName('Padre').asinteger;
if I=0 then
begin Nod:=TreeView1.Items.Add (nil,Query1.FieldByName('Descripcion').asstring);
New(MiPunteroInteger);
MiPunteroInteger^:=Query1.Fieldbyname('Codigo').asinteger;
nod.Data:=MiPunteroInteger;
nod.Selected :=true;
end
else
begin N:=TreeView1.Items.Count -1;
while PunteroInteger(TreeView1.Items[N].Data)^ <>I do
Dec(N);
nodSuplementario:=TreeView1.Items.AddChild(TreeView1.Items[N],Query1.FieldByName('Descripcion').asstring);
New(MiPunteroInteger);
MiPunteroInteger^:= Query1.Fieldbyname('Codigo').asinteger;
nodSuplementario.Data:=MiPunteroInteger;
Nod.selected:=True;
Nod.Expanded:=False;
end;
query1.Next;
end;
end;
Cuando modifico la estructura de los nodos en el treeview, y quiero modificar la estructura padre-hijo de la tabla, ejecuto el siguiente código:
Código Delphi
[-]
procedure TFrmAuditoriaArbolCausa.BtnActualizarBDClick(Sender: TObject);
var
X: Integer;
Nod: TTreeNode;
begin
Query1.SQL.Clear;
Query1.SQL.Add('DELETE FROM Auditorias_Problemas WHERE Codigo_Auditoria =' + IntToStr(CodigoAuditoria) + 'AND Codigo_Probefecto <> 0');
Query1.ExecSQL;
for X:=0 to (treeview1.Items.Count-1) do
begin
Nod:= Treeview1.Items[X];
Nod.Selected:=true;
if Nod.Parent=nil then
begin
end
else
begin
Query1.SQL.Clear;
Query1.SQL.Add('INSERT INTO Auditorias_Problemas (Codigo_Problema, Codigo_ProbEfecto, Codigo_Auditoria) VALUES (:a, :b, :c)');
Query1.ParamByName('a').asinteger:= PunteroInteger(nod.data)^;
if (nod.Parent=nil) then
begin
Query1.ParamByName('b').asinteger:=0;
end
else
begin
Query1.ParamByName('b').asinteger:=PunteroInteger(Nod.Parent.data)^;
end;
Query1.ParamByName('c').asinteger:=CodigoAuditoria;
Query1.ExecSQL;
end;
end;
Basicamente lo que hace este ultimo código es borrar todo el arbol mostrado y volverlo a cargar como figura en el treeview.
Como veras, lo mas importante es armar los datos de la tabla indicando de que nodo se van a desprender al mostrarlos en un treeview.
Saludos, Enrique Gabriel Baquela.
Http://enrique-gabirel-baquela.neurona.com