![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Modifica tu tabla agregando un campo contad(este servira cuantos id hijos tiene)
ID NOMBRE ID_PADRE CONTAD 1 RUBRO1 0 1 2 RUBRO11 1 1 3 RUBRO111 2 0 ///FIJATE EN ESTE DETALLE 3 RUBRO2 0 4 RUBRO21 3 Aqui te mando este procedure para rectificar mi error: CREATE PROCEDURE OBTENER_HIJOS(ID_PADRE INTEGER) RETURNS(NOMBRE VARCHAR(50)) AS BEGIN FOR SELECT NOMBRE FROM RUBROS WHERE ID_PADRE=:ID_PADRE ORDER BY ID INTO :NOMBRE DO BEGIN SUSPEND; END END Ahora modifica CREATE PROCEDURE GET_ARBOLRUBROS RETURNS (NOMB_PADRE CHAR (50), NOMB_HIJO VARCAR(50)) AS DECLARE VARIABLE ID INTEGER; DECLARE VARIABLE CONT INTEGER; BEGIN FOR SELECT ID, NOMBRE, CONTAD FROM RUBROS ORDER BY ID INTO :ID, :NOMB_PADRE, :CONTAD DO BEGIN IF (:CONTAD > 0) THEN BEGIN FOR SELECT NOMBRE FROM OBTENER_HIJOS(:ID) INTO :NOMB_HIJO DO BEGIN SUSPEND; END END END END Ojala te sirva, salu2. |
|
#2
|
|||
|
|||
|
Anduvo bárbaro!!!
Aunque no es lo que quiero hacer, me sirve para salir del paso. Muchas gracias. Guillermo |
|
#3
|
|||
|
|||
|
Con el siguiente procedimiento almacenado logre hacer lo que quería
CREATE PROCEDURE GET_ARBOLRUBROS ( ID_R INTEGER, NIVEL INTEGER) RETURNS ( NOMBRE VARCHAR (200)) AS declare variable Id_Rub Integer; declare variable CantHijos Integer; declare variable i Integer; declare variable NivelNuevo Integer; declare variable Espacios VarChar(200); BEGIN /* Para todos los rubros hijos de Id_R. */ for select "Id_Rubro", "Nombre" from "Rubros" where ("Id_Padre" = :Id_R) order by "Nombre" into :Id_Rub, :Nombre do begin /* Agrego tanto espacios en blanco como indica Nivel. */ Espacios = ''; i = 1; while (i <= Nivel) do begin Espacios = Espacios || ' '; i = i + 1; end if (not (Espacios is null)) then begin /* Retorno los espacios concatenados con el nombre del rubro. */ Nombre = Espacios || Nombre; end /* Con este suspend retorno el Nombre del rubro padre. */ suspend; /* Obtengo la cantidad de hijos del rubro padre. */ select count(*) from "Rubros" where ("Id_Padre" = :Id_Rub) into :CantHijos; /* Si tiene hijos, volver a llamar al procedimiento. */ if (:CantHijos > 0) then begin NivelNuevo = Nivel + 1; for select Nombre from get_arbolrubros(:Id_Rub, :NivelNuevo) into :Nombre do begin /* Con este suspend retorno el Nombre del rubro hijo. */ suspend; end end end END |
|
#4
|
|||
|
|||
|
Aqui tengo una nueva opcion, pero tienes que seguir algunas instrucciones:
1. Que los niveles no superen a los 15. Porque en el procedimiento GET_ARBOLRUBROS se agrega dos espacios en blanco por c/nivel. 2. Que la estructura este en el orden adecuado para que pueda funcionar. 3. En el IBDataSet llamar al procedimiento GET_ARBOLRUBROS asi: SELECT NOMBRE FROM GET_ARBOLRUBROS(0). /*Este procedimiento devuelve el Nª de nivel del registro.*/ CREATE PROCEDURE GET_NIVEL(ID INTEGER) RETURNS(NIVEL INTEGER) AS DECLARE VARIABLE OID INTEGER; DECLARE VARIABLE PADRE INTEGER; BEGIN NIVEL:=0; OID:=:ID; WHILE (:OID > 0) DO BEGIN SELECT ID_PADRE FROM RUBROS WHERE ID=:OID INTO :PADRE; OID:=:PADRE; NIVEL:=:NIVEL+1; END SUSPEND; END /*Ten en cuenta el tamaño de tu campo NOMBRE*/ CREATE PROCEDURE GET_ARBOLRUBROS(ID_PADRE INTEGER) RETURNS(NOMBRE VARCHAR(80)) AS DECLARE VARIABLE ID INTEGER; DECLARE VARIABLE NOMB VARCHAR(50); DECLARE VARIABLE NIVEL INTEGER; BEGIN FOR SELECT ID, NOMBRE FROM RUBROS WHERE ID_PADRE=:ID_PADRE ORDER BY ID INTO :ID, :NOMB DO BEGIN NOMBRE:=''; EXECUTE PROCEDURE GET_NIVEL(:ID) RETURNING_VALUES(:NIVEL); WHILE (:NIVEL > 1) DO BEGIN NOMBRE:='__' || :NOMBRE; /*'__'=espacios en blanco*/ NIVEL:=:NIVEL - 1; END NOMBRE:=:NOMBRE || :NOMB; SUSPEND; /*AQUI SE USA LA RECURSIVIDAD PARA OBTENER LOS HIJOS.*/ NOMBRE:=''; FOR SELECT NOMBRE FROM GET_ARBOLRUBROS(:ID) INTO :NOMBRE DO BEGIN SUSPEND; END END END Ojala te sirva, saludos. Última edición por JulioGO fecha: 27-08-2004 a las 00:43:25. |
|
#5
|
||||
|
||||
|
Hola.
A quienes han participado en este hilo, les recomiendo el uso de las etiquetas [code ], [delphi ] y [sql ] para publicar trozos de código, ya que sin estas, se hace realmente dificil leer el código. Dado que existen, se me hace un gran desperdicio no usarlas.
Hasta luego. ![]()
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate Última edición por jachguate fecha: 27-08-2004 a las 01:28:48. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|