ASP.NET - Mostrar Relation en DataList (emular un LEFT JOIN)

 
Vista:

Mostrar Relation en DataList (emular un LEFT JOIN)

Publicado por Pseudolus (3 intervenciones) el 21/11/2007 17:09:08
Ante todo, disculpas adelantadas por la explicación tan rara que he puesto en el anuncio. A ver si ahora me explico mejor...

Tengo dos bases de datos estadísticas: una en DB2, otra en SQL (accedo a ambas sin ningún tipo de problemas). La consulta que realizo sobre ellas me da una fecha y el número de impactos recibidos en la fecha en cuestión. No pongo las consultas (son un poco gordas), pero los campos que obtengo son

FECHA, IMPACTOSDB2 en la base de datos DB2
FECHA, IMPACTOSSQL en la base de datos SQL

Quiero mostrar estos datos en un único control (un DataList, por ejemplo), por lo que necesito "unir" las consultas. De estar en una misma base de datos, un LEFT JOIN bastaría, pero al estar en bases de datos distintas tengo que echar mano de las relaciones (a no ser que haya algún método alternativo)

En primer lugar, vuelco ambas consultas (una obtenida mediante un DB2DataAdapter, la otra mediante un SQLDataAdapter) en un DataSet

MyAdpDB2.Fill(MyDataSet, "ImpactosDB2")
MyAdpSQL.Fill(MyDataSet, "ImpactosSQL")

Seguidamente, realizo la relación pertinente, utilizando el campo FECHA (el cual es idéntico en ambos casos)

MyDataSet.Relations.Add("RelacionFechas", MyDataSet.Tables("ImpactosDB2").Columns("Fecha"), MyDataSet.Tables("ImpactosSQL").Columns("Fecha"), True)

La relación se realiza correctamente (a cada registro DB2 le corresponde un único registro SQL); esto lo compruebo con el siguiente código

Dim Fila1, Fila2 As DataRow
For Each Fila1 In MyDataSet.Tables("ImpactosDB2").Rows
Response.Write(Fila1("Fecha").ToString & "-" & Fila1("ImpactosDB2").ToString & " - ")
For Each Fila2 In Fila1.GetChildRows("RelacionFechas")
Response.Write(Fila2("Fecha").ToString & "-" & Fila2("ImpactosSQL").ToString & "<BR>")
Next
Next

El problema viene al pasar estos datos a un control, y es que no encuentro la manera de pasarlos todos

GridView1.DataSource = MyDataSet
GridView1.DataBind()

Esto, por ejemplo, sólo me carga en el GridView el contenido de la tabla en DB2 (la primera que he cargado en el DataSet)

GridView1.DataSource = MyDataSet.Tables("ImpactosSQL").DefaultView
GridView1.DataBind()

Aquí pasa lo contrario (obvio por otra parte, al hacer referencia directa a la tabla SQL)

He probado a meterle como DataSource la relación (que sería lo lógico), pero me da error

GridView1.DataSource = MyDataSet.Relations("RelacionFechas")
GridView1.DataBind()

Ignoro si es porque no se puede, o porque lo hago mal. La teoría es que si le cargo la relación, tendré un GridView con 4 columnas (las dos de DB2 y las dos de SQL), pero por ahora no lo he conseguido

¿Sabe alguien si lo que estoy intentando es utópico, o si hay alguna solución? A malas, ¿hay alguna manera de rellenar "a pelo" el GridView, utilizando el bucle que he mostrado antes?

Espero haber sido lo suficientemente claro en las explicaciones. Gracias a todos por adelantado
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Mostrar Relation en DataList (emular un LEFT JO

Publicado por Javier Santamaria (312 intervenciones) el 22/11/2007 12:03:41
Hola,

Desde mi experiencia creo qeu si no te deja meterlo como datasource te tocara hacerlo a pelo.

Si como dices las tablas se corresponden en numero de filas puedes hacer esto (es pseudocodigo, pero lo adaptas):

'Cargamos la tabla 1 (por ejemplo DB2)
for each fila in tabla1
dim nuevafila as new gridviewrow
for each columna in fila.columnas
dim nuevacolumna as new gridviewcolumn = columna
nuevafila.columnas.add(nuevacolumna)
next
gridview.filas.add(nuevafila)
next

'Añadimos los valores de la tabla 2 (por ejemplo SQL)
dim i as integer=0
for each fila in tabla2
dim filagrid as gridviewrow = gridview.filas(i)
for each columna in fila.columnas
dim nuevacolumna as new gridviewcolumn = columna
filagrid.columnas.add(nuevacolumna)
next
i = i + 1
next

PD: De todas formas investiga un poco mas sobre lo del DataSource con la relacion, porque seria incomprensible que te dejen hacerlo si no lo puedes representar en los controles.

Suerte y ya nos cuentas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Mostrar Relation en DataList (emular un LEFT JO

Publicado por Pseudolus (3 intervenciones) el 23/11/2007 12:18:09
Por ahora, la solución que he encontrado (muy parecida a la tuya) es usando un DataTable, el cual relleno manualmente

Aquí relleno el DataSet y establezco la relación

MyAdpDB2.Fill(MyDataSet, "ImpactosDB2")
MyAdpSQL.Fill(MyDataSet, "ImpactosSQL")

MyDataSet.Relations.Add("RelacionFechas", MyDataSet.Tables("ImpactosDB2").Columns("Fecha"), MyDataSet.Tables("ImpactosSQL").Columns("Fecha"), True)

Luego creo el DataSet, definiéndole 3 columnas (Fecha, que es igual para ambos casos, ImpactosDB2 e ImpactosSQL)

Dim MyDataTable As New DataTable()
Dim MyDataRow As DataRow

MyDataTable.Columns.Add(New DataColumn("Fecha", GetType(DateTime)))
MyDataTable.Columns.Add(New DataColumn("ImpactosDB2", GetType(String)))
MyDataTable.Columns.Add(New DataColumn("ImpactosSQL", GetType(String)))

Y finalmente, relleno manualmente el DataTable

Dim Fila1, Fila2 As DataRow
For Each Fila1 In MyDataSet.Tables("ImpactosDB2").Rows
MyDataRow = MyDataTable.NewRow()
MyDataRow("Fecha") = CType(Fila1("Fecha").ToString, DateTime)
MyDataRow("ImpactosDB2") = Fila1("ImpactosDB2").ToString
For Each Fila2 In Fila1.GetChildRows("RelacionFechas")
MyDataRow("ImpactosSQL") = Fila2("ImpactosSQL").ToString
Next
MyDataTable.Rows.Add(MyDataRow)
Next

Y una vez rellenado, realizo el DataBind sobre el DataList que me mostrará los resultados

DataList1.DataSource = MyDataTable
DataList1.DataBind()

Igualmente, seguiré investigando. Me sorprende mucho que existiendo las relaciones, no permitan mostrar los datos tal y como pretendo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar