Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Procedimiento almacenado para obtener Rubros y subrubros (Firebird)

Estas en el tema de Procedimiento almacenado para obtener Rubros y subrubros (Firebird) en el foro de Bases de Datos General en Foros del Web. Hola a todos, estoy usando Firebird, en donde tengo la tabla Rubros(Id_Rubro, Nombre, Id_Padre), Id_Padre indica cual es el padre de un rubro. Está hecha ...
  #1 (permalink)  
Antiguo 26/08/2004, 06:29
 
Fecha de Ingreso: agosto-2004
Ubicación: Rio Cuarto (Argentina)
Mensajes: 2
Antigüedad: 20 años, 3 meses
Puntos: 0
Procedimiento almacenado para obtener Rubros y subrubros (Firebird)

Hola a todos, estoy usando Firebird, en donde tengo la tabla Rubros(Id_Rubro, Nombre, Id_Padre), Id_Padre indica cual es el padre de un rubro. Está hecha así porque necesito mostrar jerárquimente los rubros, algo como,
R1
R11
R111
R12
R2
R21

Necesito imprimir esta estructura de árbol en un reporte y lo que pensé es hacer un procedimiento almacenado que me retorne un conjunto de registros en los cuales quiero colocar unos espacios en blanco para lograr la identación. Es decir, quiero obtener estos registros
R1
bbR11
bbbbR111
bbR12
R2
bbR21
Donde b es un espacio en blanco.

Lo que he hecho es lo siguiente pero no logro obtener lo que deseo
CREATE PROCEDURE GET_ARBOLRUBROS (
ID_R INTEGER)
RETURNS (
NOMB CHAR (50))
AS
declare variable Id_Rub Integer;
declare variable CantHijos Integer;
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, :Nomb
do begin
suspend;
select count(*) from "Rubros"
where ("Id_Padre" = :Id_Rub)
into :CantHijos;
if (CantHijos = 0) then
suspend;
else
begin
execute procedure get_ArbolRubros(Id_Rub) returning_values :Nomb;
suspend;
end
end
END

Esta no es la versión final de lo que deseo, pero primero estoy tratando de obtener los registros, después le agregaré los espacios en blanco al principio.

Espero que alguien me pueda ayudar a resolverlo.

Desde ya mucha gracias

Guillermo
  #2 (permalink)  
Antiguo 26/08/2004, 07:12
 
Fecha de Ingreso: agosto-2004
Ubicación: Rio Cuarto (Argentina)
Mensajes: 2
Antigüedad: 20 años, 3 meses
Puntos: 0
Con este procedimiento almacenado logré hacerlo

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
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:15.