[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

Sin categoría

40 thoughts on “[How To] Reporting Services sin IIS y sin servidor de informes

  1. 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)

  2. 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.

  3. 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.

  4. 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

  5. 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

  6. 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 ??

  7. 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

  8. 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

  9. 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?

  10. ¿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

  11. 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?

  12. 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

  13. 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 😉

  14. 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——————

  15. 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?

  16. 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

  17. 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

  18. 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??

  19. 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.

  20. 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

  21. 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!

  22. 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!!!

  23. 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

  24. 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.

  25. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *