TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 85
Al final se obtiene el ejemplo funcionando, el código de este ejemplo ha sido adjuntado a la
carpeta “Ejemplos” incluida en la carpeta de este manual.
4.3.- Creación de reportes.
Cuando una organización desarrolladora de software implementa una solución a una necesidad
especifica de un cliente. Entrega un producto final como resultado del proyecto que cumple los
requerimientos del cliente.
Uno de los requerimientos del cliente es que el sistema software tenga la capacidad de arrojar
información relevante y relativamente útil proveniente de una fuente de datos y tenerla disponible
en el momento requerido.
Esta información por lo general suele ser información estadística.
La información arrojada debe convertirse en un documento llamado Reporte o informe.
La función del usuario final es realizar su labor cotidiana apoyándose en la nueva herramienta que
se le ha proporcionado.
Img. 4.3.1.- Aplicación funcional con la que interactúa el usuario.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 86
Durante la interacción con la aplicación, el usuario elige guardar la información para continuar con
su labor.
Confirmando el servicio y guardar cambios:
La información es almacenada en la fuente de datos del sistema, desde la cual podrá ser
recuperada y reutilizada.
La información almacenada está organizada en distintas tablas relacionadas.
Img. 4.3.2.- Aplicación funcional con la que interactúa el usuario.
Img. 4.3.3.- Tabla “Pacientes” de la aplicación.
Img. 4.3.4.- Tabla “Estudios” de la aplicación.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 87
Muestra los servicios que han sido registrados:
Sin importar como el sistema almacena, organiza y procesa la información para generar el
resultado final, lo que quiere el usuario es visualizar la información lista para ser impresa o
guardada como documento.
¿Qué hacen los desarrolladores?
La organización desarrolladora de software utiliza herramientas e implementa mecanismos que le
permitan obtener los datos y generar el informe.
Consultas.
Vistas
Procedimientos almacenados.
Métodos
Img. 4.3.5.- Tabla “Servicios Registrados” de la aplicación.
Img. 4.3.6.- Visualización de reportes.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 88
Herramientas para Diseñar y generar informes.
o Crystal Reports (pago).
o Report Document (Visual Studio)
o JasperReport (libre)
Crear los informes en Visual Studio.
Microsoft Visual Studio 2010 incluye la funcionalidad de diseño de informes y los controles
ReportViewer, que le permiten agregar informes con todas las características a las aplicaciones
personalizadas. Los informes pueden contener datos tabulares, agregados y multidimensionales.
Los controles ReportViewer le permitirán procesar y mostrar el informe en la aplicación. Hay dos
versiones del control.
Para utilizar un control ReportViewer en la aplicación, debe saber cómo agregar el control al
formulario del proyecto, configurar el control para utilizar una definición de informe local o informe
de servidor, actualizar las referencias de orígenes de datos y comprobar e implementar los
informes y el control en la aplicación. Para obtener toda la información referente a la creación y
visualización de informes, consulte http://msdn.microsoft.com/es-
es/library/ms251671%28v=VS.100%29.aspx
Modificaremos el ejemplo de autos, propietarios y marcas, para lo cual queremos imprimir en un
reporte el contenido del datagridview (los datos que se muestran como resultado de crear tipos
anónimos).
Los reportes no aceptan tipos anónimos y mucho menos las propiedades de navegación que
tenemos en el modelo, eso impedirá que nuestro informe muestre los datos que deseamos.
La solución es crear Vistas y Procedimientos almacenados en nuestra base de datos e importarlos
a nuestro modelo.
La vista podemos utilizarla también para cargar los datos en el datagridview y llenar el informe al
mismo tiempo, y el procedimiento almacenado para recuperar datos específicos y utilizarlo para
llenar el informe.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 89
Otra solución para llenar el informe sería crear nuestras propias clases con las propiedades
necesarias y crear colecciones de objetos de estas clases y pasarlas al datasource del informe.
Crear una vista en la BD desde visual studio.
Abra la base de datos en el explorador de servidores y sobre vistas, haga clic derecho y
seleccione agregar nueva vista.
La vista debe devolver Número de Serie del auto, nombre de la Marca, Modelo, Color y nombre
del Propietario.
El código SQL de la vista creada es el siguiente:
SELECT dbo.Auto.NoSerie, dbo.Marca.Nombre AS Marca, dbo.Auto.Modelo, dbo.Auto.Color, dbo.Propietario.Nombre + ' ' + dbo.Propietario.Apellidos AS Propietario FROM dbo.Auto INNER JOIN dbo.Marca ON dbo.Auto.IdMarca = dbo.Marca.IdMarca INNER JOIN dbo.Propietario ON dbo.Auto.IdPropietario = dbo.Propietario.Id Guarde la vista como vAuto.
Crear un procedimiento almacenado en la BD desde visual studio.
En el explorador de servidores y sobre procedimientos almacenados, haga clic derecho y
seleccione agregar nuevo procedimiento almacenado.
El código sql para campos a devolver por el procedimiento almacenado serán los mismos que los
de la vista.
El código SQL quedará así: CREATE PROCEDURE dbo.SPAutos ( @marca varchar(50) ) AS SELECT Auto.NoSerie, Marca.Nombre AS Marca, Auto.Modelo, Auto.Color, Propietario.Nombre + ' ' + Propietario.Apellidos AS Propietario FROM Auto INNER JOIN
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 90
Marca ON Auto.IdMarca = Marca.IdMarca INNER JOIN Propietario ON Auto.IdPropietario = Propietario.Id WHERE (Marca.Nombre = @marca) RETURN
Guarde el procedimiento almacenado y cierre las pestañas correspondientes.
Actualizar el modelo.
Los nuevos elementos deben ser agregados a nuestro modelo, para ello, en el explorador de
soluciones abra el archivo Modelo.edmx, visualizara el diseño del modelo.
Haga clic derecho sobre cualquier área del modelo y seleccione Actualizar modelo desde base
de datos.
Aparecerá el asistente, seleccione los nuevos elementos a agregar (en la pestaña Agregar, utilice
Actualizar o Eliminar para realizar las acciones correspondientes) y seleccione Finalizar.
Img. 4.3.7.- Actualizar modelo.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 91
El modelo actualizado quedará de esta forma:
En el modelo observamos que la vista es agregada como una nueva entidad (nueva clase), pero
el procedimiento almacenado no aparece; los procedimientos almacenados no crean nuevas
entidades, los procedimientos almacenados deben importarse como funciones en el modelo.
Importar procedimientos almacenados como función.
Abra el explorador de modelos (botón derecho sobre cualquier área del modelo / Explorador de
modelos).
Expanda el nodo Procedimientos almacenados.
Haga clic derecho sobre el procedimiento almacenado a importar y seleccione Agregar
importación de función.
Img. 4.3.8.- Modelo actualizado.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 92
Agregando funciones:
En la ventana que se muestra:
En Nombre de la importación de función: nombre de la función que existirá en el modelo,
nombre con el cual deberá ser invocado el procedimiento almacenado.
Para ver los campos que devuelve el procedimiento almacenado, haga clic en Obtener
información de función de columna.
En la ventana aparecerán los datos de los campos que devuelve el SP.
Puede crear una nueva clase con las propiedades especificadas como campos del SP, para ello
haga clic en Crear nuevo tipo complejo, el nombre especificado en Complejo será el nombre de
la nueva clase.
Img. 4.3.9.- Explorador de modelos.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 93
Para terminar la importación, haga clic en Finalizar.
Ya con la vista y el procedimiento almacenado en nuestro modelo, guarde los cambios y cierre el
modelo, ahora procedemos a diseñar nuestros informes.
Crear formulario donde se mostrará el informe.
Agregue un nuevo formulario llamado InformeFrm al cual debe agregar el control ReportViewer.
Img. 4.3.10.- Importar procedimiento almacenado como función.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 94
Aplicando informes:
Agregue un nuevo elemento “Informe” al proyecto.
Se mostrará el diseñador de informes donde empezaremos a agregar elementos al diseño.
Img. 4.3.11.- Formulario que mostrará el informe.
Img. 4.3.12.- Agregar un elemento Informe al proyecto.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 95
Se debe configurar la fuente de datos del informe, para
ello, en la ventana “Datos del informe” elija Nuevo /
Conjunto de datos.
Se abrirá la ventana de configuración de la fuente de datos, en la cual especificamos el nombre
del DataSet para nuestro informe, en origen de datos, mostrará como única opción el nombre de
nuestra conexión de base de datos “BaseDatosEntities”, al seleccionarla en conjunto de datos
disponibles localizaremos el nombre de la clase que contiene las propiedades que deseamos
incluir en nuestro informe.
Si en origen de datos se encuentra vacío o el nombre de la clase que buscamos no se encuentra,
deberemos configurar un nuevo origen de datos, para ello:
Haga clic en nuevo, se mostrará el asistente de origen de datos.
Seleccionamos Objeto y damos clic en Siguiente.
Expanda el nombre del proyecto.
o Expanda el espacio de nombres en el que se encuentra la clase.
o Seleccione la clase que contiene las propiedades que deseamos incluir en nuestro
informe (El nombre de nuestra vista vAuto).
Img. 4.3.13.- Datos de informe.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 96
Seleccionando objetos:
Haga clic en Finalizar. Veremos ahora el conjunto de datos seleccionado y el nombre de la clase como conjunto de
datos.
Haga clic en Finalizar.
Img. 4.3.14.- Localizar la clase para utilizar como origen de datos.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 97
Propiedades del conjunto de datos:
Agregue una nueva tabla al diseño del informe, arrastre los campos de Datos informe a las
columnas de la tabla.
Puede agregar encabezado y pié de página para el informe, agregar título, y campos especiales en el informe. Guarde los cambios en el diseño y cierre el diseño del informe.
Img. 4.3.15.- Localizar la clase para utilizar como origen de datos.
Img. 4.3.16.- Diseñar el informe.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 98
Vuelva al formulario que contiene el ReportViewer y asigne el informe creado.
Al asignar el informe, en el formulario se creará un nuevo elemento vAutoBindingSource el cual
contiene una propiedad DataSource al cual debemos asignar la lista de elementos que deben
cargarse en el informe.
Para acceder al elemento vAutoBindingSource desde cualquier clase, cambie su nivel de
accesibilidad a público.
Ahora en nuestro formulario ListaAutosFrm, agregaremos un botón llamado ImprimirBtn.
Img. 4.3.17.- Asignar el informe al ReportViewer.
Img. 4.3.18.- Cambiar el modificador de acceso.
Img. 4.3.19.- Agregar botón imprimir al formulario.
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 99
En nuestra clase ListaAutosFrm, debemos crear un campo que almacene un objeto de la clase
InformeFrm (Formulario que mostrará el informe)
publicpartialclassListaAutosFrm : Form { BaseDatosEntities BD = newBaseDatosEntities(); privateInformeFrm informe = newInformeFrm();
Modificar nuestro métodollamado CargarLista() para que deje de utilizar tipos anónimos y ahora
utilice nuestra vista vAuto y la misma vista llene el informe.
privatevoid CargarLista() { //sincronizar nuestro modelo de datos cargado en memoria //con la base de datos volviendo a inicializar el objeto BD = newBaseDatosEntities(); //limpiar la fuente de datos del datagridview this.ListaDtg.DataSource = null; //cargar los resultados de la vista al grid this.ListaDtg.DataSource = BD.vAuto; //limpiar los datos del informe this.informe.vAutoBindingSource.DataSource = null; //volver a cargar la lista al informe this.informe.vAutoBindingSource.DataSource = BD.vAuto.ToList(); }
Modificar también el código de nuestro combobox, pero este debe cargar la lista de autos
correspondientes a la marca seleccionada con los resultados del procedimiento almacenado.
privatevoid PorMarcaCmb_SelectedValueChanged(object sender, EventArgs e) { if (datoscargados) { if(this.PorMarcaCmb.Text.Trim() == "Todas") { CargarLista(); } else { this.ListaDtg.DataSource = null; //cargar la lista de los autos de la marca seleccionada //invocando al procedimiento almacenado this.ListaDtg.DataSource = BD.SPAutos(this.PorMarcaCmb.Text.Trim());
TECNOLOGÍAS DE LA INFORMACIÓN ÁREA
SISTEMAS INFORMÁTICOS
Desarrollo de Aplicaciones I
Ing. Alfonso Felipe Lima Cortés | Mtra. Verónica Gutiérrez Ocampo 100
//limpiar los datos del informe this.informe.vAutoBindingSource.DataSource = null; //cargar tambien la lista al informe this.informe.vAutoBindingSource.DataSource =
BD.SPAutos(this.PorMarcaCmb.Text.Trim()).ToList(); } } }
Los resultados del SP son pasados también al informe ya que los campos devueltos por la vista y
el sp son los mismos, de lo contrario se tendría un error.
Ahora solo nos falta programar el botón ImprimirBtn para que muestre el reporte.
privatevoid ImprimirBtn_Click(object sender, EventArgs e) { informe.ShowDialog(); }
Comprobando la funcionalidad.
Agregue nuevos registros, y pruebe con Imprimir seleccionando alguna marca o todas las marcas.
Img. 4.3.20.- Resultado final del informe.