Fran Diaz

Reporting Services, Business Intelligence, tecnologías Microsoft y otros

Email Notifications

Recent Posts

Tags

News

Community

Comunidades

  • Foro MSDN Español: Colaborador
  • CartujaDotNet

Webs Amigas

Archives

[How To] Reporting Services sin IIS y sin servidor de informes

Desde que abrí mi primer post sobre Reporting Services (hace ya un tiempo), he tenido muchos comentarios. Muchos me han ayudado a investigar cosas que no había usado nunca de Reporting y otros al escribirme como lo habían hecho, me ayudaron a saber algo más acerca de esta tecnología.

Algunas dudas, han sido como trabajar con informes sin tener que utilizar un servidor de informes, como pasarle a un informe de este tipo parámetros o como trabajar con el dataset de este.

El otro día (bueno, ya hace unos cuantos) estuve con el amigo Alberto viendo algunos problemillas que tenía con Reporting y después de ver entre los dos como tratar con este tipo de informes, me decidí a postearlo para la comunidad. Aunque desde que lo hicimos, ha pasado un poco de tiempo :P.

Lo primero, creamos un nuevo proyecto de tipo Windows Forms, luego agregamos un control ReportViewer(1). Este lo podemos encontrar en la caja de herramientas en la parte de datos.

Luego, ajustamos el control a nuestro gusto o en nuestra interfaz, y en la pestaña superior derecha, podemos seleccionar crear un nuevo informe(2).

NuevoReport

Al crear un informe de esta forma, nos crea un archivo dentro del a aplicación con extensión .RDLC. Esto nos indica que este informe es de tipo local, por lo que diseñar es casi igual que cuando creamos uno de tipo servidor.
La diferencia principal de uno y otro es que en el de tipo local, no podemos ver, escribir y retocar la fuente de datos como lo hacíamos en el de tipo servidor. Con lo que no podremos pasarle parámetros de la misma forma y ni con todas las otras ventajas. Tampoco trae la vista de preview, pero da igual porque con ejecutar este formulario veremos nuestro informe.

Aunque parece una desventaja, no siempre se necesita o se puede montar un servidor de IIS para ello. Y no por ello significa que no podamos trabajar cómodamente con fuentes de datos en nuestro informe.

Ahora para paliar los problemas de esta forma de trabajar, voy añadirle yo mi propia fuente de datos. Esta tiene que tener los mismos campos que se le pasan al informe para que no nos muestre error. Eso sí, una aclaración, si ponemos más campos de la cuenta no pasará nada, si ponemos campos de menos nos dará un error al cargar el informe.

Para utilizar el ejemplo de prueba que podéis descargar desde aquí, he utilizado la base de datos AventureWorks y en concreto la tabla Production.Product.
Cuando agregamos un nuevo informe al proyecto, este nos pide una fuente de datos y una/s tabla/as. Con esto nos creará una dataset que vinculado al informe, automáticamente vinculará al evento Load al crearlo, junto con otra línea que refresca el report. Estas líneas las quitaremos del evento por estas otras:

           DataSet ds = new DataSet();
           using (SqlConnection conexion =
                                 new SqlConnection("Nuestra conexión a la base de datos"))
            {
                using (SqlDataAdapter da =
                     new SqlDataAdapter("Select top (1) *  from production.product", conexion))
               {
                    da.Fill(ds);
                }
            }
            // Eliminamos las fuentes de datos para no crear una nueva. Si tenemos más, con
           // recorrerlas nos basta
            this.reportViewer1.LocalReport.DataSources.RemoveAt(0);
            // Creamos un nuevo datasource para nuestro informe y le
            // pasamos la tabla con los datos que queremos que se muestre.
            ReportDataSource datasource =
                      new ReportDataSource  ("AdventureWorksDataSet_Product", ds.Tables[0]);
            // Agregamos el datasource.
            this.reportViewer1.LocalReport.DataSources.Add(datasource);
            // Refrescamos el informe.
            this.reportViewer1.RefreshReport();

Bueno, lo que hacemos es traernos nuestro dataset con los datos que queremos para nuestro informe, luego borramos la asociación entre el informe y el dataset. Con esto nos evitamos que haya dos fuentes de datos, una la que ya hay al cargar el informe y otra la que agregaremos luego. Bueno, pues después tan sólo tenemos que crear una nueva fuente de datos con el dataset y agregarla al informe.
Por último se refresca el report y listo, ya tenemos nuestro informe listo para ejecutarse. Por último decir que este trozo de código, no tiene porque ir en el evento Load de nuestra aplicación, sino que se puede llamar desde cualquier otro evento o método. Con esto y nuestra imaginación, podemos hacer SQLs personalizadas y añadirles cuantos parámetros creemos oportunos :D.

Para poder trabajar con algunos objetos, necesitaremos importar el siguiente espacio de nombres: using Microsoft.Reporting.WinForms;

Espero que os sea de utilidad.

Un Saludo

Posted: 10/6/2008 20:47 por Fran Díaz | con 40 comment(s) |
Comparte este post:

Comentarios

Alberto ha opinado:

ole Fran! trabajito costó, verdad? pero ya por fin queda publicado para tenerlo como referencia, porque son pocas cosas las que hay que hacer, pero siempre se nos queda algo y nos atascamos.

Un saludo y come! y haz la cama! y limpia! jejeje (tú me entiendes)

# June 10, 2008 10:34 PM

Jaoquin ha opinado:

Muy buen Fran llevaba esperándolo ya bastante tiempo !! Buen apunte, lo probaré !!

# June 11, 2008 12:24 PM

Napoleon_5 ha opinado:

Bien fran, creo que vas muy bien, sin embargo creo que amuchos (quizas principiantes en esta herramienta, como yo), nos gustaria saber como pasarle parametros al Dataset que alimenta el reporte.

Por ejemplo, al hacer clic en un botón de una ventana, mandarle los valores de parametros declarados en la instruccion SQL, y que se cargue el informe (ya sea en otra ventana o desde un servidor de reportes)

Gracias... Espero ver un ejemplo de esto pronto.

# June 26, 2008 5:21 PM

Fran Díaz ha opinado:

Lo apuntaré para pendientes :)

Un Saludo

# July 1, 2008 9:02 AM

abi ha opinado:

hola! como puedo isntalar los adavances services con sql express y windows vista home premium, no logro instalar nada, me sale error de que no hay nada que instalar.

# July 6, 2008 4:26 AM

Rafael Giraldo ha opinado:

Hola Fran... quería comentar el siguiente problema que tengo: Estoy desarrollando una aplicación Web (con tres capas, vista, logica de negocio y acceso a datos). He empleado el control ReportViewer para visualizar un reporte. El asunto es que en ambiente de desarrollo, el reporte se genera correctamente, pero cuando publico la aplicación en el servidor, la aplicación ni siquiera carga el default.aspx. No obstante, si elimino del web.config, todas las referencias al ReportViewer, la aplicación carga y se muestra. La pregunta es, se necesitan dlls en el servidor de publicación para ver los reportes generados con el ReportViewer?... gracias por la ayuda que me puedas prestar

# October 21, 2008 4:26 PM

Pablo ha opinado:

Hola fran, estoy atascado con un problema. Tengo un reportviewer que contiene varios objetos con información que se extraen de una cadena de datos. Mi problema es que no quiero mostrar el reporte, sino que me lo descargue directmante en PDF. El problema que estoy teniendo, es que, si lo visualizo, anda barbaro y lo puedo descargar a PDF, pero cuando lo renderizo me devuelve un error de que no hay instancia para un datasource.

Tenes idea de lo que puede estar pasando?. Yo en el page_load hago el bind del reportviewer solo y lo muestra, cuando quiero renderizarlo para pasarlo a PDF y que lo descarga, se pincha.

Dejo mi email por si alguien tiene la solucion o me puede guiar para donde correr.

Gracias a todos.

Guillermo Pablo Medina.

guillermopmedina@gmail.com

# October 27, 2008 4:29 PM

reghyna ha opinado:

Hola ! Franz primero felicitarte por tus tutoriales sobre informes, y segundo consultarte sobre el tema: yo tengo una aplicacion que factura, la misma ya esta realizada mediante un informe local y visto en un reportViewer, congurando el origen de datos y la impresion desde codigo, en tiempo de ejecucion,( todo gracias tus blogs ) sin embargo aun tengo el problema con la configuracion de la factura, estas se imprimen en papeles pre impresos de un tamaño especifico (26 * 14), en mi informe tengo una tabla llenda por un dataset y debajo de ella tengo textbox con otros parametros. Cuando la tabla crece los textbox inferiores saltan de las dimensiones. que hago ?? puedes ayudarme ??

# October 31, 2008 4:53 PM

jose luis de figueiredo ha opinado:

hola como te va fran mirá esta interesante mi problema es el siguiente seguro de memoria, yo tengo un programa en visual studio 2008 y hago informes como el microsoft report bla bla bla bien la cosa es que hacer reportes estaticos es decir que siempre arrojan valores de una misma consulta es simple. lo que quiero saber es a ver si puedes darme una mano como hacer para que supongamos un reporte me tire una lista de productos donde la cantidad sea menor que un valor ingresado en un textbox por ejemplo. mi base de datos es de access y no tiene pass ni nada por el estilo por ahora. Espero que puedas ayudarme. Saludos

# November 3, 2008 6:02 AM

Roger ha opinado:

Hola Fran un favor es porsible hacer con un solo reportViewer presentar diferentes reportes es decir mediante cod asignar el reporte q yo desee presentar gracias

# November 14, 2008 5:50 PM

Carlos E. León ha opinado:

Hola quisiera ver si alguien me puede ayudar,  estoy intentando crear un reporte pero quiero cambiar la cadena de conexion en un archivo de esquema de un dataset que me crea el visual studio 2008 al crear el reporte, si logro modificar esa cadena en dicho archivo pero cuando lo modifica por alguna extraña razon, las variables de session se me vacían y hace tronar mi aplicacion por q utilizo esas variables para datos de usuario, y el timeout no es por q lo pongo a 30 minutos y solo me lo hace cuando ingreso a esa pagina.aspx carga el reporte y en ese momento me borra las variables, puedes ayudarme?

# January 12, 2009 5:47 PM

German ha opinado:

¿por que no funciona? segui el ejemplo.....

sSel = "SELECT Personal.Paterno, Personal.Materno, Personal.Nombres, Registros.Fecha, Registros.HoraEnt, Registros.HoraSal, Registros.Entro, Registros.Salio,Registros.Retardo, Conceptos.Descripcion AS Concepto, Registros.Observaciones FROM Registros INNER JOIN Personal ON Registros.Persona = Personal.Id INNER JOIN Conceptos ON Registros.Concepto = Conceptos.Concepto Where registros.fecha='" & Now.Date & "'"

       Dim cn As SqlConnection = New SqlConnection(sCnn)

       Dim da As SqlDataAdapter = New SqlDataAdapter(sSel, cn)

       Dim ds As New DataSet

       Try

           da.Fill(ds)

       Catch ex As Exception

           MsgBox(ex.Message)

       End Try

       Me.ReportViewer1.LocalReport.DataSources.RemoveAt(0)

       Dim rs As ReportDataSource = New ReportDataSource("rDiario", ds.Tables(0))

       Me.ReportViewer1.LocalReport.DataSources.Add(rs)

       Me.ReportViewer1.RefreshReport()

       Me.ReportViewer1.LocalReport.Refresh()

ayuda... eh leido y leido.... y nadamas nada! les agradezo de antemano

# January 19, 2009 7:17 PM

Sebastian ha opinado:

Muy buena información y muy útil, sin embargo tengo un problema extraño, tengo una página en la que puedo seleccionar entre tres informes para crear, luego de hacer uno, si quiero hacer otro, no aparece y se muestra el siguiente error: Error al procesar el informe. No se ha proporcionado una instancia para el origen de datos "dsCapitulos_Capitulos". este ds capítulos es la fuente del reporte pasado, es decir que no actualiza la ruta el reportviewer, pero hago un debug y el cambio de ruta se hace, sin embargo, si me paso otra seccion de la apliacion,  y vuelvo a donde estaba para generar informes, si selecciono la que no se pudo, lo hace. Cómo puedo solucionar ese problema?

# February 4, 2009 12:05 AM

juan carlos ha opinado:

Como puedo integrar graficos de barra que trabajen con los datos de la base?

Te felicito por tu trabajo

# March 27, 2009 4:11 PM

Fran Díaz ha opinado:

Hola,

cualquier duda al contacta por favor :).

Un Saludo a todos!!

# March 27, 2009 7:10 PM

Jose ha opinado:

Fran como estas? Excelente tu blog te felicito. El unico que contiene buena información de reporting services en español me ha servido bastante. He aprendido mucho

Te queria hacer una consulta. ¿Como puedo eliminar un informe mi servidor de informes?.

Por ejemplo tengo un informe con 1 parametro cargado a traves de un store procedure. Luego al store procedure le agrege un parametro mas pero no me refleja el cambio en la vista previa del informe.

Saludos

# May 8, 2009 10:32 PM

Fran Díaz ha opinado:

Hola,

Tan solo vete a tú report manager (http://{tuservidor}/reports) y elimínalo de allí ;).

Un Saludo

PD: Para cualquier consulta al contacta porfa, no suelo contestar por aquí...desde hace tiempo ;)

# May 11, 2009 8:53 AM

Cesar Muñoz ha opinado:

Hay manera de hacer lo mismo  q hace en el articulo pero para webforms ??

# May 18, 2009 3:59 AM

Fran Díaz ha opinado:

Claro!

# June 4, 2009 8:03 AM

Jesus Vargas ha opinado:

Hola que tal.

Ps te comento Fran, que tome el codigo

y lo implemente para un apliacion en visual studio 2005

estoy tratando de imprimir un reporte de una compra especificamente.

Solo que hay un pequeño problema cuando ejecuto la aplicacion todo bien

solo que cuando le doi al boton para que me muestre el genere el reporte obtengo este error.

"the source of the report definition has not been specified"

el codigo es este:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       'DataSet ds = new DataSet();

       Dim ds As New Data.DataSet

       'Dim SqlConnection As New SqlClient.SqlConnection("Server=(local); Database=Zapateria; Integrated Security=SSPI")

       Dim SqlConnection As New SqlConnection("Server=(local); Database=Zapateria; Integrated Security=SSPI")

       Dim da As New SqlDataAdapter("Select * From AuxReportePedido", SqlConnection)

       da.Fill(ds)

       'Me.ReportViewer1.LocalReport.DataSources.RemoveAt

       'Creamos un nuevo datasource para nuestro informe y le

       ' pasamos la tabla con los datos que queremos que se muestre.

       Dim datasource As New ReportDataSource("AuxReportePedido", ds.Tables(0))

       'Agregamos el datasource.

       Me.ReportViewer1.LocalReport.DataSources.Add(datasource)

       'Refrescamos el informe.

       Me.ReportViewer1.RefreshReport()

----------------GRACIAS DE ANTEMANO------------------

# June 9, 2009 9:58 AM

Fran Díaz ha opinado:

Hola,

Te respondo aquí: social.msdn.microsoft.com/.../threads

Un Saludo

# June 9, 2009 11:12 AM

Jesus Vargas ha opinado:

# June 9, 2009 9:28 PM

Meke ha opinado:

Felicitaciones!!!!, excelente

# July 3, 2009 8:35 PM

Johnny ha opinado:

Hola Fran mis más sinceras felicitaciones. He intentado descargar el código de este ejemplo y no he podido hacerlo, cuando le doy al enlace que dejastes para este fin me manda a esta pagina: http://onobanet.com/ Es correcto esto? si es asi, cómo lo descargo?

# July 29, 2009 7:01 AM

Boris ha opinado:

Hola Fran, He leido tus respuestas y son muy buenas, tengo una duda, como envio o lleno con Valores Depositados en variables, unas cajas de texto en un Report Viewer, tengo mas de 1 mes intentandolo y no he podidoo, Gracias

# August 11, 2009 8:28 PM

Fran Díaz ha opinado:

Hola,

Estoy respondiendo en la nueva categoría del foro de MSDN: Reportes.

Pásate por allí y lo vemos ;)

Enlace: social.msdn.microsoft.com/.../threads

Un Saludo

# August 12, 2009 8:24 AM

Salvador ha opinado:

Tengo un serio problema. no me aparaece en reportviewer y no lo puedo agregar desde mis componentes.. no esta.. q debo hacer>><<

# August 28, 2009 10:04 PM

Cristian ha opinado:

Hola, tengo una duda

en la cadena de

 ReportDataSource datasource =                      new ReportDataSource  ("AdventureWorksDataSet_Product", ds.Tables[0]);

que iria en reemplazo de "AdventureWorksDataSet_Product" si me conecto con Sql server 2005 y mi tabla se llama datos ??????

gracias

# September 4, 2009 10:22 PM

Daniel ha opinado:

Gracias por la información, sólo un apunte: la dirección para descargar el enlace ya no es correcta, pero buscando acabo de encontrarla (.es en vez de .com):

www.onobanet.es/.../SSRS_Local.zip

# December 12, 2009 9:55 AM

kiyodi ha opinado:

hola amigo espero y este bien mira lo que me super urge es saber si se puede generar un Reporting service (RS) sin estar conectado a una Base de Datos y que los datos los tome de la DataTable del aplicativo. se podra eso??

# July 8, 2010 8:25 PM

Fran Diaz ha opinado:

Si claro, tan solo pásale tu datatable ;)

Un Saludo!

# July 9, 2010 8:11 AM

Helen ha opinado:

No sé si igual hay un post distinto sobre esto pero en mi informe sin servidor, en un rdcl, ¿se pueden poner pies de informe? necesito mostrar unos datos únicamente al pie de la última página. Y lo que me ofrece reportviewer es poner pie en todas las páginas o si quiero, ocultarlo en la primera y/o en la última. Y yo quiero lo contrario, mostrarlo sólo en la última. Esto en Crystal era un pie de grupo o pie de informe. ¿Ha desaparecido esto para los rdcl?

Mil millones de gracias de antemano.

# September 28, 2010 11:02 AM

Helen ha opinado:

Buenos días:

Soy Helen otra vez y con la misma pregunta. Sigo buscando por la red pero nadie tiene respuesta. Por favor, me podríais echar una mano? Aunque sea diciéndome a quién a o a dónde dirigirme si no es en este blog. Por favor. La verdad es que el asunto se me está volviendo algo urgentillo... tenemos que entregar proyecto a finales de octubre y en nuestros informes aún no sabemos poner un pie de informe ni siquiera sabemos si esto puede hacerse o ya no.

Por si acaso recuerdo mi consulta:

"¿se pueden poner pies de informe? necesito mostrar unos datos únicamente al pie de la última página. Y lo que me ofrece reportviewer es poner pie en todas las páginas o si quiero, ocultarlo en la primera y/o en la última. Y yo quiero lo contrario, mostrarlo sólo en la última. Esto en Crystal era un pie de grupo o pie de informe. ¿Ha desaparecido esto para los rdcl?"

Muchas gracias de nuevo

Helen

# October 18, 2010 1:27 PM

Javier Torrecilla ha opinado:

@Helen, prueba a formular tu pregunta aqui: social.msdn.microsoft.com/.../threads

# October 18, 2010 3:54 PM

Helen ha opinado:

Mil gracias, Javier!!!

A ver qué me dicen.

# October 22, 2010 1:17 PM

Fran Díaz ha opinado:

Buenas Helen,

Hace tiempo que no respondo los comentarios y siento mucho esto... :(.

¿Tienes una tabla en tu report? Puedes poner la info en el total de dicha tabla (propiedades y ahí puedes añadir tu total)

De lo contrario, ¿que tienes en tu report?

Saludos!

# October 27, 2010 11:31 PM

José Oviedo ha opinado:

 Amigo Fran Díaz, se que ya te lo han dicho muchísimas veces, pero de verdad que gran aporte tus post, a mi me ahorraron muchísimo tiempo de investigación, de prueba y de errores. Excelente tu labor desinteresada. Gracias a personas como tu el mundo cada vez es mejor!!!

# December 5, 2010 1:15 AM

Jairo Nova ha opinado:

Buenas tardes Fran, estoy trabanjado en un desarrollo en .net y tengo problemas con la generacion de informes, ya que me gustaria generar el dataset dinamicamente, intente buscar tu ejemplo y no lo he logrado conseguir, sera mucha molestia si me indicas de donde lo puedo bajar o si me lo puedes enviar a mi correo (jairo.nova@hotmail.com), que pena el atrevimiento pero no lo he logrado localizar, saludos

# February 7, 2011 11:27 PM

Cristian Miranda ha opinado:

Lo que sucede es que tengo que haecr un reporte con sub reporte y al momento de mostrar el reporte (ReportViewer), me dice. no se puede mostrar el informe integrado....

tengo una duda con respectos a los parametros del informe integrado y del informe el cual es llamado por el informe integrado. por favor...

si es posible que me expliquen super claramente como hacer un sub reporte muy simple.

# February 15, 2011 7:21 PM

carlos Azabache ha opinado:

perfecto, pero ahora como hago esto

"traernos nuestro dataset con los datos que queremos para nuestro informe, luego borramos la asociación entre el informe y el dataset. Con esto nos evitamos que haya dos fuentes de datos, una la que ya hay al cargar el informe y otra la que agregaremos luego"

cabe mencionar que es un dataset elaborado el que voy a cargar ... Agradeceria mucho que alguien me ayude con este problema

# July 15, 2011 10:25 PM