Ver Mensaje Individual
  #1  
Antiguo 07-11-2007
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Reputación: 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