jueves, 3 de febrero de 2011

Subinformes RDLC en report cargado dinámicamente.

Sintomas
Creas un informe RDLC con subreports mediante visual studio.
Cargas dinámicamente el informe pero se produce un error al cargar el subinforme.
No encuentra el archivo.
Por otro lado ¿Cómo cargas los datos del subinforme.
Soluciones:
Debes cargar dinámicamente con loadsubrepordefinitión el subinforme utilizando como nombre del report el Reportname (el que rellenas en usar este informe como subinforme de las propiedades) y no el  del subinforme dentro del informe.
Ejemplo:
Dim informe As New LocalReport
Dim lector As New System.IO.StreamReader(My.Request.PhysicalApplicationPath + "\ListadoOrgsProd.rdlc")
informe.LoadReportDefinition(lector)
lector.Close()
lector = New System.IO.StreamReader(My.Request.PhysicalApplicationPath + "\ListadoProd.rdlc")
informe.LoadSubreportDefinition("ListadoProd.rdlc", lector)
lector.Close()
AddHandler informe.SubreportProcessing, AddressOf infoParametros

Por cierto que en la última línea se resuelve como establecer los datos de subinforme: hay que hacer establecer mediante addHandler la referencia a un procedimiento que se dispará cuando vaya a procesarse el informe:

Sub infoParametros(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)
     e.DataSources.Add(New ReportDataSource("dsProductos", datosProd))
End Sub

5 comentarios:

Anónimo dijo...

Por favor, me puedes decir como acoplas "informe" generado con Localreport al reportViewer.
No conozco Visual Estudio 2010. tengo el problema de que no me funciona el subreport. Gracias

Arturo Soler dijo...

En lugar de la variable declarada informe utilizas reportviewer1.localreport. Y al final le haces un refresh
Dim lector As New System.IO.StreamReader(My.Request.PhysicalApplicationPath + "\ListadoOrgsProd.rdlc")
ReportViewer1.LocalReport.LoadReportDefinition(lector)
lector.Close()
lector = New System.IO.StreamReader(My.Request.PhysicalApplicationPath + "\ListadoProd.rdlc")
ReportViewer1.LocalReport.LoadSubreportDefinition("ListadoProd.rdlc", lector)
lector.Close()
AddHandler reportviewer1.localreport.SubreportProcessing, AddressOf infoParametros)
ReportViewer1.LocalReport.Refresh()

Arturo Soler dijo...

Puedes ver un articulo relacionado en http://www.codeproject.com/KB/aspnet/ReportViewer.aspx

Debo decirte que yo no uso el report viewer sino que devuelvo directamente un pdf.
Para ellos añades al final:
Dim bytes = informe.Render("PDF")
Response.Clear()
Response.ContentType = "Application/PDF"
Response.AddHeader("content-disposition", String.Format("attachment; filename={0}.PDF", director.Pagina.TipoObjetoActualDescrito(infopagina.numero.plural)))
Response.BinaryWrite(bytes)

Arturo Soler dijo...

Disculpa, mas legible así.
Dim bytes = informe.Render("PDF")
Response.Clear()
Response.ContentType = "Application/PDF"
Response.AddHeader("content-disposition","nombreArchivo.PDF")
Response.BinaryWrite(bytes)

Anónimo dijo...

Hola, sigo los pasos que comentáis y no me da ningún error, pero una vez que tengo todos los datos cargados en el ReportDataSource y empieza a generar el informe me aparece el comentario de espera "Cargando" y no muestra el informes.
Podéis ayuderme

Un saludo y muchas gracias