:( No he podido con esta consulta

15/02/2005 - 23:34 por JOSE DAVID GALVIZ MUÑOZ | Informe spam
Compañeros, luego de dias de tratar y tratar, he decidido recurrir a usted.

Lo que sucede es que en una tabla tengo la estructura del menu de una
aplicación:
IdMenu Texto IdPadre Orden
1 Auditoria NULL 1
2 Sesiones 1 1
3 Consultas NULL 2
4 Procesos NULL 3
5 Listados 3 1
6 Desmontar 4 1
7 Otros 3 2

La idea es hacer un sql o store procedure que me devuelva el menu armado (No
vale limitar los niveles :)

El resultado seria algo como:
IdMenu Texto IdPadre
1 Auditoria NULL
2 Sesiones 1
3 Consultas NULL
5 Listados 3
7 Otros 3
4 Procesos NULL
6 Desmontar 4


Agradezco, cualquier colaboración, pues me he rendido en este momento :(


Gracias,



JOSE DAVID GALVIZ
MCAD
DCE 4 Estrella
 

Leer las respuestas

#1 Isaías
16/02/2005 - 01:59 | Informe spam
Lo que me sorprende es que le hayas dedicado DIAS para
resolver esta problematica, aqui una del buen ULISES:


create table tempo ( idclave int, descripcion char(10),
idpadre int )
go
insert into tempo values ( 1, 'AAA', 0 )
insert into tempo values ( 2, 'AAA', 1 )
insert into tempo values ( 3, 'AAA', 1 )
insert into tempo values ( 4, 'AAA', 2 )
insert into tempo values ( 5, 'AAA', 2 )
insert into tempo values ( 6, 'AAA', 4 )
go
create table tempodes ( iddes int, nivel int )
go

2) Grabamos en la tabla tempodes los descendientes del
parámetro solicitado (en eset caso lo pongo en una
variable):

declare @param int
SET @param = 1

declare @nivel int
DELETE FROM tempodes
INSERT INTO tempodes SELECT idclave, 1 FROM tempo WHERE
idpadre = @param
SET @nivel = 2
WHILE ( EXISTS ( SELECT iddes FROM tempodes WHERE nivel =
@nivel - 1 ) )
BEGIN
INSERT INTO tempodes SELECT idclave, @nivel FROM tempo
WHERE idpadre IN ( SELECT iddes FROM tempodes WHERE nivel
= @nivel - 1 )
SET @nivel = @nivel + 1
END

3) Si vemos el detalle de la tabla con SELECT * FROM
tempodes tenemos :

iddes nivel
2 1
3 1
4 2
5 2
6 3

4) Si deseamos que todo se encuentre en una cadena :

declare @cadena varchar(1000)
SET @cadena = ''
select @cadena = @cadena + convert(varchar,iddes) + ';'
from tempodes
select @cadena

tenemos :

-
2;3;4;5;6;

Saludos,
Ulises
-FIN

Preguntas similares