Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcion Recursiva (https://www.clubdelphi.com/foros/showthread.php?t=14099)

Aztaroth 09-09-2004 17:07:02

Funcion Recursiva
 
Tengo esta funcion recursiva, en la cual intento llenar un arbol con los numeros de parte y sus componentes (hijos), pero no entra a la recursividad como deberia, alguien puede echarme una manita para solucionar este problem

Ah y otra cosa como demonios se indentan los mensajes en este foro, por que al momento de escribirlo le doy los espacios y lo indento pero cuando lo envio me lo pega todo a la izquierda.

Gracias.

Código Delphi [-]
procedure TForm1.getComponents(padre: String; nodo: TTreeNode; cantidad : integer);
var
  mNodo : TTreeNode;
  boomTable : TQuery;
begin
       boomTable := TQuery.Create(nil);
        boomTable.DatabaseName := 'D:\sof';
       boomTable.SQL.Add('SELECT PNO, CNO, CNAME, SUB, QPA 
                                  FROM "d:\sof\Bomstart.dbf" Bomstart ');

      boomTable.SQL.Add('WHERE PNO = :PADRE  order by CNO');
      boomTable.ParamByName('PADRE').Value := padre;
      boomTable.Open;
      while not boomTable.Eof do
      begin
          mNodo := arbol.Items.AddChild(nodo, boomTable.Fields[1].Value);
          if boomTable.FieldByName('SUB').AsInteger = 3 then
          begin
          getComponents(boomTable.FieldByName('CNO').AsString  ,  
                                    mNodo, cantidad);      
     end
     else
     begin
       AsignaValores( boomTable.fieldByName('CNO').AsString, cantidad *  
                            boomTable.FieldByName('QPA').AsInteger);
     end;

     boomTable.Next;
   end;
  boomTable.Close;
  boomTable.Free;
end;

roman 09-09-2004 17:14:36

Cita:

Empezado por Aztaroth
Ah y otra cosa como demonios se indentan los mensajes en este foro, por que al momento de escribirlo le doy los espacios y lo indento pero cuando lo envio me lo pega todo a la izquierda.

He editado tu mensaje para que veas como se indenta el código. Sólo tienes que usar la etiqueta [delphi] que, además, te colorea en automático el texto. Si entras a editar el mensaje verás cómo la puse.

// Saludos

Aztaroth 09-09-2004 17:33:49

Funcion Recursiva
 
Ah ok, esa no me la sabia, gracias roman.

roman 09-09-2004 17:49:53

He mirado un rato tu código y no veo a primera vista qué error pueda tener aunque tampoco especificas con precisión qué es lo que falla.

Pero por otra parte en lo personal yo no llenaría el árbol de esta forma. Si la tabla es grande puede tardarse una eternidad.

Puedes usar el árbol en modo "virtual": cuando agregas un nodo le asignas true a su propiedad HasChildren pero no lees los hijos. Con esto logras que aparezca el [+] a la izquierda del nodo pero sin realmente tener hijos.

El evento OnExpanding del árbol se genera cuando el usuario intenta expandir el nodo. En este evento es cuando insertas los hijos del nodo tomando sus datos de la base.

De esta manera mejoras el rendimiento ya que vas a traer de la base los datos que realmente se requieran- aquellos que el usuario explícitamente solicite al intentar expandir un nodo.

// Saludos

jachguate 09-09-2004 17:54:24

Cita:

Empezado por Aztaroth
pero no entra a la recursividad como deberia

¿Que significa exactamente esto? ¿algun mensaje de error? ¿al compilar? ¿al ejecutar?

:confused:

walace_soy 09-09-2004 18:37:19

recursividad??
 
Hola que tal?, espero poder ayudarte aunque me parece que no porque no se mucho de programación y vamos imagino que lo que voy a decirte te parecera una tonteria.

Esto es lo que haces tu:

boomTable := TQuery.Create(nil);
boomTable.DatabaseName := 'D:\sof';
boomTable.SQL.Add('SELECT PNO, CNO, CNAME, SUB, QPA
FROM "d:\sof\Bomstart.dbf" Bomstart ');

boomTable.SQL.Add('WHERE PNO = :PADRE order by CNO');
boomTable.ParamByName('PADRE').Value := padre;
boomTable.Open;
while not boomTable.Eof do
begin
mNodo := arbol.Items.AddChild(nodo, boomTable.Fields[1].Value);
if boomTable.FieldByName('SUB').AsInteger = 3 then
begin
getComponents(boomTable.FieldByName('CNO').AsString ,
mNodo, cantidad);
end
No se exactamente lo que es CNO, pero si es lo que yo pienso, en que momento le dices que te de la información del siguiente padre?. Repito no soy muy bueno en esto de pensar asi que no te podre ayudar mucho, pero vamos sino le pasas el siguiente padre no podras obtener bien la informacion del siguiente. Pero desconozco que es ese campo.


La franja horaria es GMT +2. Ahora son las 05:03:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi