Ver Mensaje Individual
  #3 (permalink)  
Antiguo 12/10/2007, 21:39
Avatar de Gabo77
Gabo77
 
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: consulta de arbol

Yo haria un procedimiento almacenado.

Supongamos que tu tabla fuente tiene la siguiente estructura:

Tb_Proyectos(IdProyecto, Nombre, IdProyectoPadre)

donde IdProyecto es tu campo llave (unico obviamente) y la tabla tiene una referencia hacia sí misma mediante los campos IdProyecto ==> IdProyectoPadre.

Entonces haría un procedimiento almacenado de la siguiente forma...

Código:
Create Procedure SpObtenerArbolProyectos
(
    IdProyecto As Integer --El proyecto que necesitamos evaluar
)
As
    Declare @BanSiguente As Bit
    Declare @Profundidad As Integer

    Create Table #Tb_ProyectosTemp
    (
        IdProyecto Integer,
        Nombre VarChar(100),
        IdProyectoPadre Integer,
        Profundidad Integer
    )

    Set @Profundidad = 0

    /*Obtenemos el registro inicial*/
    Insert Into #Tb_ProyectosTemp(IdProyecto, Nombre, IdProyectoPadre, Profundidad)
        Select IdProyecto, Nombre, IdProyectoPadre, @Profundidad
        From Tb_Proyectos
        Where IdProyecto = @IdProyecto

    If @@RowCount > 0 Begin
        Set @BanSiguiente = 1
    Else
        Set @BanSiguiente = 0
    End If

    While @BanSiguiente = 1 Begin

        Set @Profundidad = @Profundidad + 1

        Insert Into #Tb_ProyectosTemp(IdProyecto, Nombre, IdProyectoPadre, Profundidad)
            Select IdProyecto, Nombre, IdProyectoPadre, @Profundidad
            From Tb_Proyectos P
            Where Exists( --Obtener los registros hijos de los registro que ya se tienen
                Select 1
                From #Tb_ProyectosTemp PP
                Where PP.IdProyecto = P.IdProyectoPadre
            )

        If @@RowCount > 0 Begin
            Set @BanSiguiente = 1
        Else
            Set @BanSiguiente = 0
        End If

    Loop

    --Devolver la estructura obtenida
    Select IdProyecto, Nombre, IdProyectoPadre, Profundidad
    From #Tb_ProyectosTemp

Go
Esta consulta te devolverá todos los registros hijos directos o indirectos del proyecto que le pases por parámetro, además te dará la profundidad del proyecto dentro del árbol que creaste....

Es muy importante que tengas perfectamente indexada la tabla de proyectos, ya que dependiendo de la cantidad de registros que almacenes en ella la consulta puede volverse muy lenta.

Espero te sirva...

Saludos!

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....

Última edición por Gabo77; 12/10/2007 a las 21:44