Localización: Blogs DosFlores en .NET |
|
| Publicado por: DosFlores |
10/10/2007 11:24 |
A ver si podemos mejorarlo entre todos... Suponiendo que tenemos una tabla de personas con una relación padre-hijo en la misma tabla:
codigo, nombre, padre "0000", "Luis", "" (sin padre) "0001", "Juan", "0000" "0002", "Pedro", "0000" "0003", "Alfonso", "" "0004", "Jose", "" "0005", "Fidel", "0004"
Copia este código en un form de ASP de VS2005 añadiendo < en las etiquetas de HTML al principio.
%@ Page Language="VB" %> %@ Import Namespace="System.Data" %> %@ Import Namespace="System.Data.SqlClient" %>
script runat="server"> Dim conex As String = "Data Source=JPA64;Initial Catalog=JPA;Integrated Security=True" Sub Page_Load() If Not Page.IsPostBack Then FillNodes() End If End Sub
Sub FillNodes() Dim ds As DataSet = GetData() For Each masterRow As DataRow In ds.Tables("Padres").Rows Dim masterNode As New TreeNode(masterRow("Nombre").ToString()) TreeView1.Nodes.Add(masterNode) For Each childRow As DataRow In masterRow.GetChildRows("Hijo") Dim childNode As New TreeNode(childRow("Nombre").ToString()) masterNode.ChildNodes.Add(childNode) Next Next End Sub
Function GetData() As DataSet Dim conn As SqlConnection = New SqlConnection(conex) Dim sqlCat As String = "SELECT Padres.Padre AS Codigo, Tabla.Nombre " sqlCat += "FROM (SELECT DISTINCT Padres.Padre " sqlCat += "FROM Tabla AS Padres WHERE Padre<>'') AS Padres INNER JOIN " sqlCat += "Tabla ON Padres.Padre=Tabla.Codigo" Dim sqlProd As String = "SELECT Codigo,Nombre,Padre FROM Tabla AS Hijos WHERE Padre<>''" Dim daCat As SqlDataAdapter = New SqlDataAdapter(sqlCat, conn) Dim daProd As SqlDataAdapter = New SqlDataAdapter(sqlProd, conn) Dim ds As DataSet = New DataSet() daCat.Fill(ds, "Padres") daProd.Fill(ds, "Hijos") ds.Relations.Add("Hijo", _ ds.Tables("Padres").Columns("Codigo"), _ ds.Tables("Hijos").Columns("Padre")) Return ds End Function
/script>
form id="form1" runat="server"> div> ?xml:namespace prefix = asp /> /div> /form>
Me faltaría resolver que hacer con un padre sin hijos, pero no me ha dado tiempo, prometo que en una futura versión os actualizaré este artículo con ese fallo arreglado. |
|
|