Siempre me digo que responder de forma tajante una pregunta que te hacen en torno a tecnologías es la opción cuando estás seguro de la respuesta, pero cuando no lo estás al 100 % lo mejor es responder que no sabes la respuesta. Precisamente esto es lo que me ha pasado en el último curso sobre SQL Server Reporting Services 2008 (SSRS 2008) que he impartido. La pregunta en este caso fue la siguiente: ¿Se pude crear un informe a partir de un Entity Data Model (EDM) de ADO.NET Entity Framework? Tras no pensarlo mucho, contesté que en el Report Designer de Visual Studio o en el Report Builder no porque espera una fuente relacional, un modelo de datos, datos XML, pero no un modelo de entidades de negocio como el que tenemos con EF o LINQ To SQL…la pregunta tenía toda su lógica ya que cuando diseñamos un informe en SSRS 2008 partimos de un dataset. El caso es que en este caso he de decir que la respuesta que di es cierta a medias puesto que si existe una forma de generar informes a partir de un EDM de EF o un modelo de LINQ To SQL o incluso llamando a un servicio de ADO.NET Data Services…la respuesta está en el control Report Viewer que tenemos en Visual Studio y que admite tanto informes locales como de servidor. Pero vamos al grano:
-
Lo primero es lógicamente crear un EDM de EF utilizando para ello el asistente que tenemos en Visual Studio 2008 SP1.
- Una vez creado el EDM, compilamos el proyecto.
-
Añadimos un elemento al proyecto de tipo Reporting –> Report al proyecto…y es aquí dónde está la clave: puedo diseñar informes en modo local para ser consumidos por el control report viewer.
-
Se abre la superficie de diseño de SSRS (cuidado, que no es la de SSRS 2008 :-(, es nuestro viejo SSRS 2005…lo que no deja de ser curioso, pues estoy trabajando con un proyecto de .NET Framework 3.5 y tengo instalada toda la infraestructura de SSRS 2008). A través de la ventana Data Sources podemos especificar la fuente de datos para el informe haciendo clic sobre Add New Data Source…
-
En la ventana que sea abre elegimos una fuente de tipo Object…Ajá, aquí lo tenemos, en el momento en el que yo puedo especificar una fuente de datos tipo Object, ya hablo la posibilidad de crear informes a partir de mi EDM, de un modelo de LINQ To SQL o incluso a partir de un servicio de ADO.NET Data Services.
-
Esto nos permite elegir que objetos de negocio del proyecto actual queremos utilizar para crear el informe. Elegimos nuestro modelo de EF.
-
De esta forma, ya tenemos las entidades de nuestro modelo de EF listas para empezar a construir nuestro informe.
-
Añadimos una región de datos de SSRS a la superficie de diseño (en mi caso una tabla).
-
No tenemos más que arrastrar campos de las entidades de negocio a las zonas de datos del informe. En mi caso, he añadido dos campos de una de las entidades por simplicidad.
-
Guardamos el informe y añadimos un control de tipo Report Viewer a nuestro formulario Windows Form o Web.
-
Lo siguiente que tenemos que hacer es configurar el control Report Viewer vía código para que por una parte utilice el informe que hemos diseñado y por otra vincule de forma adecuada las entidades del modelo de EF con dicho informe.
AdventureWorksEntities ctx = new AdventureWorksEntities(); var dataSource = ctx.Product; this.reportViewer1.ProcessingMode= Microsoft.Reporting.WinForms.ProcessingMode.Local; this.reportViewer1.LocalReport.ReportPath= System.Environment.CurrentDirectory + @"\Product.rdlc"; this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.DataSources.Add( new Microsoft.Reporting.WinForms.ReportDataSource( "SSRS_LINQ_Product", dataSource)); this.reportViewer1.RefreshReport(); |
-
Fijaros que para poder utilizar entidades del modelo de EF, lo único que hago es crear una instancia del objeto contexto de datos. Definir mi fuente de datos en base a una de las entidades del modelo, y a continuación configurar de forma adecuada el control reportviewer:
-
Fijamos el modo de procesamiento a local.
-
Especificamos el informe que vamos a visualizar en el control (el que hemos diseñado anteriormente).
-
Añadimos la fuente de datos al report viewer y lo reflescamos.
-
-
Tras compilar la aplicación, no tenemos más que probar que funciona…cool!!
Y hasta aquí llega este post…lo bien que se queda uno cuando encuentra la respuesta que contradice la afirmación realizada inicialmente. Espero que el post os haya resultado de utilidad.
Esto me funciona perfectamente para win forms pero cuando lo hago en web forms no me sale donde puedo escojer los tipos de data sources, simplemente me agrega un data set, y mas nada, uso visual studio team system 2008 sp1, con sql server 2008 sp1 tambien, me gustaria me pudieras dar una mano con esto, gracias.
Un ejemplo utilizando el componente ‘Informe integrado’ hubiese sido excelente.