Ir al contenido


Foto

[RESUELTO] Los árboles que no dejan ver el bosque. (TTreeView con datos de una tabla)


  • Por favor identifícate para responder
31 respuestas en este tema

#21 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 11 marzo 2010 - 02:06

¡¡EXCELENTE, KASTAFORMAN!!, de hecho, se aproxima mucho al requerimiento...

Solamente que yo desearía algo así:
(mexico  df  xochimilco  concha)  angel
(mexico  df  xochimilco  concha)  armando
(mexico  df  xochimilco  concha)  gonzalez
(mexico  df  ao  roma)  gerardo
(mexico  df  ao  roma)  martinez
(mexico  df  ao  villas)  pancho
(mexico  df  ao  villas)  lopez
(mexico  chiapas  municipio  pueblo)  rodrigo
(mexico  chiapas  municipio  publito)  escamilla
(españa  madrid  versa  micolonia)  antonio
(españa  barcelona  catalunia  pueblochico)  raafel

Donde lo que se encuentra entre paréntesis no debe aparecer. Estoy en lo dicho, seguiré sus consejos.


No se pero hay algo que no entendí por que no me aparecen repetidos y si me aparecene en el arbol, te dejo la ventana en la que hice la prueba.

Archivos adjuntos


  • 0

#22 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 11 marzo 2010 - 02:11

Hola TiammatMX, habría que ver, aunque fuera un simple printscreen sobre un DBGrid, cómo devuelve los datos dicha consulta.

He simulado sobre una tabla el resultado de una consulta y el árbol lo fabrica correctamente. He tomado como modelo de consulta algo muy parecido al listado que ha puesto antes Kafastoforman, donde las columnas se van diferenciando a medida que nos desplazamos hacia la derecha ...

Saludos
  • 0

#23 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 marzo 2010 - 05:08

Hola TiammatMX, habría que ver, aunque fuera un simple printscreen sobre un DBGrid, cómo devuelve los datos dicha consulta.

He simulado sobre una tabla el resultado de una consulta y el árbol lo fabrica correctamente. He tomado como modelo de consulta algo muy parecido al listado que ha puesto antes Kafastoforman, donde las columnas se van diferenciando a medida que nos desplazamos hacia la derecha ...

Saludos


Mejor que un "pantallazo", los datos para que jueguen un rato, a ver qué tal..., van en Excel, pero no creo que haya problema si los pasan a cualquier motor de base de datos y ejecutan un Query sobre ellos.
  • 0

#24 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 marzo 2010 - 05:11

¿Y si incluyo los datos en el mensaje, creen que será mejor? Zoquete de mí... jejejejeje  :tongue: :tongue:
  • 0

#25 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 11 marzo 2010 - 05:50

¡¡¡ACTUALIZACIÓN DE ÉXITOOOO!!!

Con éste codigo:



delphi
  1. procedure TfrmPrncpl.LlnrArblArs;
  2. var
  3.   tnUno, tnDos, tnTres, tnCuatro : TTreeNode;
  4.   sInsttcn, sDrccnGnrl, sDrccn, sSubDrccn : string;
  5. begin
  6.  
  7.   TreVewArblArs.Items.BeginUpdate;
  8.   TreVewArblArs.Items.Clear;
  9.   tnUno := TreVewArblArs.Items.Add(NIL, 'Gobierno del Distrito Federal');
  10.   dtamdlDts.ADOQryDts.First;
  11. //  tnUno := TreVewArblArs.Items.AddChild(tnUno, dtamdlDts.ADOQryDts.FieldByName('Ca_area').AsString);
  12. (*  TreVewArblArs.Items.AddChild(tnUno,
  13.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_institucion').AsString+' '+
  14.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dirg').AsString+' '+
  15.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dir').AsString+' '+
  16.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_sub').AsString+' '+
  17.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_jud').AsString);*)
  18. (*
  19.   sInsttcn := dtamdlDts.ADOQryDts.FieldByName('ca_institucion').AsString;
  20.   sDrccnGnrl := dtamdlDts.ADOQryDts.FieldByName('ca_dirg').AsString;
  21.   sDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_dir').AsString;
  22.   sSubDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_sub').AsString;
  23. *)
  24.   sInsttcn := dtamdlDts.ADOQryDts.FieldByName('ca_institucion').AsString;
  25.   sDrccnGnrl := '';
  26.   sDrccn := '';
  27.   sSubDrccn := '';
  28.  
  29.   while not dtamdlDts.ADOQryDts.Eof do
  30.   begin
  31.     if sInsttcn = dtamdlDts.ADOQryDts.FieldByName('ca_institucion').AsString then
  32.     begin
  33.       if sDrccnGnrl = dtamdlDts.ADOQryDts.FieldByName('ca_dirg').AsString then
  34.       begin
  35.         if sDrccn = dtamdlDts.ADOQryDts.FieldByName('ca_dir').AsString then
  36.         begin
  37.           if sSubDrccn = dtamdlDts.ADOQryDts.FieldByName('ca_sub').AsString then
  38.           begin
  39. //            TreVewArblArs.Items.AddChild(tnCuatro, dtamdlDts.ADOQryDts.FieldByName('Ca_area').AsString);
  40.             TreVewArblArs.Items.AddChild(tnCuatro,
  41.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_institucion').AsString+' '+
  42.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dirg').AsString+' '+
  43.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dir').AsString+' '+
  44.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_sub').AsString+' '+
  45.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_jud').AsString);
  46.           end
  47.           else
  48.           begin
  49. //            tnCuatro := TreVewArblArs.Items.AddChild(tnTres, dtamdlDts.ADOQryDts.FieldByName('Ca_area').AsString);
  50.             tnCuatro := TreVewArblArs.Items.AddChild(tnTres,
  51.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_institucion').AsString+' '+
  52.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dirg').AsString+' '+
  53.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dir').AsString+' '+
  54.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_sub').AsString+' '+
  55.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_jud').AsString);
  56.             sSubDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_sub').AsString;
  57.           end;
  58.         end
  59.         else
  60.         begin
  61. //          tnTres := TreVewArblArs.Items.AddChild(tnDos, dtamdlDts.ADOQryDts.FieldByName('Ca_area').AsString);
  62.           tnTres := TreVewArblArs.Items.AddChild(tnDos,
  63.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_institucion').AsString+' '+
  64.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dirg').AsString+' '+
  65.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dir').AsString+' '+
  66.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_sub').AsString+' '+
  67.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_jud').AsString);
  68.           sDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_dir').AsString;
  69.           sSubDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_sub').AsString;
  70.         end;
  71.       end
  72.       else
  73.       begin
  74. //        tnDos := TreVewArblArs.Items.AddChild(tnUno, dtamdlDts.ADOQryDts.FieldByName('Ca_area').AsString);
  75.         tnDos := TreVewArblArs.Items.AddChild(tnUno,
  76.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_institucion').AsString+' '+
  77.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dirg').AsString+' '+
  78.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dir').AsString+' '+
  79.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_sub').AsString+' '+
  80.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_jud').AsString);
  81.         sDrccnGnrl := dtamdlDts.ADOQryDts.FieldByName('ca_dirg').AsString;
  82.         sDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_dir').AsString;
  83.         sSubDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_sub').AsString;
  84.       end;
  85.     end
  86.     else
  87.     begin
  88. //      TreVewArblArs.Items.AddChild(tnUno, dtamdlDts.ADOQryDts.FieldByName('Ca_area').AsString);
  89.       TreVewArblArs.Items.AddChild(NIL,
  90.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_institucion').AsString+' '+
  91.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dirg').AsString+' '+
  92.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_dir').AsString+' '+
  93.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_sub').AsString+' '+
  94.                                         dtamdlDts.ADOQryDts.FieldByName('Ca_jud').AsString);
  95.  
  96.       sInsttcn := dtamdlDts.ADOQryDts.FieldByName('ca_institucion').AsString;
  97.       sDrccnGnrl := dtamdlDts.ADOQryDts.FieldByName('ca_dirg').AsString;
  98.       sDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_dir').AsString;
  99.       sSubDrccn := dtamdlDts.ADOQryDts.FieldByName('ca_sub').AsString;
  100.     end;
  101.  
  102.     dtamdlDts.ADOQryDts.Next;
  103.   end;
  104.  
  105.   TreVewArblArs.Items.EndUpdate;
  106.   TreVewArblArs.FullExpand;
  107. end;



CASI se ha logrado llegar al resultado deseado. He de decir que aún existen registros repetidos y mal ordenados (parte baja de la ilustración) pero en descargo he de decir que Kastaforman tuvo una excelente idea...

Gracias, muchachos..., ya casi llegamos. Se han ganado unas cervezas acompañadas de la mejor botana del Distrito Federal..., pero hasta que terminemos...  :p

Archivos adjuntos


  • 0

#26 Alfredo

Alfredo

    Advanced Member

  • Miembros
  • PipPipPip
  • 91 mensajes
  • LocationMéxico

Escrito 11 marzo 2010 - 11:23

Encontre un componente que es facil de usar, checalo creo que te puede servir

http://cid-0c975157c.../DbTreeview.zip
  • 0

#27 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 marzo 2010 - 09:50

Encontre un componente que es facil de usar, checalo creo que te puede servir


Gracias, Alfredo. Lo instalé pero la funcionalidad que contiene no llena los requerimientos.

Buen día, jóvenes..., ¿listos para más?
  • 0

#28 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 12 marzo 2010 - 09:57

Hola de nuevo, TiammatMX:

En el código que te puse, no existía el campo Ca_Area, que es el campo diferenciador final (prescindo del Ca_jud ya que éste parece acompañar a Ca_Area). Este es el árbol que obtengo, con los datos que nos has ofrecido, mira si se parece a lo que quieres conseguir:

Archivos adjuntos


  • 0

#29 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 marzo 2010 - 10:04

Hola de nuevo, TiammatMX:


Buen día, Andrés...

...mira si se parece a lo que quieres conseguir.


De hecho, es casi lo que todos hemos obtenido..., pero te muestro el árbol que más les satisfizo a mis jefes, y que parece que finalmente será el que quede como aplicación.

Archivos adjuntos


  • 0

#30 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 12 marzo 2010 - 10:20

Tus jefes son muy raros ¿no? Mira que gustarles esa rista de números, :-))

Aunque veo que algunos nodos aparecen fuera de lugar, en este árbol das a entender que lo que desean es que en cada nodo aparezcan todos los dígitos involucrados (desde Ca_institu hasta Ca_Jud), algo que me choca realmente.

Saludos
  • 0

#31 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 12 marzo 2010 - 10:43

Tus jefes son muy raros ¿no? Mira que gustarles esa rista de números, :-))


¡¡¡SSSHHHHHH!!!!, no tan alto, que te van a escuchar...

Aunque veo que algunos nodos aparecen fuera de lugar, en este árbol das a entender que lo que desean es que en cada nodo aparezcan todos los dígitos involucrados (desde Ca_institu hasta Ca_Jud), algo que me choca realmente.


Precisamente, ésos datos que están "turisteando" por el árbol son los que están como erróneos. La ristra de numeritos ésos en realidad es la secuencia que en su momento será sustituida por el nombre del área u oficina de que se trate. CASI damos por concluido el hilo, gracias a la ayuda de todos...
  • 0

#32 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 12 marzo 2010 - 02:01

Cambiando de técnica.

Propongo tratar de simplificar el sistema con una rutina no recursiva sencilla. No puedo probar con tablas, así que el ejemplo lo pongo con TStrings. Cada uno tiene el número de cadenas que uno quiera, cada cadena representa un nivel en el árbol según su índice. No precisa que los String estén ordenados, pues el algoritmo busca el lugar donde debe colocar cada dato:



delphi
  1. procedure TForm1.AddNode(Strings: TStringList);
  2. var
  3.   i,n: integer;
  4.   Parent, Node: TTreeNode;
  5. begin
  6.   if TreeView1.Items.Count = 0 then
  7.     TreeView1.Items.AddChild(nil, 'Gobierno del Distrito Federal');
  8.  
  9.   Parent:= TreeView1.Items.Item[0];
  10.  
  11.   i:= 0;
  12.   n:= 0;
  13.   while i < Strings.Count do
  14.   begin;
  15.     while n < Parent.Count do
  16.     begin
  17.       Node:= Parent.Item[n];
  18.       if Node.Text = Strings[i] then
  19.       begin
  20.         Parent:= Node;
  21.         n:= 0;
  22.         inc(i);
  23.         if i = Strings.Count then break;
  24.         continue;
  25.       end;
  26.       inc(n);
  27.     end;
  28.     Parent:= TreeView1.Items.AddChild(Parent, Strings[i]);
  29.     inc(i);
  30.   end;
  31.  
  32.   TreeView1.FullExpand;
  33. end;



Dejo el código fuente completo de una aplicación, creo que se entenderá y es fácil de migrar al uso de Tablas, estén o no ordenadas conforme al resultado final del árbol que deseamos.

Saludos.

Archivos adjuntos


  • 0




IP.Board spam blocked by CleanTalk.