Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
Recursividad. Obtener registros que sirven como nodo hoja.

Hola de nuevo,

Verán estoy un poco atorado con un procedimiento recursivo, a ver si me pueden "echar una mano". Se trata de éste:

Código:
void __fastcall TForm1::obtenerhojas (int codigo)
{
   DataModule->Query->Close();
   DataModule->Query->SQL->Clear();
   DataModule->Query->SQL->Add("\
     SELECT ARBOL_CODIGO, ARBOL_ESHOJA \
     FROM ARBOL WHERE \
     ARBOL_CODPADRE=:codigo and ARBOL_BORRADO=0 \
     ORDER BY ARBOL_ORDEN");
   DataModule->Query->ParamByName("codigo")->AsInteger=codigo;
   DataModule->Query->Prepare();
   DataModule->Query->Open();
   DataModule->Query->First();
   while(!DataModule->Query->Eof)
   {
        if (DataModule->Query->FieldByName("ARBOL_ESHOJA")->AsInteger == 1)
        {
           int cod= DataModule->Query->FieldByName("ARBOL_CODIGO")->AsInteger;
           codigos.push_back(cod);
        }else{
           int cod= DataModule->Query->FieldByName("ARBOL_CODIGO")->AsInteger;
           obtenerhojas(cod);
        }
      DataModule->Query->Next();
   }
}
Donde codigos ha sido declarado como:

Código:
vector <int> codigos;
El tema es que, como ya imaginarán, no funciona del todo bien...

Supongamos que la primera vez le paso el codigo 683 que corresponde a la siguiente jerarquía:

Código:
 
683 - 684 - 685 - 686
                - 687
    - 688
    - 689 - 690
    - 691
    - 695 - 693
En ese caso me guarda en codigos el 686 y el 687. Osea le falta el 688, 690, 691 y 693.

La razón creo tenerla clara y es que al entrar cada vez y ejecutar la consulta de nuevo, el contenido se borra.

Es decir, la primera vez obtiene 684, 688, 689, 691 y 695.

La segunda vez, analiza el 684, pero cuando vuelve no puede seguir con el 688 ya que los datos se han perdido.

¿Alguna idea sobre cómo abordar el problema?
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #2  
Antiguo 07-11-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
Solucionado

Bueno, tras un descanso pude con el problema...

Guardo todos los codigos en un vector temporal (así me aseguro de no perderlos) y, luego, los paso al vector definitivo tras comprobar que sean de un registro que se corresponde con un nodo hoja.

Código:
 
void __fastcall TForm1::obtenerhojas (int codigo)
{
   vector <int> codTemp;
   vector <bool> hojaTemp;
   DataModule->Query->Close();
   DataModule->Query->SQL->Clear();
   DataModule->Query->SQL->Add("SELECT ARBOL_CODIGO, ARBOL_ESHOJA FROM ARBOL \
                                  WHERE ARBOL_CODPADRE=:codigo and ARBOL_BORRADO=0 ORDER BY ARBOL_ORDEN");
   DataModule->Query->ParamByName("codigo")->AsInteger=codigo;
   DataModule->Query->Prepare();
   DataModule->Query->Open();
   DataModule->Query->First();
   while(!DataModule->Query->Eof)
   {
        int codigo= DataModule->Query->FieldByName("ARBOL_CODIGO")->AsInteger;
        bool esHoja=  DataModule->Query->FieldByName("ARBOL_ESHOJA")->AsInteger == 1;
        codTemp.push_back(codigo);
        hojaTemp.push_back(esHoja);
        DataModule->Query->Next();
   }
   for(unsigned int i=0; i<hojaTemp.size(); i++)
   {
      int codigo= codTemp[i];
      bool esHoja= hojaTemp[i];
      if (esHoja)
      {
         codigos.push_back(codigo);
      }else{
         obtenerhojas(codigo);
      }
   }
}
Gracias a todos por su tiempo...
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Archivos _QSQLXXXX ¿Que son? ¿Para que sirven? ¿Como se crean? Wonni Conexión con bases de datos 2 13-08-2007 09:37:43
Obtener un fichero adjunto a un nodo de un fichero XML muntasil Internet 0 18-07-2006 12:57:57
Como selecionar un nodo de un TTreeView VRO OOP 2 18-05-2005 16:45:24
Como puedo eliminar un nodo de un TTreeVieu didier OOP 1 15-07-2004 19:33:38
FastReport salgan dos registros por hoja cahosoft Impresión 0 13-07-2004 18:13:02


La franja horaria es GMT +2. Ahora son las 11:11:27.


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
Copyright 1996-2007 Club Delphi