Citation preview

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 481 -

7 CREANDO REPORTES DE DATOS 1. Trabajando con Impresiones mediante Drawing Para habilitar la impresión de reportes desde el .NET Framework hay que usar el Namespace System.Drawing.Printing que contiene objetos útiles para manejar tareas de impresión. 1.1. Usando el Objeto de Impresión El objeto de impresión permite crear un documento a imprimir, configurar sus características, enlazarlo a controles o diálogos para realizar su presentación preliminar (preview) y finalmente habilita la impresión. 1.1.1. Clase PrintDocument La clase PrintDocument es la que permite crear el objeto de impresión, por lo cual describimos sus principales características: ♦ Propiedades ♦ Métodos ♦ Eventos 1.1.2. Creando las Páginas del Documento a Imprimir 1.1.3. Realizando un Preview con el PrintPreviewControl Una vez construido el documento a imprimir en el evento PrintPage, lo que sigue es realizar la presentación preliminar del documento (Preview). Esta se puede hacer de dos formas: • Usando un control (PrintPreviewControl). • Usando un diálogo (PrintPreviewDialog). 1.1.4. Imprimiendo el Documento Después de crear el documento y realizar la presentación preliminar el siguiente paso es imprimirlo, para lo cual se hace uso del método Print del objeto PrintDocument, pdt.Print() Ejemplo 1. (Demo 65 simplificado) crear una página a imprimir con un simple mensaje mediante el objeto PrintDocument y realizar un preview de ésta mediante el control PrintPreviewControl. El ejemplo trabaja con un simple formulario conteniendo un texto y dos botones donde se debe ingresar un mensaje, el cual se puede ver como saldrá impreso mediante el botón "Preview" o imprimir mediante el botón "Print".

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 482 -

1. En el diseñador de formularios Windows, arrastrar 1 control Label, 1 TextBox, 2 Button y 1 PrintDocument, luego configurar las propiedades, tal como se muestra en el siguiente cuadro: Objeto Form1 Label1 TextBox1 Button1 Button2 PrintDocument

Propiedad Text Text Multiline Tex Name Text Name Text Name

Valor Impresiòn en .NET con Drawing Mensaje a imprimir true btnPreview Preview btnPrint Print PrintDocument1

2. Escribir un texto cualquiera en el cuadro de texto y clic en el botón "Preview" para ver como aparecerá la salida.

Advertencia: Si no tiene impresoras instaladas se generará una Excepción al mostrar el

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 483 -

Preview o mandar a imprimir. 3. Cierre la ventana del Preview y luego si tiene una impresora instalada clic en el botón "Print" para realizar la impresión. CODIGO DE FORMULARIO Public Class Form1 Inherits System.Windows.Forms.Form Private Sub CrearPaginaImprimir(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Brocha As New SolidBrush(TextBox1.ForeColor) Dim X As Integer = e.MarginBounds.Left Dim Y As Integer = e.MarginBounds.Top With e.Graphics .DrawString(TextBox1.Text, TextBox1.Font, Brocha, X, Y) End With End Sub Private Sub PreviewConControl(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click Dim ppcMensaje As New PrintPreviewControl() With ppcMensaje .Document = PrintDocument1 .Dock = DockStyle.Fill .Zoom = 2 End With Dim frmPreview As New Form() With frmPreview .Controls.Add(ppcMensaje) .Text = "Preview con el PrintPreviewControl" .WindowState = FormWindowState.Maximized .ShowDialog() End With End Sub Private Sub ImprimirDocumento(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click PrintDocument1.Print() End Sub End Class TAREA Modifque otras propiedades del preview por ejemplo, como imprimir valores de un cuadro de lista o estos valores .Dock = DockStyle.Left .Zoom = 10 Dim Brocha As New SolidBrush(Color.FromArgb(255, 0, 0)) Ejemplo 2 .- Mostrar un consulta SQL de BD ( Demo 66)

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 484 -

Esta demostración tiene por objetivo enseñar a crear una pagina a imprimir con datos desde una base de datos mediante el objeto PrintDocument y realizar un preview de ésta mediante el control PrintPreviewControl. El ejemplo trabaja con un formulario que al cargar se conecta a la base de datos "alumnos" de SQL Server y ejecuta un comando que llena una tabla de un DataSet con los códigos, nombres y FechaNac de la tabla alumnos. A partir de esta tabla se crea una vista la cual se enlaza a un control DataGridview.. La aplicación tiene un menú principal con una opción de Reporte donde se puede realizar Preview de los datos usando el PrintPreviewControl o imprimirlos usando el método Print del objeto PrintDocument. Para ver la demostración debemos realizar los siguientes pasos: 1.

En el diseñador de formularios Windows, arrastrar 1 control DataGridView1, MenuStrip y PrintDocument, luego configurar las propiedades, tal como se muestra en el siguiente cuadro: Objeto Form1 DataGridView MainMenu PrintDocument

2.

Valor fReporte de Empleados DataGridView1 MainMenu1 PrintDocument

Seleccione el componente MenuStrip1 y en la parte superior donde dice "escriba aquí” escriba directamente los textos del menú y configure sus propiedades, tal como se muestra en el siguiente cuadro: Objeto MenuItem1 MenuItem11 MenuItem12

3.

Propiedad Text Name Name Name

Propiedad Name Text Name Text Name Text

Valor mnuReporte Reporte mnuPreview Preview mnuPrint Print

En la ventana explorador de soluciones dar clic en el botón "ver codigo". Y copie el siguiente código

Imports System.Data.SqlClient Imports System.Text 'StringBuilder maneja cadenas Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\DATOS\ALUMNOS2.mdf;Integrate d Security=True;Connect Timeout=30;User Instance=True"

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 485 -

Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("Select CodAlumno,NombreAlumno,FechaNac From Alumnos", con) Dim dst As New DataSet() dap.Fill(dst, "Alumnos") dvw = dst.Tables("Alumnos").DefaultView DataGridView1.DataSource = dvw End Sub Private Sub CrearPagina(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim i As Integer Dim stb As New StringBuilder() Dim Texto As String Dim Fuente As New Font("Courier New", 12) Dim Brocha As Brush = Brushes.Blue Dim X As Integer = e.MarginBounds.Left Dim Y As Integer = e.MarginBounds.Top e.Graphics.DrawString("REPORTE DE ALUMNOS", Fuente, Brocha, X, Y) Y = Y + 30 For i = 0 To dvw.Count - 1 stb.Append(dvw(i)(0).ToString.PadRight(10)) stb.Append(dvw(i)(1).ToString.PadRight(25)) stb.Append(dvw(i)(2).ToString.PadRight(15)) Texto = stb.ToString e.Graphics.DrawString(Texto, Fuente, Brocha, X, Y) Y = Y + Fuente.GetHeight stb.Length = 0 Next End Sub Private Sub MostrarPreview(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuPrevio.Click Dim ppc As New PrintPreviewControl() ppc.Document = PrintDocument1 ppc.Zoom = 1 ppc.Dock = DockStyle.Fill Dim frmPreview As New Form() With frmPreview .Text = "Preview del Reporte de Alumnos" .WindowState = FormWindowState.Maximized .Controls.Add(ppc) .ShowDialog() End With End Sub Private Sub ImprimirReporte(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPrint.Click PrintDocument1.Print() End Sub

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

End Class Ejecute el programa y vera lo siguiente

- 486 -

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 487 -

Modifique las siguientes propiedades y vea los resultados ppc.Zoom = 2 como poner nombres de columna Ejemplo 3. Modifique el ejemplo anterior de tal manera que obtenga reportes de acuerdo a una consulta ingresada por el usuario en un inputbox por ejemplo listar los subtotales por año

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 488 -

CODIGO DEL FORMULARIO Imports System.Data.SqlClient Imports System.Text 'StringBuilder maneja cadenas Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Dim dst As New DataSet() Dim cadenaSQL As String Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\DATOS\ALUMNOS2.mdf;Integrate d Security=True;Connect Timeout=30;User Instance=True" Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("", con) Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load dst.Tables.Clear() cadenaSQL = "SELECT * FROM ALUMNOS" dap.SelectCommand.CommandText = cadenaSQL dap.Fill(dst, "CONSULTA") DataGridView1.DataSource = dst.Tables(0) dvw = dst.Tables(0).DefaultView DataGridView1.DataSource = dvw End Sub Private Sub CrearPagina(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim i As Integer, ncol As Integer, ne = 20 Dim stb As New StringBuilder() Dim Texto As String Dim Fuente As New Font("Courier New", 12) Dim Brocha As Brush = Brushes.Red Dim X As Integer = e.MarginBounds.Left Dim Y As Integer = e.MarginBounds.Top

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 489 -

e.Graphics.DrawString("REPORTE DE " & Chr(10) & cadenaSQL, Fuente, Brocha, X, Y) Y = Y + 50 ncol = dst.Tables(0).Columns.Count stb.Length = 0 For j = 0 To ncol - 1 If j = 0 Then ne = 10 else ne = 20 End If stb.Append(dst.Tables(0).Columns(j).ColumnName.ToString.PadRight(ne)) Next Texto = stb.ToString e.Graphics.DrawString(Texto, Fuente, Brocha, X, Y) Y = Y + Fuente.GetHeight stb.Length = 0 Dim Brocha1 As Brush = Brushes.Blue For i = 0 To dvw.Count - 1 For j = 0 To ncol - 1 If j = 0 Then ne = 10 Else ne = 20 End If stb.Append(dvw(i)(j).ToString.PadRight(ne)) Next j Texto = stb.ToString e.Graphics.DrawString(Texto, Fuente, Brocha1, X, Y) Y = Y + Fuente.GetHeight stb.Length = 0 Next End Sub Private Sub MostrarPreview(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuPrevio.Click Dim ppc As New PrintPreviewControl() ppc.Document = PrintDocument1 ppc.Zoom = 1 ppc.Dock = DockStyle.Fill Dim frmPreview As New Form() With frmPreview .Text = "CONSULTA = " & cadenaSQL .WindowState = FormWindowState.Maximized .Controls.Add(ppc) .ShowDialog() End With End Sub

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 490 -

Private Sub ImprimirReporte(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPrint.Click PrintDocument1.Print() End Sub Private Sub BtnGenerar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGenerar.Click cadenaSQL = InputBox("Ingrese consulta SQL", "consultaSQL", "SELECT * FROM ALUMNOS") dst.Tables.Clear() dap.SelectCommand.CommandText = cadenaSQL dap.Fill(dst, "CONSULTA") DataGridView1.DataSource = dst.Tables(0) dvw = dst.Tables(0).DefaultView DataGridView1.DataSource = dvw End Sub End Class Nota en caso que la tabla tenga muchos registros solo se puede mostrar una pagina del reporte como se ve en la figura

1.2. Usando Diálogos de Impresión Ls diálogos de impresión se pueden usar junto al objeto PrintDocument para realizar una mejor presentación y configuración de la impresión. Los diálogos de impresión son 3:  Diálogo de Presentación Preliminar de Impresión (PrintPreviewDialog).  Diálogo de Configuración de Página de Impresión (PageSetupDialog).  Diálogo de Impresión (PrintDialog).

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 491 -

1.2.1. Realizando un Preview con el PrintPreviewDialog Después de crear el documento a imprimir en el evento PrintPage del objeto PrintDocument podemos realizar una mejor presentación preliminar de éste, usando el diálogo de preview, el cual tiene funcionalidad preconstruida para poder hacer zoom, ver varias páginas, imprimir, etc. Como todo diálogo, el objeto PrintPreviewDialog hereda de la clase CommonDialog, pero tiene las siguientes propiedades adicionales: Document

Obtiene o establece el documento del que se desea la vista previa.

UseAntiAlias

Obtiene o establece un valor que indica si la impresión utiliza la características de alisado del sistema operativo.

Para trabajar con el diálogo de Preview, tan sólo hay que configurar la propiedad Document del diálogo en el objeto Prin Document, tal como sigue: objPrintPreviewDialog.Document ■ objPrintDocument 1.2.2. Configurando la Página con el PageSetupDialog También podemos configurar la página a imprimir mediante un diálogo, en donde podemos modificar el tipo de papel, el margen, la orientación, etc. Para trabajar con el diálogo de configuración de página hay que configurar la propiedad Document del diálogo en el objeto PrintDocument, tal como sigue: objPageSetupDialog.Document = objPrintDocument Para mostrar el diálogo de configuración de página llamar al método ShowDialog: obj PageSetupDialog.ShowDialog() Además para recuperar toda la configuración del diálogo para que pueda ser usada por la impresión, asignar en la propiedad DefaultPageSettings del objeto PrintDocument la propiedad PageSettings del diálogo, tal como sigue: obj PrintDocument.DefaultPageSettings = obj PageSetupDialog.PageSettings Nota: El diálogo de configuración de página automáticamente realiza este último paso, es decir, toda la configuración seleccionada por el usuario en el diálogo es automáticamente asignada al objeto PrintDocument. 1.2.3. Configurando la Impresión con el PrintDialog Finalmente, podemos presentar un diálogo de impresión donde podamos seleccionar la impresora, el número de páginas, el rango de páginas, el número de copias, guardar en un

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 492 -

archivo, etc. Usando las propiedades del objeto PrintDialog, Para trabajar con el diálogo de impresión, también hay que configurar la propiedad Document del diálogo en el objeto PrintDocument, tal como sigue: objPrintDialog.Document = objPrintDocument Ejemplo 4 crear una pagina a imprimir con un simple mensaje mediante el objeto PrintDocument y usar los diálogos de presentación preliminar, de configuración de página y de impresión. ( Demo 67) El ejemplo es similar al Demo65, es decir, trabaja con un simple formulario conteniendo un texto y tres botones donde se debe ingresar un mensaje, el cual se puede ver como saldrá impreso mediante el botón "Preview", configurar la página mediante el botón "Page Setup" o imprimir mediante el botón "Print". Para ver la demostración debemos realizar los siguientes pasos: 1. En el diseñador de formularios Windows, arrastrar un control Label, un TextBox, tres Button, un PrintDocument, un PrintPreviewDialog, un PageSetupDialog y un PrintDialog, luego configurar las propiedades, tal como se muestra en el siguiente cuadro: En la propiedad cursor de los botones ponga hand Objeto Form1 Label1 TexBox1 Button1 Button2 Button3 PrintDocument PrintPreviewDialog PageSetupDialog PrintDialog

Propiedad Name Text Text Text Name Text Name Text Name Text Name Name Name Name

Valor frmImpresion Impresiones en .NET con Drawing Mensaje a Imprimir btnPreview Preview btnPageSetup Page Setup btnPrint Print PrintDocument1 PrintPreviewDialog1 PageSetupDialog PrintDialog1

2 En la ventana explorador de soluciones dar clic en el botón "Ver Código". Y copiar el siguiente código Public Class frmImpresion Inherits System.Windows.Forms.Form Private Sub CrearPaginaImprimir(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Brocha As New SolidBrush(TextBox1.ForeColor) Dim X As Integer = e.MarginBounds.Left

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 493 -

Dim Y As Integer = e.MarginBounds.Top With e.Graphics .DrawString(TextBox1.Text, TextBox1.Font, Brocha, X, Y) End With End Sub Private Sub PreviewConDialogo(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click With PrintPreviewDialog1 'Dialogo de Preview .Document = PrintDocument1 .Text = "Preview usando PrintPreviewDialog" .WindowState = FormWindowState.Maximized .ShowDialog() End With End Sub Private Sub ConfigurarPagina(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPageSetup.Click With PageSetupDialog1 'Dialogo de Page Setup .Document = PrintDocument1 .ShowDialog() End With End Sub Private Sub ImprimirDocumento(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click With PrintDialog1 'Dialogo de Print .Document = PrintDocument1 .AllowPrintToFile = False .AllowSelection = True .AllowSomePages = True If .ShowDialog() = DialogResult.OK Then PrintDocument1.PrinterSettings = .PrinterSettings PrintDocument1.Print() End If End With End Sub End Class Nota: En el código anterior las variables X e Y son usadas para imprimir el texto a partir del margen actual. b) En el código anterior no se configura el zoom por código ya que el diálogo automáticamente presenta botones de Zoom y otros botones. c) En el código anterior no se configura el DefaultPageSettings del PríntDocument ya que el diálogo lo realiza en forma automática. d) En el código anterior se configura las propiedades Allow del diálogo para permitir mostrar selección de páginas en el diálogo de impresión. También si el . usuario da clic en el botón "OK" del dialogo de imprimir, entonces, se imprime el contenido del cuadro de texto. a)

Ejecute el programa y verá los siguiente

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 494 -

3 Escribir un texto cualquiera en el cuadro de texto, clic en el botón "Preview" y se presentará un diálogo similar a la figura Observación: Vea como el diálogo trae botones de impresión, zoom, número de páginas a ver y cerrar ventana.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 495 -

. 4 Proceda a configurar la página cambiando el tamaño del papel, la orientación y los márgenes, luego clic en "Aceptar" para cerrar el diálogo y realizar los cambios. 5 Nuevamente de clic en el botón "Preview" para ver la presentación de la página con los cambios realizados, después cierre el diálogo de Preview. 6 Clic en el botón "Print" y se presentará el diálogo de impresión, similar al mostrado en la figura

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 496 -

Ejemplo 3 . Esta demostración tiene por objetivo enseñar a crear un documento con varias páginas de datos obtenidos desde una base de datos. En ésta trabajaremos con todos los diálogos de impresión. (Demo 68) El ejemplo trabaja con un formulario que al cargar se conecta a la base de datos "ALUMNOS2" de SQL Server y ejecuta un comando que llena una tabla de un DataSet con los códigos de alumnos , nombres y fechas de nacimientos generados para ese efecto en la tabla Alumnos2 A partir de esta tabla se crea una vista la cual se enlaza a un control DataGrid. La aplicación tiene un menú principal con una opción de Reporte donde se puede realizar Preview de los datos usando el PrintPreviewDialog, configurar la página usando el PageSetupDialog o imprimir usando el PrintDialog. Para ver la demostración debemos realizar los siguientes pasos: 1.

En el diseñador de formularios Windows, arrastrar un control DataGridView, un MenuStrip y un PrintDocument, un PrintPreviewDialog, un PageSetupDialog y un PrintDialog, luego configurar las propiedades, tal como se muestra en el siguiente cuadro : Objeto Form1 DataGridvView1 MenuStrip1 PrintDocument1 PrintPreviewDialog1 PageSetupDialog PrintDialog1

Propiedad Name Text Name Name Name Name Name Name

Valor frmReporteAlumnos2 Reporte de Alumnos2 DataGridvView1 (dgdOrden mnuPrincipal PrintDocument1 PrintPreviewDialog1 PageSetupDialog PrintDialog1

2 Seleccione el componente MainMenu y en la parte superior donde dice "Escriba Aqui", escriba directamente los textos del menú y configure sus propiedades, tal como se muestra en el siguiente cuadro: Objeto MenuItem1 MenuItem11 MenuItem12 MenuItem13

Propiedad Name Text Name Text Name Text Name Text

Valor MnuReporte Reporte MnuPreview Preview MnuPageSetup PageSetup MnuPrint Print

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 497 -

3 En la ventana explorador de soluciones dar clic en el botón "View Code". Y copie el siguiente código: Imports System.Data.SqlClient Imports System.Text 'StringBuilder maneja cadenas Public Class frmReporteAlumnos2 Inherits System.Windows.Forms.Form Private dvw As DataView Private cr As Integer Dim CadenaConexion As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\DATOS\ALUMNOS2.mdf;Integrate d Security=True;Connect Timeout=30;User Instance=True" Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim con As New SqlConnection(CadenaConexion) Dim dap As New SqlDataAdapter("Select * From Alumnos2", con) Dim dst As New DataSet() dap.Fill(dst, "Alumnos2") dvw = dst.Tables("ALumnos2").DefaultView DataGridView1.DataSource = dvw End Sub Private Sub CrearDocumento(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim i As Integer Dim stb As New StringBuilder() Dim Texto As String Dim Fuente As New Font("Courier New", 10) Dim Brocha As Brush = Brushes.Blue Dim X As Integer = e.MarginBounds.Left Dim Y As Integer = e.MarginBounds.Top Dim LP As Integer = e.MarginBounds.Height \ Fuente.GetHeight For i = 0 To LP If cr = dvw.Count - 1 Then Exit Sub stb.Append(dvw(cr)(0).ToString.PadRight(15)) stb.Append(dvw(cr)(1).ToString.PadRight(30)) stb.Append(dvw(cr)(2).ToString.PadRight(15)) Texto = stb.ToString e.Graphics.DrawString(Texto, Fuente, Brocha, X, Y) Y = Y + Fuente.GetHeight stb.Length = 0 cr = cr + 1 Next e.HasMorePages = cr < dvw.Count - 1 End Sub Private Sub MostrarPreview(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuPreview.Click PrintPreviewDialog1.Document = PrintDocument1 PrintPreviewDialog1.ShowDialog() End Sub

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 498 -

Private Sub ConfigurarPagina(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuPageSetup.Click PageSetupDialog1.Document = PrintDocument1 PageSetupDialog1.ShowDialog() End Sub Private Sub ImprimirReporte(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MnuPrint.Click PrintDialog1.Document = PrintDocument1 If PrintDialog1.ShowDialog() = DialogResult.OK Then PrintDialog1.PrinterSettings = PrintDialog1.PrinterSettings PrintDocument1.Print() End If End Sub End Class

 La cantidad de líneas a imprimir de una página (LP) es obtenida dividiendo el alto del margen entre el alto de la fuente.  Para crear una nueva página se usa la propiedad HasMorePage en True sólo cuando el contador de registros (cr) sea menor al índice del último registro (dvw.Count-1).  El proceso de creación termina cuando no haya más registros que mostrar, es decir cuando el contador de registros llegue a la última posición. 4 Grabar y ejecutar la aplicación pulsando F5.

5 Del menú "Reporte" seleccionar la opción "Preview" y se mostrará el diálogo de presentación preliminar similar a la figura

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 499 -

Observación: Vea como.el documento tiene 2 páginas creadas para imprimir 6 Cierre la ventana del Preview, luego si desea configure la página o realize la impresión mediante las otras opciones del menú de Reportes.

2 TRABAJANDO REPORTES CON CRYSTAL REPORTS 2.1.1.

Introducción

Con Crystal Reports para Visual Studio .NET, puede crear rápidamente informes complejos de apariencia profesional. En lugar de utilizar programación, la interfaz de Crystal Report Designer le permite crear y dar formato al informe que desee. El eficaz motor de informes procesa los criterios de formato, agrupamiento y creación de gráficos que especifique. 2.1.2.

Asistente de Informes

Los asistentes de Crystal Report permiten crear rápidamente informes en función de las necesidades de desarrollo:  Seleccionar la opción de diseño de informes que le interese, desde informes estándar hasta cartas modelo, o bien cree sus propios informes partiendo de cero.  Mostrar gráficos en los que los usuarios puedan profundizar con el fin de ver datos detallados de los informes.  Calcular resúmenes, subtotales y porcentajes de datos agrupados.  Mostrar resultados de datos de N Superiores y N Inferiores.  Dar formato al texto y rotar objetos de texto cuando se cumplan determinadas condiciones.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 500 -

2.1.3. Ventajas de Informes 1.   

Para Programadores: Selección del lenguaje y del proyecto: Uso de los visores de informes: sin clientes (Web) y varios clientes (Windows): Crystal Reports para Visual Studio .NET proporciona dos visores de informes con los que puede ver informes en aplicaciones: utilice Web Forms Viewer para las aplicaciones Web y Windows Forms Viewer para las aplicaciones de Windows. Personalización de visores para interactuar con otros controles: Modelo de objetos enriquecido:

  2.

Para Usuarios: Visualización de Crystal Reports en el Web. Acceso a informes perfectamente integrados: Fácil interacción con los informes: Exportación de informes: o Los usuarios pueden exportar informes a formatos de Microsoft Word y Excel, así como a formatos PDF, HTML y Crystal Reports para Visual Studio .NET.    

2.2. Arquitectura de Crystal Reports 2.2.1. Objeto ReportDocument El nivel superior del modelo de objetos de Crystal Reports es el objeto ReportDocument. Este objeto contiene todas las propiedades y todos los métodos necesarios para interactuar con un informe y personalizarlo. Puede utilizar su método Load para abrir un archivo de informe o asignarle un informe con tipos declarados. Para utilizar ReportDocument, en primer lugar debe hacer referencia al espacio de nombres CrystalDecisions.CrystalReports.Engine, que se encuentra en el archivo CrystalDecisions.CrystalReports.Engine.dll. Si ha insertado un informe en la aplicación, esta referencia se agregará automáticamente ♦

Propiedades  Database:  DataDefinition:  ExportOptions:  PrintOptions:  ReportDefinition:  ReportOptions:  Summarylnfo

2.2.2. Windows Forms Viewer Si programa una aplicación Windows, puede almacenar un informe en Windows Forms con

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 501 -

"Crystal Reports Windows Forms Viewer", que está disponible como control en el cuadro de herramientas de Visual Stiudio (CrystalReportView). ♦

Propiedades • TableLogOnInfos: • ParameterFields: • ReportSource:

2.3. Creando Reportes con Crystal Reports 2.3.1. Diseñando el Informe con Crystal Report Designer Esta herramienta puede programarse directamente desde Visual Studio .NET. No es necesario distribuir Report Designer con el informe. Para crear un reporte usando el Crystal Report Designer debemos realizar los siguientes pasos: 1.

Crear un DataSet con Tipo (Typed DataSet) que sirva de origen de datos para diseñar el reporte (siga la indicaciones dadas en adaptador de datos en SI2011A 3VB20112008 pag 228)

. 2. Del menú "Project", seleccionar "Add New ítem..." o pulsar las teclas [Ctrl] + [Shift] + [A]. 3. Del diálogo de Añadir Nuevo Elemento seleccionar "Crystal Report".

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 502 -

4. Escribir el nombre del reporte y clic en el botón "Open". 5. Aparecerá un diálogo de "Registro del Software", clic en el botón "Register Later" para indicar que después se registrará. 6. Se mostrará la ventana de diálogo de Galería de Reportes, similar al de la figura

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 503 -

. 7. En la sección "Créar un nuevo documento en Crystai Report Document" seleccionar la primera opción "Usar asistente de informes" para indicar que el reporte se generará con el asistente de reportes. 8. En la sección "Elegir un asistente "Standard" para indicar que se desea crear un reporte estándar (hoja A4). 9. Clic en el botón "OK" y aparecerá la ficha "Data" de la ventana del "Report Expert", similar a la figura

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 504 -

10. Expandir el icono de "Project Data", "ADO .NET DataSets" y luego el DataSet creado. 11. Seleccionar la tabla que se desea usar en el reporte y clic en el botón "Insert Table". Nota: Pueden usarse más de una tabla en el caso de crear reportes agrupados. 12. Clic en el botón "Next" y se mostrará la ficha "Fields" del "Report Expert", similar a la de la figura 10.15.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 505 -

Figura 10.15: Ficha "Fields" de la Ventana del "Report Expert' 13. Seleccionar los campos que se mostrarán en el reporte y clic en el botón "Add", si se desean pasa todos clic en "Add All” Nota: Después de pasar los campos, se pueden seleccionar y cambiar el título de las cabeceras en la opción "Column Heading". 14. Clic en el botón "Next" y se mostrará la ficha "Group" del "Report Expert", similar a la de la figura 10.16

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 506 -

15. Si desea agrupar los registros por algún campo en común que tengan éstos seleccionar dicho campo y clic en el botón "Add" 16. Clic en el botón "Next" y si eligió Agrupar por algún campo se verá la ficha "Total" del "Report Expert", similar a la de la figura 10.17.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

17.

- 507 -

Seleccionar los campos que se mostrarán como cálculos en el pie de los detalles, luego seleccionar cada uno y elegir la función que se quiere mostrar; contar, suma, promedio, máximo, mínimo, etc.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

18.

19.

- 508 -

Clic al botón "Next" y si eligió Agrupar por algún campo se verá la ficha "Top N" del "Report Expert", similar a la de la figura 10.18

Figura 10.18: Ficha "Top N" de la Ventana del "Report Expert" Si desea puede sspecificar ordenar los datos agrupados basados en un total o cálculo creado.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

20.

21.

- 509 -

Clic al botón "Next" y se verá la ficha "Chart" del Report Expert", similar a la de la figura 10.19.

Si desea puede crear un gráfico de datos, seleccionando el tipo de gráfico, los datos a graficar y los títulos del gráfico. 22. Clic al botón "Next" y se verá la ficha "Select" del "Report Expert", similar a la de la figura

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 510 -

23. Si desea puede seleccionar un campo por el cual se desea filtrar los datos, escribiendo la condición del filtro. 24. Clic al botón "Next" y se verá la ficha "Style" del "Report Expcrt", similar a la de la figura 10.21

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

25.

- 511 -

Escribir el título que irá en el informe y seleccionar el estilo de informe deseado y clic en el botón "Finish" para crear el reporte 26. Inmediatamente se presentará sobre el diseñador de reportes el reporte creado, similar a la figura 10.22

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

Ver vista previa del informe principal

- 512 -

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 513 -

27. Para modificar el reporte puede usar los controles de la ficha "Crystal Reports" del "ToolBox", similar a la vista en la figura

Nota: Los controles del cuadro de herramientas sólo permiten insertar cuadros de texto, líneas y recuadros. Si desea insertar otro tipo de objetos use las barras de herramientas que a continuación explicamos. También puede usar las barras de herramientas del Crystal Report, similar a las mostradas en las figuras 10.24 y 10.25:

Figura 10.24: Barra de herramienta Principal de "Crystal Reports". Nota: para obtener barra de herramientas use el menú ver barra de herramientas y luego Cristal Report Principal Nota: La barra de herramientas principal permite modificar las características de los controles diseñados en el reporte, tal como la fuente, tamaño, alineación. Además permite cambiar características del reporte insertando campos, ordenando, et Figura 10.25: Barra de herramienta Insertar de "Crystal Reports". Nota: La barra de herramientas insertar permite agregar totales al reporte, insertar grupos, adicionar subreportes, adicionar un gráfico de datos o insertar una imagen. 29. Finalmente después de realizar cambios al reporte, proceda a grabarlo. Nota: Los reportes creados en el Crystal Reports tienen la extensión rpt. 2.3.2. Presentando el Informe en Windows Forms Viewer Una vez creado el reporte con el diseñador de reportes es necesario presentarlo en una aplicación de Windows Forms, para lo cual se usa el visor de reportes para formularios Windows, en inglés Windows Forms Viewer. Hay que mencionar que un mismo reporte (archivo rpt) puede ser usado en Windows o en Web, lo único que cambia es el visor, para el caso de una aplicación Web con ASP .NET será el Web Forms Viewer.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 514 -

En este caso veremos sólo el visor de las aplicaciones Windows, el cual se encuentra en el "ToolBox" como control "CrystalReportViewer". El visor de reportes proporciona los siguientes componentes, que le ayudan a ver un informe Crystal: 1. Barra de herramientas El visor de reportes tiene empaquetado una barra de herramientas similar a la mostrada en la figura 10.26: Figura 10.26: Barra de herramientas del "Crystal Reports Viewer". La barra de herramientas del visor contiene los siguientes iconos:  Ir a primera página.  Retroceder página.  Ir a una página especificada.  Avanzar página.  Ir a la última página.  Cerrar ventana activa (sólo para grupo o subinforme).  Imprimir informe.  Actualizar informe.  Exportar un informe.  Mostrar/ocultar e! árbol de grupos.  Aumentar/reducir informe.  Buscar Puede personalizar más la barra de herramientas programando con la descripción de clase de Windows Forms Viewer. Por ejemplo, para ocultar el icono Buscar, establezca la propiedad ShowTextSearchButton en False. Como alternativa a la utilización de la barra de herramientas predeterminada, puede ocultar la barra de herramientas completa estableciendo la propiedad DisplayToolbar en False. A continuación, puede implementar su propia barra de herramientas con otros controles Windows Form (por ejemplo: el control Button) y programar las funciones que necesite utilizando los métodos, las propiedades y los eventos de Windows Forms Viewer. 2.

Árbol de Grupos

El visor de reportes también contiene un árbol de grupos ubicado en el lado derecho, éste sólo aparece si se dan estas dos condiciones:  El informe Crystal tiene un árbol de grupos.  Ha mostrado u ocultado el icono Mostrar árbol de grupos de la barra de herramientas del visor. Nota: Puede expandir y contraer el árbol de grupos si hace clic en el símbolo + que aparece junto a cada nodo del mismo. Inserte cristal report viewer

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

La ejecución del reporte es la siguiente

- 515 -

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 516 -

NOTA Hacer clic con el botón secundario y elegir insertar se muestra lo siguiente

Al escoger gráficos se muestra lo siguiente

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 517 -

♦ Demo 69 crear un simple reporte de datos usando el Crystal Report Export, el Report Designer y el CrystalReportViewer. El ejemplo trabaja con un formulario que muestra en un control visor de reportes información de los Clientes de la BD "Northwind" de SQL Server. En el reporte se muestran el código, nombre y dirección de los clientes. Para ver la demostración debemos realizar los siguientes pasos: 1. En el diseñador de formularios Windows, arrastrar un control CrystalReportViewer, luego configurar las propiedades, tal como se muestra en el siguiente cuadro: Objeto Form1 CrsytalReportViewe r

Propiedad Name Name DisplayGroupTre e Dock

Valor frmReporteCliente CrsytalReportViewer False Fill

2. Crear un DataSet con Tipo (Typed DataSet) que sirva de origen de datos para diseñar el reporte (siga la indicaciones dadas en adaptador de datos en SI2011A 3VB20112008 pag 228 para ello en el generador de consultas arrastre la tabla custumers y seleccionar sus campos CustomerlD, CompanyName y Address.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 518 -

3. Clic derecho al objeto "sqldataadapter” y del menú contextual seleccionar "Generate DataSet". 4. Aparecerá un diálogo, en la opción Elegir un DataSet, por defecto aparece "Nuevo", escribir el nombre para el DataSet como datasetcustumer. 5. En la lista de tablas seleccionar la tabla Customers (dap) y clic en "OK". 6. Del menú "Project", seleccionar "Add New ítem" o pulsar las teclas [Ctrl] + [Shifl] + [A]. 7.Del diálogo de Añadir Nuevo Elemento seleccionar "Crystal Report". 8.Aparecerá un diálogo de "Registro del Software", clic en el botón "Register Later" para indicar que después se registrará. 9.Se mostrará la ventana de diálogo de Galería de Reportes (figura 10.13). 10. En la sección "Créate a New Crystal Report Document" seleccionar la primera opción "Using the Report Expert" para indicar que el reporte se generará con el asistente de reportes. 11. En la sección "Choose an Expert" seleccionar "Standard" para indicar que se desea crear un reporte estándar (hoja A4). 12. Clic en el botón "OK" y aparecerá la ficha "Data" de la ventana del "Report Expert" (figura 10.14). 13. Expandir el icono de "Project Data", "ADO .NET DataSets" y luego el DataSet "dst". 14. Seleccionar la tabla "Customers" y clic en el botón "Insert Table" .

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 519 -

15. Clic en el botón "Next" y se mostrará la ficha "Fields" del "Report Expert" (figura 10.15). 16. Clic en el botón "Add All" para mostrar todos los campos en el reporte. 17. Después de pasar los campos, modificar los títulos de las cabeceras, para el primer campo Código, para el segundo Nombre y para el tercero Dirección. 18. Clic en el botón "Next" y se mostrará la ficha "Group" del "Report Expert" (figura 10.16). 19. Clic nuevamente en el bolón "Next" ya que nuestro reporte es simple y no tiene agrupaciones, se mostrará la ficha "Chart" del "Report Export" (figura 10.19). 20. Clic en "Next" para indicar que no deseamos un gráfico de datos y se mostrará la ficha "Select" del "Report Export" (figura 10.20). 21. Clic en "Next" para indicar que no deseamos filtrar y se verá la ficha "Style" del "Report Export" (figura 10.21). 22. Escribir como título del reporte "Lista de Clientes Northwind" y seleccionar el último estilo de la lista. 23. Clic en el botón "Finish" para crear el reporte y aparecerá el Crystal Report Designer, por si deseamos hacer algún cambio. 24. Regresar al formulario y en la ventana explorador de soluciones dar clic en el botón " View Code" y copie el siguiente código Public Class Form1 Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load SqlDataAdapter1.Fill(DataSetCustumer1, "Customers")

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 520 -

Dim rpt As New CrystalReport1 rpt.SetDataSource(DataSetCustumer1) CrystalReportViewer1.ReportSource = rpt End Sub End Class 25. Grabar y ejecutar la aplicación pulsando F5. Clic derecho sobre el Crystal report y en la pestaña informe principal e insertar objeto de texto

Inserte box objeto

Luego dar formato al objeto

26. . Una vez mostrado el reporte podemos hacer zoom, exportarlo o imprimirlo.

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 521 -

3. Trabajando con Informes usando MS Office 3.1. Usando MS Word para Crear Documentos 3.1.1. Entendiendo el Modelo de Objetos de MS Word Los objetos de Microsoft Word están organizados en orden jerárquico, siendo Application y Document las dos clases principales de la cima de la jerarquía. La gran importancia de estas dos clases se debe a que la mayor parte del tiempo trabajará con la propia aplicación Word o haciendo algún tipo de manipulación en documentos de Word. A continuación presentamos el modelo de objetos de MS Word: .  Application El objeto Application representa la aplicación Word y es el principal de todos los objetos. Sus miembros normalmente son aplicables a Word en su totalidad. Se pueden utilizar sus propiedades y métodos para controlar el entorno de Word.  Document El objeto Document es de vital importancia para la programación en Word. Cuando se abre un documento o se crea un documento nuevo, se está creando un objeto Document nuevo, que se agrega a la colección Documents de Word. El documento que tiene el foco se llama documento activo y se representa mediante la propiedad ActiveDocument del objeto Application,

Figura 10.32: Resumen del Modelo de Objetos de MS Word 

Selection

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 522 -

El objeto Selectior representa el área que está seleccionada. Cuando se realiza una operación en la interfaz de usuario de Word, como poner texto en negrita, se selecciona o resalta el texto y, a continuación, se aplica el formato. El objeto Selection siempre está presente en un documento. Además, también puede representar varios bloques de texto no contiguos. 

Range El objeto Range representa un área contigua de un documento, y se define mediante una posición de carácter inicial y una posición de carácter final. Pueden utilizarse varios objetos Range a la vez. El mismo documento puede tener definidos varios objetos Range. Un objeto Range tiene las siguientes características: - Puede ser e1 punto de inserción solamente, un rango de texto o el documento completo. - Incluye caracteres no imprimibles como espacios, caracteres de tabulación y marcas de párrafo. - Puede ser el área representada por la selección actual, o puede representar otra área diferente de la de la selección actual. - No se guarda con un documento y sólo existe mientras se ejecuta el código. - Guando se inserta texto al final de un rango, Word amplía éste automáticamente para que incluya el nuevo texto. 

Bookmark El objeto Bookmark se parece al objeto Range en que representa un área contigua de un documento, con una posición inicial y una posición final. Los marcadores se utilizan para marcar una ubicación en un documento o como contenedores de texto en un documento. Un objeto Bookmark puede ser el punto de inserción o el documento completo. También se pueden definir varios marcadores en un documento. Un objeto Bookmark tiene las siguientes características que lo distinguen del objeto Range: - Un objeto Bookmark puede tener nombre. - Los marcadores se guardan con el documento y, por lo tanto, no desaparecen cuando cesa la ejecución del código o al cerrar el documento. - De manera predeterminada los marcadores están ocultos, pero pueden hacerse visibles si se establece la propiedad ShowBookmarks del objeto View en True. (El objeto View es un miembro de los objetos Window y Pane, que existen en los objetos Application y Document).

3.1.2. Creando el Documento en MS Word para el Informe En general, debemos realizar los siguientes pasos para crear un documento para nuestro informe: 1.Abrir el MS Word, del botón 'inicio", seleccionar "Programas", luego "Microsoft Office 2000" y finalmente "Microsoft Word". 2.Del menú "Ver" seleccionar "Barras de herramientas" y elegir "Formularios

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 523 -

Figura 10.33: Barra de herramientas de Formularios de MS Word. 3. Empezar a crear la parte fija del documento, como títulos, párrafos, mensajes, imágenes, tablas, etc. 4. Cuando desee crear un dato variable (campo) que se llenará desde la base de datos ubicarse sobre la posición y clic en el primer botón de la barra de formularios para insertar un "Campo con texto". 5. Proceda a realizar el paso anterior para todos los campos o datos variables del documento y finalmente grabar el documento en la carpeta donde está el ejecutable de la aplicación. Nota: Cuando desarrollamos aplicaciones Windows usando el Visual Studio .NET, la carpeta donde está la aplicación (el ejecutable o exe) es ¡a carpeta Bin que se encuentra dentro de la carpeta con el Proyecto. 3.1.3. Llenando el Documento con Datos de la Aplicación Una vez creado el documento hay que crear una aplicación que permita enviar los datos hacia el documento mediante programación, a lo que se le conoce como "Automatización COM" o "ActiveX". Para llenar un documento de MS Word con datos de una vista desde la aplicación debemos realizar los siguientes pasos: 1. Hacer una referencia a la librería de tipos de MS Word:  Del menú "Project" seleccionar "Add Reference".  Del diálogo seleccionar la segunda ficha "COM".  Seleccionar "Microsoft Word 9.0 Object Library".  Clic en el botón "Select" y luego clic en "OK". Nota: Por ser un componente COM el Visual Studio .NET creará unas librerías de interoperabilidad entre COM y .NET (Interop), las cuales se crean en el mismo directorio donde se ejecuta la aplicación. 2. Crear un objeto que apunte a la clase Application de Word: Dim W As New Word.Application() 3. Abrir el documento creado como plantilla para el informe mediante el método Open de la colección Documcnts del objeto Application: W. Documents . Open ("Archivo. doc") 4. Escribir cada valor de un campo de la vista en el campo del documento creado mediante la propiedad ítem de la colección Fields del objeto Document de la aplicación Word: W.ActiveDocument.Fields.Item(l).Result.Text = dgdProducto.Item(N, 0) Nota: En Word el índice de los campos empieza en 1 y en .NET empieza en 0. ♦ Demo 72 . a crear documentos para informes en MS Word y llenarlos desde una aplicación Windows en .NET. El ejemplo trabaja con un formulario que al cargar se conecta a la base de datos Northwind de SQL Server y llena dos tablas, una de Categorías y otra de Productos. La tabla de Categorías se enlaza a un ComboBox mostrándose el nombre de la categoría y la tabla de Productos sirve para crear una vista, la cual se enlaza a un DataGrid mostrándose el código,

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 524 -

nombre, precio y código de la categoría del producto. Al seleccionar una Categoría del combo, la vista se filtra mostrando los productos de dicha categoría. Finalmente, a! seleccionar un registro y dar clic al botón "Crear Documento" se abrirá la plantilla de Word y se llenará con los datos del registro actual y se grabará en disco. Para ver la demostración debemos realizar los siguientes pasos: 1. Abrir el MSWord, del botón "Inicio", seleccionar "Programas", luego "Microsoft Office 2007" y finalmente "Microsoft Word". 2. Del menú "Ver"-seleccionar "Barras de herramientas" y elegir "Formularios". 3. Empezar a crear el siguiente contenido: ACME SA Informe de Producto Código

:

     

Descripción

:

     

Precio Unitario

:

     

Categoria

:

     

Aprobado Por:

:

     

Nota: Para agregar los campos (cuadros con sombra) dar clic al primer botón de la barra de formulario 4. Grabar el archivo como "Informe del Producto.doc" y salir de Word. 5. En el diseñador de formularios Windows, arrastrar un control Label, un ComboBox, un DataGrid y un Button, luego configurar las propiedades, tal como se muestra en el siguiente cuadro: Objeto Form1

Propiedad Text

Label1 ComboBox1

Text Anchor DropDownStyle Anchor Name Text

DataGrid1 Button1

Valor Consulta de Productos Categoría lElija la categoria Top,Left,Tight DropDownList Top,Bottom,Left,Right btnCrearDocumento Crear Documento

8. Hacer una referencia a la librería de tipos de MS Word.

x

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 525 -

9. En la ventana explorador de soluciones dar clic en el botón "View Code". Y copiar el siguiente código Imports System.Data.SqlClient Public Class Form1 Inherits System.Windows.Forms.Form Private dvw As DataView Private Sub LlenarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\DATOS\northwnd.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True") Dim dap As New SqlDataAdapter("Select CategoryID,CategoryName From Categories", con) Dim dst As New DataSet() dap.Fill(dst, "Categorias") dap.SelectCommand.CommandText = "Select ProductID,ProductName,UnitPrice,CategoryID From Products" dap.Fill(dst, "Productos") dvw = dst.Tables("Productos").DefaultView With ComboBox1 .DataSource = dst.Tables("Categorias") .DisplayMember = "CategoryName" .ValueMember = "CategoryID" End With DataGrid1.DataSource = dvw

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 526 -

End Sub Private Sub FilltrarProductos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try dvw.RowFilter = "CategoryID=" & ComboBox1.SelectedValue Catch ex As Exception End Try End Sub Private Sub CrearDocumento(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrearDocumento.Click Dim ruta As String = Application.StartupPath & "\Informe del Producto" Dim N As Integer = DataGrid1.CurrentRowIndex Dim W As New Microsoft.Office.Interop.Word.Application ruta = "e:\DATOS\INFORME2" W.Visible = True 'W.Documents.Open("E:\DATOS\INFORME1.DOC") W.Documents.Open(ruta & ".doc") With W.ActiveDocument.Fields .Item(1).Result.Text = DataGrid1.Item(N, 0) .Item(2).Result.Text = DataGrid1.Item(N, 1) .Item(3).Result.Text = DataGrid1.Item(N, 2) .Item(4).Result.Text = DataGrid1.Item(N, 3) End With W.ActiveDocument.SaveAs(ruta & " " & DataGrid1.Item(N, 1) & ".doc") End Sub End Class Nota: El archivo de Word que sirve de plantilla para el informe lo estamos recuperando de la ruta donde se encuentra la aplicación mediante la propiedad StartupPath del objeto Application de .NET. 10. Grabar y ejecutar la aplicación pulsando F5

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 527 -

17. vez creada la carpeta Bin con el exe, proceda a copiar el archivo de Word creado anteriormente en dicha carpeta. 18. Seleccionar una categoría y ver como se filtran los productos de dicha categoría. 19. Seleccionar un registro y clic al botón "Crear Documento" e inmediatamente se abrira Ms Word con la plantilla, se escribirán los datos y se guardará con un nuevo nombre

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 528 -

3.2. Usando MS Excel para Crear Gráficos 3.2.1. Entendiendo el Modelo de Objetos de MS Excel • Application El objeto Application de Excel representa la propia aplicación. Este objeto proporciona mucha información sobre la aplicación en ejecución, las opciones que se aplican a esa instancia y los objetos de usuario actuales que se abren en cada instancia. • Workbook La clase Workbok representa un solo libro dentro de la aplicación Excel. Muchos de los miembros de la clase Application también se muestran como miembros de la clase Workbook. En este caso, las propiedades se aplican a un libro específico, en vez de aplicarlas al libro activo completo. • Worksheet Aunque la clase Worksheet proporciona muchos miembros, la mayoría de las propiedades, de los métodos y de los eventos sor idénticos o similares a los miembros proporcionados por las clases Application o Workbook. Excel proporciona una colección Sheets como propiedad de un objeto Workbook, pero no existe ninguna clase Sheet en Excel. En su lugar, cada miembro de la colección Sheets es un objeto Worksheet o Chart. • Range El objeto Range es el que utilizará con mayor frecuencia en las aplicaciones de Excel. Antes de que pueda manipular una región de Excel, debe expresarla corno objeto Range y trabajar con los métodos y las propiedades de este objeto. Un objeto Range representa una celda, una fila, una columna, una selección de celdas que contienen uno o más bloques de celdas (que pueden ser contiguas o no) o incluso un grupo de celdas de varias hojas de cálculo. En este tema se han descrito brevemente las clases más importantes: Application, Workbook, Worksheet y Range. Hay muchas otras clases que podrían ser útiles, como PivotTable y Chart. El modelo de objeto permite que el usuario realice prácticamente cualquier tarea automatizada necesaria. En nuestro caso, para crear gráficos de datos usaremos la clase Application y las colecciones WorkBooks y Charts, tal como explicamos en la siguiente sección. 3.2,2. Creando un Gráfígo de Datos con MS Excel Para crear un gráfico en MS Excel con datos de una vista desde la aplicación debemos realizar los siguientes pasos: 1. Hacer una referencia a la librería de tipos de MS Excel: • Del menú 'Project" seleccionar "Add Reference". • Del diálogo seleccionar la segunda ficha "COM". • Seleccionar "Microsoft Excel12 Object Library". • Clic en el botón "Select" y luego clic en "OK".

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 529 -

Demo 73 crear un gráfico de barras en MS Excel con datos obtenidos desde una aplicación Windows en .NET. El ejemplo trabaja con un formulario que al cargar se conecta a la base de datos Northwind de SQL Server y llena dos tablas, una de Categorías y otra de Productos. La tabla de Categorías se enlaza a un ComboBox mostrándose el nombre de la categoría y la tabla de Productos sirve para crear una vista, la cual se enlaza a un DataGrid mostrándose el código, nombre, precio y código de la categoría del producto. Al seleccionar una Categoría del combo la vista se filtra mostrando los productos de dicha categoría. Finalmente, al seleccionar un registro y dar clic al botón "Crear Gráfico" se abrirá el Excel y se enviarán los datos de la vista filtrada por categoría, con los cuales se construirá un gráfico de barras el cual también se guarda en disco como archivo gif. Para ver la demostración debemos realizar los siguientes pasos: 1. En el diseñador de formularios Windows, arrastrar un control Label, un ComboBox, un DataGrid y un Button, luego configurar las propiedades, tal como se muestra en el siguiente cuadro: Objeto Form1 Label ComboBox1 DataGrid1 Button1

Propiedad Text Text Anchor DropDownStyle Anchor Name Text

Valor Consulta de Productos x Categoria Elige la Categoria Top,Left,Right DropDownList Top, Bottom, Left, Right btnCrearGrafico Crear Gráfico

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 530 -

2 Hacer una referencia a la librería de tipos de MS Excel. 3 En la ventana explorador de soluciones dar clic en el botón "View Code". Y copiar el siguiente código Imports System.Data.SqlClient Public Class Form1 Private dvw As DataView Private Sub LlenarDatos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=E:\SI2011\DATOS\northwnd.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True") Dim dap As New SqlDataAdapter("Select CategoryID,CategoryName From Categories", con) Dim dst As New DataSet() dap.Fill(dst, "Categorias") dap.SelectCommand.CommandText = "Select ProductID,ProductName,UnitPrice,CategoryID From Products" dap.Fill(dst, "Productos") dvw = dst.Tables("Productos").DefaultView With ComboBox1 .DataSource = dst.Tables("Categorias") .DisplayMember = "CategoryName" .ValueMember = "CategoryID" End With DataGrid1.DataSource = dvw End Sub Private Sub FilltrarProductos(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Try dvw.RowFilter = "CategoryID=" & ComboBox1.SelectedValue Catch ex As Exception End Try End Sub Private Sub CrearGrafico(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrearGrafico.Click Dim ruta As String = Application.StartupPath & "\Grafico de " Dim X As New Microsoft.Office.Interop.Excel.Application X.Visible = True X.Workbooks.Add() X.Cells(1, 1).Value = "Descripcion del Producto" X.Cells(1, 2).Value = "Precio" Dim I, F As Integer F=2 For I = 0 To dvw.Count - 1 X.Cells(F, 1).Value = dvw(I)(1) X.Cells(F, 2).Value = dvw(I)(2) F += 1

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 531 -

Next X.Columns.AutoFit() X.Range("A1").Select() Dim R As Microsoft.Office.Interop.Excel.Range = X.Selection.CurrentRegion X.Charts.Add() With X.ActiveChart .ChartType = -4100 .SetSourceData(R, 2) .Location(1) .Export(ruta & ComboBox1.Text & ".gif", "gif") End With End Sub End Class notas:

   

ChartType en -4100 indica que el tipo de gráfico es de barras en 3D. SetSourceDate(R,2) indica que el rango a graficar es R y su orientación es en columnas Location(1) indica que el gráfico saldrá en una nueva hoja Advertencia: Se generará una excepción en el método Export si no se ha instalado los filtros gráficos para poder crear archivos mediante MS Office al momento de su instalación.

4 Grabar y Ejecutar la aplicación pulsando F5

TB2015 PARTE 8 REPORTES\ISMAEL VELIZ VILCA

- 532 -

5 Seleccionar una categoría y ver como se filtran los productos de dicha categoría. 6. Seleccionar un registro y clic al botón "Crear Gráfico" e inmediatamente se abrirá MS Excel con los datos de la vista filtrada, con los cuales creará el gráfico, similar al mostrado en la figura:

Figura 10.27.Ventana del MS Excel con el gráfico creado

7 Revisar que en la carpeta Bin se ha creado un archivo gif con un gráfico de productos de dicha categoría. 8 Cerrar el Excel y si desea puede guardar el archivo.