Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Recursividad. Obtener registros que sirven como nodo hoja. (https://www.clubdelphi.com/foros/showthread.php?t=50066)

Gabo 07-11-2007 13:58:20

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?

Gabo 07-11-2007 15:40:47

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... :)


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

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