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