Construyendo Reportes Para Aplicaciones Web: Parte 1

Muchas veces nos encontramos realizando sistemas de información que se dedican a capturar datos pero que también necesitan una manera de procesarlos y mostrarlos. Para esta tarea entran en juego los famosos Reportes que no son más que objetos que entregan información en un formato particular y que permiten realizar ciertas operaciones como imprimirlos, enviarlos por email, guardarlos a un archivo, etc.

Es importante mencionar que los datos almacenados son útiles en la misma medida que se puedan convertir en información para las personas que los necesitan. También es importante subrayar que la plataforma tecnológica que utilicemos debe poder tener facilidades para convertir los datos en información y poder entregarlos a los usuarios de forma que sean útiles.

Pues bien, el caso es que el .net Framework no es la excepción. Al instalar cualquiera de los productos, desde las versiones express hasta la versión TeamSuite podemos realizar reportes y presentarlos a los usuarios para que puedan utilizar la preciada información.

Primero debemos entender que estamos haciendo y porqué. El caso es el siguiente, por lo regular, un reporte será impreso en hojas de papel con un tamaño específico, esto nos lleva al primer desafío, tenemos que poder entregar información que quepa dentro de estas hojas de papel y que pueda ser impreso sin problemas a una impresora local o remota. El segundo desafío es poder realizar esta operación desde una aplicación web; pero ¿Cuál es el problema aquí? Pues muy sencillo, lo que sucede es que una página web es un objeto que tiene un despliegue único, es decir, todos los datos se muestran en una “tira” continua de información lo que hace difícil sino imposible hacer que la impresión sea consistente y predecible. El tercer desafío es poder hacer que la solución sea utilizable para “cualquier navegador” lo que en si es todo un reto.

Entonces, la solución que encontramos en el .net Framework es la del objeto Microsoft.ReportViewer.WebForms. Este objeto nos permite realizar todas las operaciones descritas con anterioridad y permite también superar los desafíos planteados.

En primer lugar, debemos decir que un reporte en una aplicación web se compone de 4 partes principales: 1) Un documento reporte. 2) Un objeto ReportViewer. 3) Una fuente de datos. 4) Una página que permita mostrar al ReportViewer.

Entonces, manos a la obra. Hagamos un reporte que: pueda controlar los saltos de página por medio de una configuración de tamaño de papel, tenga una forma de imprimir correctamente la información y sea “crossbrowser” (pueda ser visto en cualquier navegador).

Inicialmente debemos crear una aplicación web (o website si lo prefieren) y para ello vamos a Visual Studio 2008 y seleccionamos el tipo de proyecto que nos interesa:

Proyectoweb

Esto creará una estructura similar a la siguiente:

EstructuraProyecto

Al abrir la página Default.aspx ubicaremos un objeto Microsoft.ReportViewer.WebForm en ella y quedará de la siguiente forma:

ReportViewer

Ahora ya tenemos dos de las cuatro cosas necesarias para el reporte, vamos por la tercera. Es necesario crear un documento de reporte que contenga la definición de los datos que quiero mostrar.

El ejemplo que voy a demostrar utilizará la base de datos Northwind y los datos almacenados en las tablas dbo.Orders y dbo.Order Details. En esta primera parte solamente veremos la tabla dbo.Orders y dejaremos la otra tabla para las siguientes partes de este artículo.

Entonces es necesario agregar un documento reporte a nuestra solución de la siguiente forma. El nombre del documento será Ordenes.rdlc :

Report

Esto nos presentará la siguiente ventana en Visual Studio:

ReportWindow

Ahora es necesario decirle al reporte que datos quiero que muestre, para ello agregamos un Data Source hacia SQL Server por medio de Server Explorer y seleccionamos la base de datos Northwind, lo que debería mostrar la siguiente información:

ServerExplorer

Luego al crear el nuevo Data Source tenemos que se creó en realidad un objeto DataSet, el cual tendrá la definición de nuestros objetos de datos. Entonces solamente arrastramos del Server Explorer las tablas que nos interesan hacia el objeto DataSet. En este caso es dbo.Orders. Una vez grabado el DataSet, en la ventana de Website Data Sources se mostrará la tabla y los campos disponibles.

DataSet1

Ahora agregamos un objeto List a nuestro reporte para que contenga los datos de la tabla:

List

Y por último arrastramos los campos que queremos de nuestra tabla hacia el objeto list. Para nuestro ejemplo y con fines ilustrativos solamente arrastraremos 4 campos: OrderID, OrderDate, ShipName, ShipCity. También agregaremos unas etiquetas para saber de qué datos estamos hablando. Cabe mencionar que el documento report no tiene Labels como los conocemos para esta tarea así que tendremos que utilizar TextBoxes para poder poner títulos a los campos:

Fields

Bien, grabamos nuestro reporte y nos pasamos a la página Default.aspx que es donde tenemos nuestro objeto ReportViewer y ahora le decimos que utilice el reporte que recién acabamos de crear:

ChooseReport

El seleccionar el reporte debe haber creado también en la página un objeto ObjectDataSource que será el encargado de la tubería de información entre la fuente de datos (DataSet1) y el ReportViewer; y con esto tenemos ya las 4 cosas necesarias para correr el reporte. Ahora podemos ejecutar nuestra aplicación y ver cómo funciona el reporte:

WorkingReport

Aquí podemos ver claramente en la página que el reporte funciona correctamente, tiene 76 páginas y se muestra con un zoom de 100%.

Espero que este artículo les sirva, seguramente se encontrarán con alguna necesidad para utilizar estos objetos y ojalá les ayude a lograr su cometido.

Espero vean los siguientes artículos relacionados:

  • Parte 2: Reportes por código y paso de parámetros
  • Parte 3: Subreportes

Hasta la próxima.

27 Comments

  • Buenos dias:

    El boton de impresion en visual studio 2005 no aparece. Seria bueno especificar como imprimir reportes web en vb 2005.

    Gracias.

  • Buenas Jose,

    pasa q mi origen de datos en el dataset es un procedimiento almacenado, entonces creo un tablaadapter y lo llemo con el procedimiento almacendo, pero al enlazar mi ReportViewer al Reporte me crea 3 ObjectDataSource, se me imagina q lo hace por q este procedimeinto almacenado trae datos de 2 tablas y crea una tercera(TablaAdapter), se debera a esto y me da un error al ejecutar el ReportViewer.

    Error al procesar el informe.
    No se pudo encontrar el tipo especificado en la propiedad TypeName de ObjectDataSource 'ObjectDataSource1'.

    estas son las propiedades TyprName de cada ObjectDataSource

    ObjectDataSource1 = VetoNet.DataSet1TableAdapters.Guia_LaboratorioTableAdapter
    ObjectDataSource2 = VetoNet.DataSet1TableAdapters.Item_LaboratorioTableAdapter
    ObjectDataSource3 = VetoNet.DataSet1TableAdapters.ReporteGuiaLaboratorioTableAdapter

    donde Guia_Laboratorio e Item_Laboratorio son tablas q uno el procedimiento almacenado y ReporteGuiaLaboratorio es mi Procedimiento Almacenado.

    gracias por la ayuda...

    Enzo


  • Hola Enzo.

    Definitivamente el stored procedure generara mas objetos que un SELECT comun y corriente.

    Mi recomendacion seria que hagas un DataSet dentro de tu proyecto que haga la llamada al stored procedure y luego enlaces ese DataSet al reporte.

    Saludos.
    Jose Guay

  • Hola!!

    Oye he intentado seguir el ejemplo que pones aqui, pero me quedo atrancada en una parte...
    Resulta que tengo la version express de .net, y no me aparece la opción "Report", para agregar el documento reporte...
    Puedes ayudarme con eso, Por favor!!!

    Te agradezco!!

    Estefania

  • Hola José
    muy buen turorial, lo hice pero tengo problemas al momento de ver reporte me muestra el siguiente error en el explorador

    "Error al procesar el informe.
    Se produjo una excepción en el destino de la invocación.
    Error de inicio de sesión del usuario 'sa'. "

    sabes a que se debe y como puedo solucionarlo, gracias por adelantado.

    Jaime

  • @Jaime: tienes un problema de conexion con la base de datos, debes crear un usuario (login) de SQL Server con permisos para leer datos en la base de datos Northwind (o la base de datos que sea que estes usando). Luego modificar tu string de conexion para que use este usuario y su contrasena. Eso es todo.

    Saludos y gracias!

  • Hola Jose

    Soy nueva en esto y he seguido tu ejemplo y todo sale bien, pero he querido hacerlo con un store procedure y en el dataset no me muestra las columnas que regresa el store. el store crea una tabla temporal y procesa datos y al final el select es de dicha tabla temporal.
    Me podrias ayudar para poder hacer el reporte

    Gracias

  • @Esther.
    Realmente no se como ayudarte. Si ejecutas tu stored procedure dentro de SQL Server Management Studio funciona bien? Devuelve la informacion como lo necesitas?

    Si es asi, entonces no debe haber problemas con el dataset. La diferencia en el dataset es que debes seleccionar para el DataAdapter el stored procedure de la base de datos y no una tabla o query.

    Espero te ayude.

  • Si el store me devuelve la informacion bien en el SQL Server Managment Studio.
    En el dataset si seleccion el store y todo pero ps como en ese store creo tablas temporales y el select final del store es de la tabla temporal.
    Me marca un warning:
    The wizard detected the following when configuring the tableAdapter: "Pr_Eca_Reporte":

    Details:
    Generated SELECT statement.
    Invalid object name '#Tmp_Reporte'

  • Es muy buen artículo y me ha servido para crear muchos reportes, me podrías indicar como puedo configurar el reporting services, porque cada vez que envío a cargar un reporte me aparece una pantalla de autenticación, donde ingreso el nombre y pass del administrador. Pero esto no puede continuar así porque tengo que publicar el sistema en el hosting y ahí también me pide nombre y pass.

    Por favor cualquier ayuda sería muy importante para mi.

  • ya realice los mismos pasos pero al momento de ejecutar carga la página, muestra el marco del reporte pero no jala los datos de la base de datos que puedo hacer???

  • Simplemente genial, he buscado y buscado algún ejemplo claro y sencillo de seguir para hacer reportes en Web, y este es una muy buena base, gracias!!!... :)

  • Hola, yo tengo instalado en visual studio 2008 express y visual basic 2008 express, pero busco en visual studio las opciones para crear un proyecto de informes .rdlc y no lo encuentro solo me da opcion de crear proyecto de servidor de informes y eso me crea archivos .rdl. Alguien puede decirme porque no puedo crear en mi visual los .rdlc???? será porque es express????? Gracias

  • @erika: no debes buscar un proyecto de informes. Es un documento de informes, haces un click derecho sobre el nombre de tu proyecto web y agregas un nuevo elemento, en la lista buscas el informe .rdlc.

  • Hola, espero me puedan ayudar, dese crear una aplicacion web, osea en asp, pero no me aparece la plantilla de aplicacion paa web al momento de crear el proyecto nuevo no se si me puedan ayudar, si se pueda descargar y si saben en donde o que onda porfavor espero su ayuda
    Gracias

  • Muy buen tutorial, ya realicé todo tal cual describes en él, pero cuando ejecuto la aplicacion me arrja un error que dice: Se ha quitado el recurso que está buscando, se le ha cambiado el nombre o no está disponible en estos momentos. Y ya revicé todo y los archivos estan y todo normal, no sé que será, te agradezco cualquier ayuda. gracias.

  • Muy buenas a todos. Muchas gracias por todos los aportes. Excelente material. Me ha sido muy útil para obtener reportes de buena calidad dentro de un proyecto que estoy desarrollando. No obstante no he conseguido que aparezca el icono de imprimir directamente sin necesidad de exportar el reporte. Conmigo son cuatro las personas que han expuesto el mismo caso, pero aun no hay claridad al respecto. Estoy usando el IEXPLORE 8.0, pero aun así, nada.
    :-S

  • Hola Jose
    Soy nuevo en este, y tengo una pregunta estoy trabajando en visual 2005 y oracle, al momento de crear el dataset con el tableadapter solo me deja escoger la parte de consulta con select la parte de procedimientos almacenados u creaion de estos me aparece deshabilitado, me podrias ayudar.
    Ademas con el ejemplo completo enviandomelo al correo si no es mucha molestia, mi correo es oleon@solucionesbolivar.com

  • Hola, espero puedan apoyarme.
    Deseo hacer un reporte por ejemplo que muestre un encabezado con el nombre del cliente y abajo una tabla con las compras de ese cliente.
    El detalle es que deseo que imprima una hoja por cada cliente. mas bien habra un encabezado por cada cliente y abajo la informacion (no importa cuantas hojas sean) pero por cada cliente haga un breakePage
    Espero su ayuda.... Gracias

  • Gracias por la ayuda, se lee bastante claro, espero probarlo y comentar que tal. Gracias desde Honduras

  • Hola, muy buen artículo, pero tengo un problema al crear un dataset seleccionando un procedimiento almacenado que regresa una tabla temporal, no me aparece el procedimiento almacenado, es decir, en la pantalla para seleccionar SP, aparece y lo marco, pero al momento de dar Terminar, pues no muestra nada! Cambie el código del sp con un simple select * from tblRegiones y funciona... estoy intentango conectar por código y no logro hacerlo funcionar...¿tendrás algun ejemplo pero usando un SP con tablas temporales ?

    Gracias!!

  • Hola queria saber como se puede hacer para que el reporte ocupe todo el tamaño de la pagina del explorador y para controlar el formato al que se exporta
    Gracias

  • Disculpa, pero me genera un error de este tipo:

    Microsoft.Reporting.WebForms.ScriptManagerNotFoundException: El control web del visor de informes requiere un System.Web.UI.ScriptManager en el formulario web.

    y no se que pueda ser. Ya importe algo asi: Imports System.Web.UI.ScriptManager pero tal vez no va por ahi. Podrias ayudarme con esa parte

  • bueno ya lo solucione agregando este tag:

    al contentmain

  • ya pude solucionar el problema. Pero ahora por que razon no me aparecerá el boton de imprimirlo. Acaso tengo que activarlo desde algun lugar. Revise en sus propiedades del reporte viewer y si esta en true lo de visualizar el boton de imprimir. Que podría ser.

    Nota:Utiliza Visual Studio 2010

  • Buenas tardes, ¿por qué me puede salir este error al ejecutar un report?
    <>

    ¿¿¿Puede ser que mi solución esté accediendo a sql2008 y que el servidor de reporting sea 2005???

    gracias

  • HOLA JOSE.

    ME GUSTARIA SABER COMO DEFINIR PROGRAMATICAMENTE EN OBJECTODATASOURCE LA SECCION YA QUE TENGO UN METODO QUE RECIBE COMO PARAMETRO UNA LISTA

    GRACIAS













Comments have been disabled for this content.