:( 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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Isaías
16/02/2005 - 02:00 | Informe spam
Lo siento, de esta NO tengo el creador, se valen reclamos
de CopyRight

CREATE TABLE Employee
(
EmployeeID INT IDENTITY(1, 1) NOT NULL,
ParentID INT NULL,
JobTitle VARCHAR(50) NOT NULL,
FirstName VARCHAR(50) NOT NULL,
PRIMARY KEY(EmployeeID),
FOREIGN KEY ParentID REFERENCES Employee (EmployeeID)
)

GO
SET IDENTITY_INSERT Employee ON
SET NOCOUNT ON

INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (1, NULL, 'Managing Director', 'Bill')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (2, 1, 'Customer Services', 'Angela')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (3, 1, 'Development Manager', 'Ben')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (4, 2, 'Assistant 1', 'Henry')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (5, 2, 'Assistant 2', 'Nicola')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (6, 3, 'Snr Developer', 'Kerry')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (7, 3, 'Assistant', 'James')
INSERT INTO Employee (EmployeeID, ParentID, JobTitle,
FirstName)
VALUES (8, 6, 'Jrn Developer', 'Tim')
SET NOCOUNT OFF

SET IDENTITY_INSERT Employee OFF
GO

extent values
ALTER TABLE Employee ADD [LeftExtent] INT NULL
ALTER TABLE Employee ADD [RightExtent] INT NULL

GO

the node is a child
SELECT * FROM Employee
CROSS JOIN (
SELECT [LeftExtent], [RightExtent]
FROM Employee WHERE Firstname
= 'Ben'
) AS Parent
WHERE Employee.[LeftExtent]
BETWEEN Parent.[LeftExtent] and Parent.[RightExtent]

SELECT * FROM Employee WHERE [LeftExtent] = [RightExtent] -
1

DECLARE @tmpStack TABLE
(
ID INT IDENTITY(1, 1),
EmployeeID INT NOT NULL,
LeftExtent INT NULL,
RightExtent INT NULL
)

parent
DECLARE @parentid AS INTEGER
SET @parentid = NULL

right extent
DECLARE @counter AS INTEGER
SET @counter = 1

DECLARE @id AS INTEGER
DECLARE @oldid AS INTEGER

SET NOCOUNT ON

WHILE 1 = 1
BEGIN
SET @id = NULL

which has not already
INSERT INTO @tmpStack
(
EmployeeID,
LeftExtent
)
SELECT TOP 1 EmployeeID, @counter
FROM Employee
WHERE ISNULL(ParentID, 0) = ISNULL(@parentid,0)
AND EmployeeID NOT IN (SELECT EmployeeID FROM @tmpStack)



SET @id = SCOPE_IDENTITY()
IF ISNULL(@id, 0) = ISNULL(@oldid, 0)
SET @id = NULL
ELSE
BEGIN
SET @oldid = @id
SET @counter = @counter + 1
END


row,
IF @id IS NULL
BEGIN
item
SELECT TOP 1 @id = ID FROM @tmpStack
WHERE RightExtent IS NULL ORDER BY ID DESC

procedure
IF @id IS NULL
BREAK

UPDATE @tmpStack
SET RightExtent = @counter
WHERE ID = @id

SET @counter = @counter + 1

SELECT @parentid = ParentID
FROM Employee WHERE EmployeeID =
(SELECT EmployeeID FROM @tmpStack WHERE ID = @id)
END
ELSE
BEGIN
SELECT @parentid = EmployeeID FROM @tmpStack WHERE ID
= @id
END
END

UPDATE e
SET LeftExtent = ts.LeftExtent,
RightExtent = ts.RightExtent
FROM Employee e
INNER JOIN @tmpStack ts
ON ts.EmployeeID = e.EmployeeID

GO
SELECT COUNT(P2.EmployeeID) AS level,
P1.FirstName,
P1.LeftExtent ,
P1.RightExtent
FROM Employee AS P1
INNER JOIN Employee AS P2
ON (P1.LeftExtent BETWEEN P2.LeftExtent AND
P2.RightExtent)
GROUP BY P1.FirstName, P1.LeftExtent, P1.RightExtent
ORDER BY Level ASC

SELECT p1.FirstName,
COUNT(p2.EmployeeID) Employees
FROM Employee p1
INNER JOIN Employee p2
ON (p2.LeftExtent BETWEEN p1.LeftExtent AND p1.RightExtent
AND p2.LeftExtent <> p1.LeftExtent)
GROUP BY p1.FirstName
ORDER BY Employees DESC
go
Respuesta Responder a este mensaje
#3 Alejandro Mesa
16/02/2005 - 15:33 | Informe spam
INF: Cómo mostrar Expandir jerarquías mediante SQL Server
http://support.microsoft.com/defaul...;es;248915


AMB


"JOSE DAVID GALVIZ MUÑOZ" wrote:

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



Respuesta Responder a este mensaje
#4 JOSE DAVID GALVIZ MUÑOZ
16/02/2005 - 16:17 | Informe spam
Bueno, Isaías, a veces nos pasa que queremos superar el reto solo, cuestión
del no aconsejable "orgullo", pero bueno mas vale tarde que nunca :)


Gracias a todos pruebo enseguida.



JOSE DAVID GALVIZ
MCAD
DCE 4 Estrella

"JOSE DAVID GALVIZ MUÑOZ" escribió en el mensaje
news:
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

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida