PDA

Ver la Versión Completa : Ayuda LLenar DBTreeView con un Query


enecumene
31-05-2008, 18:28:52
Saludos compañeros, pues aquí regreso con una novatada, necesito llenar un DBTreeview con una consulta SQL de la siguiente manera:

Departamento
----Empleado 1
----Empleado 2
----Empleado 3
Departamento 2
----Empleado 1
----Empleado 2

Las Tablas departamentos y empleados están relacionadas por un campo ID.

esta es la consulta que estoy haciendo (estoy seguro que esta mal):

select * from DEPARTAMENTO,EMPLEADOS where EMPLEADOS.DPTOID = DEPARTAMENTO.DPTOID

estoy trabajando con Delphi7 y Firebird 2.0

Saludos.

PD: esta la primera vez que trabajo con esos tipos de componentes ya sea TreeView, ListView, etc., etc. :o

enecumene
01-06-2008, 04:23:27
Bueno pude lograr el cometido, pero en vez de usar DBTreeView decidí usar el TreeView, me di cuenta que era muy engorroso, pues aquí va como lo hice:

Var
I,CampoCount:Integer;
Nodo:Packed Array[0..99] of TTreenode;
NodoValor:Packed array[0..99] of Variant;
begin
TreeView1.Items.Clear;
ZDptos.First;
CampoCount:=ZDptos.FieldCount;
While not ZDptos.Eof do
begin
if NodoValor[0]<> ZDptos.Fields[0].Value then
Nodo[0]:=TreeView1.Items.Add(nil,Vartostr(ZDptos.Fields[0].Value));
for I:=1 to ZDptos.FieldCount-1 do
begin
if NodoValor[I]<> ZDptos.Fields[I].Value then
Nodo[I]:=TreeView1.Items.AddChild(Nodo[I-1],Vartostr(ZDptos.Fields[I].Value));
Nodo[I].Data := pointer(ZDptos.FieldByName('ID').AsInteger);
NodoValor[I]:=ZDptos.Fields[I].Value;
end;
NodoValor[0]:=ZDptos.Fields[0].Value;
ZDptos.next;
end;

Pero me deja un feo arbol de la siguiente manera:

+ Departamento 1
-----+ Empleado
---------ID
+ Departamento 2
-----+ Empleado
---------ID
-----+ Empleado
---------ID

¿Cómo puedo ocultar el SubNodo de Empleado (ID)?

Esta es la consulta:

select DEPARTAMENTO.DPTO, EMPLEADOS.NOMBRE, EMPLEADOS.ID from EMPLEADOS, DEPARTAMENTO where EMPLEADOS.DPTOID = DEPARTAMENTO.DPTOID group by DEPARTAMENTO.DPTO, EMPLEADOS.NOMBRE, EMPLEADOS.ID


Saludos.

enecumene
01-06-2008, 16:02:16
Lo último que he estado haciendo es lo sisguiente:

TTreeView(Nodo[I]).Visible := False

¿Resultado?:

---------------------------
Debugger Exception Notification
---------------------------
Project TimerPunchAdmin.exe raised exception class EAbstractError with message 'Abstract Error'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

A ver, quién me echa una mano, ¿Por favor? :o.

Saludos.

enecumene
01-06-2008, 16:29:14
Bueno, creo que lo conseguí, pero no sé es la mejor forma, pero ahí va:

Var
I,CampoCount:Integer;
Nodo:Packed Array[0..99] of TTreenode;
NodoValor:Packed array[0..99] of Variant;
begin
TreeView1.Items.Clear;
ZDptos.First;
CampoCount:=ZDptos.FieldCount;
While not ZDptos.Eof do
begin
if NodoValor[0]<> ZDptos.Fields[0].Value then
Nodo[0]:=TreeView1.Items.Add(nil,Vartostr(ZDptos.Fields[0].Value));
for I:=1 to ZDptos.FieldCount-1 do
begin
if NodoValor[I]<> ZDptos.Fields[I].Value then
Nodo[I]:=TreeView1.Items.AddChild(Nodo[I-1],Vartostr(ZDptos.Fields[I].Value));
Nodo[I].Data := pointer(ZDptos.FieldByName('ID').AsInteger);
//esto fue lo que agregue//
if Nodo[I].Level = 2 then
begin
Nodo[I].Delete;
end;
//esto fue lo que agregue
NodoValor[I]:=ZDptos.Fields[I].Value;
end;
NodoValor[0]:=ZDptos.Fields[0].Value;
ZDptos.next;
end;

lo que hace que borra el tercer nivel del arbol que era ID, de todos modos que alguien me de su comentario, se lo agradecería mucho ;).

Saludos.