FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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(); } } Código:
vector <int> codigos; 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 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. |
#2
|
||||
|
||||
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); } } }
__________________
Saludos, Gabo A menos que se indique lo contrario, el código estará hecho en C++Builder. |
|
|
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 |
|