Servicio web para cargar los nodos de un árbol
[Función recursiva]

Fecha: 02/12/2004

Autor: Alejandro Fariña Blanco, (aalekhine@terra.es)

 


 

1. Problema.

Tenemos que generar un menú de tipo árbol, tenemos los datos de este árbol en una tabla y tenemos que acceder a esta recursivamente para la generación de este.

 

2. Solución.

La solución que propongo en este ejemplo es la de un servicio web que nos devolverá un XML con la estructura del árbol, para conseguir este programamos una función que llama a un procedimiento almacenado con una función recursiva para recorrer y generar el árbol. 

El formato de la tabla es el siguiente:

Nombre tabla: Nodos.

Campos: id integer(5) PK, nombre nvarchar(50), idpadre integer(5) este campo puede ser FK a la PK de la misma tabla id, tiponodo nvarchar(50).

Donde id es el campo identificador del nodo, nombre es la descripción del nodo e idpadre es una FK a la misma tabla Nodos que identifica el nodo superior o padre, tiponodo describe la cabecera del nodo ejemplo <casa id="1" descripcion="Chalet">

Los procedimientos almacenados serian: creaArbol procedimiento principal, que llama recursivamente al procedimiento creaEstructuraArbol, este genera las lineas en XML.

 

CREATE TABLE Nodos1( id int PRIMARY KEY, nombre nvarchar(50), tiponodo nvarchar(5), idpadre int)

GO

 

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(0,'Familia','Arbol',NULL)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(1,'Abuelo 1','Rama',0)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(2,'Abuelo 2','Rama',0)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(3,'Padre 1.1','Rama',1)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(4,'Padre 2.1','Rama',2)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(5,'Hijo 1.1.1','Hoja',3)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(6,'Hijo 1.1.2','Hoja',3)

INSERT INTO NODOS (id, nombre, tiponodo, idpadre) VALUES(7,'Hijo 2.1.1','Hoja',4)

GO

 

----------------------------------------------------------------------------

CREATE PROC creaArbol AS

BEGIN

            SET NOCOUNT ON

            --La tabla temporal Arbol almacena las lineas del xml que se generan

            --Chorro contiene cada linea del xml

            CREATE TABLE #Arbol

            (

            chorro varchar(8000)

            )

 

            EXEC creaEstructuraArbol 0

 

            --Devolvemos las lineas del XML

            SELECT 

            *

            FROM #Arbol

 

            DROP TABLE #Arbol

END

GO

-------------------------------------------------------------------------------

 

CREATE PROC creaEstructuraArbol

(

            @valor int

)

AS

BEGIN

            SET NOCOUNT ON

            --Variables para recoger los campos para crear arbol

            DECLARE @id int, @nombre nvarchar(50), @tipo nvarchar(50)  

            SELECT @nombre = nombre, @tipo = tiponodo FROM Nodos WHERE id = @valor

             --Insertamos en la tabla temporal el nodo

            INSERT INTO #Arbol (chorro) VALUES ('<' + @tipo + ' Id= "' +CAST(@valor as varchar) + '" Descripcion= "' + @nombre + '">')

            SET @id = (SELECT MIN(id) FROM nodos WHERE idpadre = @valor)

             WHILE @id IS NOT NULL

            BEGIN

                        --Llamada recursiva al procedimiento para generar la estructura

                        EXEC creaEstructuraArbol @id

                        SET @id = (SELECT MIN(id) FROM Nodos WHERE idpadre = @valor AND id > @id)

            END

            --Insertamos en la tabla temporal cerrar el nodo

            INSERT INTO #Arbol (chorro) VALUES ('</' + @tipo + '>')

END

GO

 

-----------------------------------------------------------------------------

 

    <WebMethod()> Public Function XMLMenu() As String

        Try

            'Declaracion de variables

            Dim XML As String

            Dim cnn As SqlConnection

            'Creacion de la conexion con la BBDD

            CrearConexion(cnn)

            'Llamada a la funcion que genera el arbol

            XML = CreaArbol(cnn)

            'Cerrar la conexion de la BBDD

            CerrarConexion(cnn)

            'Devuelve el XML generado

            Return XML

        Catch ex As Exception

            'Tratar excepciones

        End Try

 

    End Function

 

    Private Sub CrearConexion(ByRef cnn As SqlConnection)

        cnn = New SqlConnection("server=(local);database= pruebas;userid=sa;password=sa")

    End Sub

 

    Private Function CreaArbol(ByRef cnn As SqlConnection) As String

        Dim XMLGenerado As String

        'Procedimiento que genera el arbol

        Dim cmd As SqlCommand = New SqlCommand("exec CreaArbol", cnn)

        cnn.Open()

        'Datareader que recoge los resultados del procedimiento de generacion del arbol

        Dim dr As SqlDataReader = cmd.ExecuteReader()

        'Recorremos el datareader

        While dr.Read

            XMLGenerado = XMLGenerado + dr.GetString(0)

        End While

        dr.Close()

        'Devuelve el XML generado

        CreaArbol = XMLGenerado

    End Function

 

    Private Sub CerrarConexion(ByRef cnn As SqlConnection)

        cnn.Close()

        cnn.Dispose()

    End Sub

 

End Class

      


ir al índice

Fichero con el código de ejemplo: aalekhine_WSGeneraMenu.zip - 11.2 KB