Está en la página 1de 72

10.

CREANDO REPORTES DE DATOS

-1-

10 CREANDO REPORTES DE DATOS


1. Trabajando con Impresiones mediante Drawing
En este captulo veremos diferentes formas de crear e imprimir reportes o informes de datos. Primero
trabajaremos con la clase Drawing, luego usaremos Crystal Reports y finalmente trabajaremos con
Microsoft Office.
Para habilitar la impresin de reportes desde el .NET Framework hay que usar el Namespace
System.Drawing.Printing que contiene objetos tiles para manejar tareas de impresin.

1.1. Usando el Objeto de Impresin


El objeto de impresin permite crear un documento a imprimir, configurar sus caractersticas,
enlazarlo a controles o dilogos para realizar su presentacin preliminar (preview) y finalmente
habilita la impresin.
1.1.1. Clase PrintDocument
La clase PrintDocument es la que permite crear el objeto de impresin, por lo cual describimos sus
principales caractersticas:
Propiedades
DefaullPageSettings

Obtiene o establece la configuracin de pgina que se utiliza como


predeterminada para todas las pginas que se van a imprimir.

DocumentName

Obtiene o establece el nombre del documento que va a aparecer (por


ejemplo: en un cuadro de dilogo de estado de impresin o cola de
impresin) mientras se imprime el documento.

OriginAtMargins

Obtiene o establece un valor que indica si un objeto grfico asociado a una


pgina est situado justo dentro de los mrgenes especificados por el
usuario o en la esquina superior izquierda del rea de impresin de la
pgina.

PrintController

Obtiene o establece el dispositivo de impresin que gua el proceso de


impresin.

PrinterSettings

Obtiene o establece la impresora que imprime el documento.

Mtodos
Print

Inicia el proceso de impresin del documento.

Eventos
BeginPrint

Se produce cuando se llama al mtodo Print antes de que se imprima la


primera pgina del documento.

10. CREANDO REPORTES DE DATOS

-2-

EndPrint

Se produce cuando se ha impreso la ltima pgina del documento.

PrintPage

Se produce cuando se necesita el resultado que se va a imprimir para la


pgina actual.

QueryPageSettings

Se produce justo antes de cada evento PrintPage.

La clase PrintDocument tambin tiene propiedades como PrintController y PrinterSettngs, que


permiten controlar la impresin, detectar las impresoras instaladas y la impresora por defecto donde
saldr la impresin.
El nico mtodo de impresin es el Print que permite enviar la salida del documento creado a la
impresora.
El principal evento del objeto PrintDocument es el PrintPage que permite crear el documento a
imprimir, tal como veremos a continuacin.
1.1.2. Creando las Pginas del Documento a Imprimir
El proceso de creacin de las pginas a imprimir se realiza en el evento PrintPage del objeto
PrintDocument, el cual como todo procedimiento manejador de exentos tiene dos parmetros:
Sender: Object
PrintPageEventArgs
Para crear el documento a imprimir, configurar sus mrgenes, nmero de pginas, etc., se debe usar el
parmetro PrintPageEventArgs, el cual tiene las siguientes propiedades:
Cancel
Graphics

Obtiene o establece un valor que indica si se debe cancelar el trabajo de


impresin.
Obtiene el objeto Graphics utilizado para dibujar la pgina.

HasMorePages

Obtiene o establece un valor que indica si se debe imprimir una pgina


adicional.

MarginBounds

Obtiene el rea rectangular que representa la parte de la pgina comprendida


entre los mrgenes.

PageBounds

Obtiene el rea rectangular que representa el rea total de la pgina.

PageSettings

Obtiene la configuracin de pgina para la pgina actual.

La principal propiedad es Graphics, que a su vez es un objeto que tiene propiedades y mtodos que
permiten crear la salida (grfico) que se desea enviar a la impresora.
En general, para crear una pgina de un documento a imprimir, debemos realizar los siguientes pasos:
1 Crear una instancia del objeto PrintDocument que soporte eventos:
Private WithEvents pdt As New PrintDocument()

2. Construir la pgina a imprimir en el evento PrintPage del objeto PrintDocument, usando los
mtodos de la propiedad Graphics del parmetro PrintPageEventArgs para crear la salida:
Private Sur. CrearPaginalmprimir(ByVal sender As System.Object, _ ByVal e As
System.Drawing.Printing.PrintPageEventArgs) _ Handles pdtMensaje.PrintPage
With e.Graphics
.DrawString(Texto,
Fuente,
Brocha,
PosX,
PosY)

10. CREANDO REPORTES DE DATOS


.Drawlmage(Imagen,
PosX,
'Mas cdigo de impresin
End With
End Sub

-3PosY)

Nota: El mtodo DrawString permito dibujar textos y el mtodo Drawlmage se usa para
mostrar Imgenes, pero existen ms mtodos grficos.

3. Si desea crear una nueva pgina configurar la propiedad HasMorePages del parmetro
PrintPageEventArgs en True:
e.HasMorePages

= True

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
presentacin preliminar del documento (Preview). Esta se puede hacer de dos formas:
Usando un control (PrintPreviewControl).
Usando un dilogo (PrintPreviewDialog).
En esta parte veremos la primera forma de realizar un preview, la cual es un poco limitada ya que no
presenta muchas opcknes de configuracin del preview y adems tiene que implementarse mediante
cdigo.
El control que permite realizar dicha presentacin se llama el PrintPreviewControl, el cual
describimos a continuacin:
Propiedades
AutoZoom

Obtiene o establece un valor que indica si el cambio de tamao del control o el


cambio de nmero de pginas que se muestra automticamente se ajusta a la
propiedad Zoom.

Columns

Obtiene o establece el nmero de pginas que aparecen en la pantalla con


orientacin horizontal.

Document

Obtiene o establece un valor que indica el documento del que se va a obtener


una vista previa.

Rows

Obtiene o establece el nmero de pginas que aparecen en la pantalla en sentido


vertical.

StartPage

Obtiene o establece el nmero de pgina de la pgina superior izquierda.

UseAntiAlias

Obtiene o establece un valor que indica si la impresin utiliza la caractersticas


de alisado del sistema operativo.

Zoom

Obtiene o establece un valor que indica el tamao con el que aparecern las
pginas.

Mtodos
InvalidatePreview

Actualiza la vista previa del document.

Eventos
StartPageChanged

Se produce cuando cambia la pgina de inicio.

10. CREANDO REPORTES DE DATOS

-4-

Para realizar un Preview del documento a imprimir usando el control, debemos escribir el siguiente
cdigo:
1. Crear un objeto de tipo PrintPreviewContro:
Dim ppc As New PrintPreviewControl

2.

Configurar la propiedad Document del PrintPreviewControI asignando el objeto


PrintDocument que tiene el documento a presentar:
ppc.Document = pdt

3.

Crear un objeto de tipo formulario en donde aparecer el control:


Dim frm As New Form

4. Aadir el objeto PrintPreviewControI a la coleccin de controles del formulario:


frm.Controls.Add(ppc)

5. Mostrar el formulario como un dilogo:


frm.ShowDialog()

1.1.4. Imprimiendo el Documento


Despus de crear el documento y realizar la presentacin preliminar el siguiente paso es imprimirlo, para
lo cual se hace uso del mtodo Print del objeto PrintDocument, tal como se muestra en el siguiente
cdigo:
pdt.Print()

Demo 65
Esta demostracin tiene por objetivo enserar a crear una pgina 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 botn "Preview" o
imprimir mediante el botn "Print".
Para ver la demostracin debemos realizar los siguientes pasos:
1. Crear una Aplicacin Windows en Visual Basic .NET llamada Demo65.
2. En la ventana del explorador de soluciones seleccionar el archivo Form 1 y en la ventana de
propiedades cambiar la propiedad FileName a frmlmpresion.
3. En el diseador 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

Propiedad

Valor

Form1

Name

frmImpresion

FormBorderStyle

FixedSingle

MaximizeBox

False

MinimizeBox

False

Size

Width=300,Height=300

StartPosition

CenterScreen

Text

Impresin en .NET con Drawing

10. CREANDO REPORTES DE DATOS

Label1

TextBox1

-5-

Name

lblMensaje

AutoSize

True

Location

X=16, Y=12

Text

Mensaje a imprimir

Name

txtMensaje

Location

Hand

Multiline

True

ScrollBars

Vertical

Size

Width=264 , Height= 188

Text
Button1

Name

btnPreview

Cursor

Hand

Location

X=16,Y=236

Size

Width=75 Height=23

Text
Button2

Name

btnPrint

Cursor

Hand

Location

X=204,Y=236

Size

Width=75 Height=23

Text
PrintDocument

Name

pdtMensaje

4. En la ventana explorador de soluciones dar clic en el botn "View Code".


5. Crear el procedimiento de evento CrearPaginaImprimir, que controle el evento "PrintPage" del
objeto "pdtMensaje" y escribir! siguiente cdigo:
Private Sub CrearPaginaImprimir(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdtMensaje.PrintPage
Dim Brocha As New SolidBrush(txtMensaje.ForeColor)
Dim X As Integer = e.MarginBounds.Left
Dim Y As Integer = e.MarginBounds.Top
With e.Graphics
.DrawString(txtMensaje.Text, txtMensaje.Font, Brocha, X, Y)
End With
End Sub

Nota: En el cdigo anterior las variables X e Y son usadas para imprimir el texto a partir del
margen actual.

6. Crear el procedimiento de evento PreviewConControl, que controle el evento "Click" del botn
"btnPreview" y escribir el siguiente cdigo:
Private Sub PreviewConControl(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPreview.Click
Dim ppcMensaje As New PrintPreviewControl()

10. CREANDO REPORTES DE DATOS

-6-

With ppcMensaje
.Document = pdtMensaje
.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

Nota: En el cdigo anterior se configura la propiedad Zoom a 2 (200%) para que se muestre el texto un
poco ms grande en el preview y se aprecie mejor.

Crear el procedimiento de evento ImprimirDocumento, que ocurra en el evento "Click' del botn
"btnPrint" y escribir el siguiente cdigo:
Private Sub ImprimirDocumento(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPrint.Click
pdtMensaje.Print()
End Sub

Nota: El mtodo Print permite enviar la salida de la pagina creada en el evento PrintPage y vista en el
Preview a la impresora.

8. Configurar frm Impresin como el formulario de inicio.


9. Grabar y ejecutar la aplicacin pulsando F5.

Figura 10.1: Ventana del formulario frm Impresin del Demo65

10. Escribir un texto cualquiera en el cuadro de texto y clic en el botn "Preview" para ver como
aparecer la salida.

10. CREANDO REPORTES DE DATOS

-7-

Figura 10.2: Ventana del formulario frmPreview del Demo65.


Advertencia: Si no tiene impresoras instaladas se generar una Excepcin al mostrar el Preview o mandar a
imprimir.

11. Cierre la ventana del Preview y luego si tiene una impresora instalada clic en el botn "Print"
para realizar la impresin.
12. Finalmente, cierre la ventana para salir de la aplicacin
CODIGO del formulario frmPreview del Demo65

Public Class frmImpresion


Inherits System.Windows.Forms.Form
Private Sub CrearPaginaImprimir(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdtMensaje.PrintPage
Dim Brocha As New SolidBrush(txtMensaje.ForeColor)
Dim X As Integer = e.MarginBounds.Left
Dim Y As Integer = e.MarginBounds.Top
With e.Graphics
.DrawString(txtMensaje.Text, txtMensaje.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 = pdtMensaje
.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
pdtMensaje.Print()
End Sub
End Class

10. CREANDO REPORTES DE DATOS

-8-

Demo 66
Esta demostracin tiene por objetivo ensear 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 "NorthWind" de SQL
Server y ejecuta un comando que llena una tabla de un DataSet con los cdigos, apellidos y nombres
de los Empleados. A partir de esta tabla se crea una vista la cual se enlaza a un control DataGrid.
La aplicacin tiene un men principal con una opcin de Reporte donde se puede realizar Preview de los
datos usando el PrintPreviewControl o imprimirlos usando el mtodo Print del objeto
PrintDocument.
Para ver la demostracin debemos realizar los siguientes pasos:
1.

Crear una Aplicacin Windows en Visual Basic .NET llamada


Demo66.

2.

En la ventana del explorador de soluciones seleccionar el


archivo Form 1 y en la ventana de propiedades cambiar la propiedad FileName a
frmReporteEmpleado.

3.

En el diseador de formularios Windows, arrastrar 1 control


DataGrid, 1 MainMenuy 1 PrintDocument, luego configurar las propiedades, tal como se muestra
en el siguiente cuadro:
Objeto

Propiedad

Valor

Form1

Name

frmReporteEmpleado

Size

Width=300, Height=300

StartPosition

CenterScreen

Text

Reporte de Empleados

Name

dgdEmpleado

Dock

Fill

ReadOnly

True

MainMenu1

Name

MnuPrincipal

PrintDocument

Name

Pdt

DataGrid1

4.

Seleccione el componente MainMenu y en la parte superior


donde dice "Type Here", escriba directamente los textos del men y configure sus propiedades, tal
como se muestra en el siguiente cuadro:
Objeto

Propiedad

Valor

MenuItem1

Name

mnuReporte

Text

Reporte

Name

mnuPreview

Text

Preview

MenuItem11

10. CREANDO REPORTES DE DATOS

MenuItem12

-9-

Name

mnuPrint

Text

Print

5.

En la ventana explorador de soluciones dar clic en el botn


"View Code".

6.

En la parte superior del cdigo (antes de la clase) definir los


Namespace del proveedor de SQL y de manejo de cadenas de texto:
Imports System.Data.SqlClient
Imports System.Text 'StringBuilder maneja

7.

cadenas

Declarar una variable privada para la vista de Empleados:


Private dvw As DataView

8.

Crear el procedimiento de evento CargarDatos que maneje el


evento "Load" del formulario y escribir el siguiente cdigo:
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 EmployeeID,LastName,FirstName
From Employees", con)
Dim dst As New DataSet()
dap.Fill(dst, "Empleados")
dvw = dst.Tables("Empleados").DefaultView
dgdEmpleado.DataSource = dvw
End Sub

9.

Crear el procedimiento de evento CrearPagina, que controle


el evento " PrintPage" del objeto "pdt" y escribir el siguiente cdigo:
Private Sub CrearPagina(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdt.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
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

Nota: En el cdigo anterior para concatenar usamos el objeto StrngBuilder ya que si lo hacemos con los
operadores "&" o "+" por cada llamada crearamos un objeto String, en cambio usando un slo objeto
StrngBuilder podemos realizar muchas concatenaciones con el mtodo Append.

10.

Crear el procedimiento de evento MostrarPreview, que


controle el evento "Click del men "mnuPreview" y escribir el siguiente cdigo:
Private Sub MostrarPreview(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPreview.Click
Dim ppc As New PrintPreviewControl()

10. CREANDO REPORTES DE DATOS

- 10 -

ppc.Document = pdt
ppc.Zoom = 1
ppc.Dock = DockStyle.Fill
Dim frmPreview As New Form()
With frmPreview
.Text = "Preview del Reporte de Empleados"
.WindowState = FormWindowState.Maximized
.Controls.Add(ppc)
.ShowDialog()
End With
End Sub

Nota: En el cdigo anterior se configura la propiedad Zoom a 1 (100%) para que se -^^J muestre
los datos de los empleados.
11. Crear el procedimiento de evento ImprimirReporte, que ocurra en el evento "Click" de men
"mnuPrint" y escribir el siguiente cdigo:
Private Sub ImprimirReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPrint.Click
pdt.Print()
End Sub

12. Configurar frmReporteEmpleado como el formulario de inicio


13. Grabar y ejecutar la aplicacin pulsando F5.

Figura 10.3: Ventana del formulario frmReporteEmpleado del Demo66

14 el men "Reporte11 seleccionar la opcin "Preview'

10. CREANDO REPORTES DE DATOS

- 11 -

Figura 10.4: Ventana del formulario frmPreview del Demo66.

Advertencia: Si no tiene impresoras instaladas se generar una Excepcin al mostrar el Preview o


mandar a imprimir.
15 Cerre la ventana del Prevew y luego si tiene una impresora instalada seleccione del men "Reporte la
opcin "Print" para realizar la impresin.
16 Finalmente, cierre la ventana para salir de la aplicacin.
Cdigo del formulario frmPreview del Demo66

Imports System.Data.SqlClient
Imports System.Text 'StringBuilder maneja cadenas
Public Class frmReporteEmpleado
Inherits System.Windows.Forms.Form
Private dvw As DataView
Dim CadenaConexion As String = "Persist Security Info=False;Integrated
Security=SSPI;Initial Catalog=Northwind;server=(local)"
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 EmployeeID,LastName,FirstName
From Employees", con)
Dim dst As New DataSet()
dap.Fill(dst, "Empleados")
dvw = dst.Tables("Empleados").DefaultView
dgdEmpleado.DataSource = dvw
End Sub
Private Sub CrearPagina(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdt.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
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

10. CREANDO REPORTES DE DATOS

- 12 -

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 mnuPreview.Click
Dim ppc As New PrintPreviewControl()
ppc.Document = pdt
ppc.Zoom = 1
ppc.Dock = DockStyle.Fill
Dim frmPreview As New Form()
With frmPreview
.Text = "Preview del Reporte de Empleados"
.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
pdt.Print()
End Sub
End Class

1.2. Usando Dilogos de Impresin


En esta parte veremos como trabajar con los dilogos de impresin, los cuales se pueden usar junto al
objeto PrintDocument para realizar una mejor presentacin y configuracin de la impresin.
Los dilogos de impresin son 3:

Dilogo de Presentacin Preliminar de Impresin (PrintPreviewDialog).

Dilogo de Configuracin de Pgina de Impresin (PageSetupDialog).

Dilogo de Impresin (PrintDialog).

1.2.1. Realizando un Preview con el PrintPreviewDialog


Despus de crear el documento a imprimir en el evento PrintPage del objeto PrintDocument podemos
realizar una mejor presentacin preliminar de ste, usando el dilogo de preview, el cual tiene
funcionalidad preconstruida para poder hacer zoom, ver varias pginas, imprimir, etc.
Como todo dilogo, 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.

UscAntiAlias

Obtiene o establece un valor que indica si la impresin utiliza la


caractersticas de alisado del sistema operativo.

Para trabajar con el dilogo de Preview, tan slo hay que configurar la propiedad Document del dilogo
en el objeto Prin Document, tal como sigue:
objPrintPreviewDialog.Document objPrintDocument

1.2.2. Configurando la Pgina con el PageSetupDialog


Tambin podemos configurar la pgina a imprimir mediante un dilogo, en donde podemos

10. CREANDO REPORTES DE DATOS

- 13 -

modificar el tipo de papel, el margen, la orientacin, etc.


Para esto se usa el objeto PageSetupDialog, el cual tiene las siguientes propiedades:
AllowMarfiins

Obtiene o establece un valor que indica si est habilitada la seccin de


mrgenes del cuadro de dilogo.

AllowOrientation

Obtiene o establece un valor que indica si est habilitada la seccin de


orientacin (horizontal o vertical) del cuadro de dilogo.

AllowPaper

Obtiene o establece un valor que indica si se habilita la seccin de papel (tamao


y origen de papel) del cuadro de dilogo.

AllowPrinter

Obtiene o establece un valor que indica si el botn Impresora est habilitado.

Document

Obtiene o establece un valor que indica el PrintDocument del que se obtendr


la configuracin de pgina.

MinMargins

Obtiene o establece un valor que indica los mrgenes mnimos que se permite
seleccionar al usuario en centsimas de pulgada.

PageSetting

Obtiene o establece un valor que indica la configuracin de pgina que se va a


modificar.

PrinterSettings

Obtiene o establece la configuracin de impresora que se modifica cuando el


usuario hace clic en el botn Impresora del cuadro de dilogo.

ShowHelp

Obtiene o establece un valor que indica si est visible el botn Ayuda.

ShowNetwork

Obtiene o establece un valor que indica si est visible el botn Red.

Para trabajar con el dilogo de configuracin de pgina hay que configurar la propiedad Document del
dilogo en el objeto PrintDocument, tal como sigue:
objPageSetupDialog.Document = objPrintDocument

Para mostrar el dilogo de configuracin de pgina llamar al mtodo ShowDialog:


obj PageSetupDialog.ShowDialog()

Adems para recuperar toda la configuracin del dilogo para que pueda ser usada por la impresin,
asignar en la propiedad DefaultPageSettings del objeto PrintDocument la propiedad PageSettings del
dilogo, tal como sigue:
obj PrintDocument.DefaultPageSettings =
obj PageSetupDialog.PageSettings

Nota: El dilogo de configuracin de pgina automticamente realiza este ltimo paso, es decir, toda la
configuracin seleccionada por el usuario en el dilogo es automticamente asignada al objeto PrintDocument.

1.2.3. Configurando la Impresin con el PrintDialog


Finalmente, podemos presentar un dilogo de impresin donde podamos seleccionar la impresora, el
nmero de pginas, el rango de pginas, el nmero de copias, guardar en un archivo, etc.
Para esto se usa el objeto PrintDialog, el cual tiene las siguientes propiedades:
AllowPnntToFile

Obtiene o establece un valor que indica si la casilla de verificacin Imprimir a


un archivo est activada.

10. CREANDO REPORTES DE DATOS

- 14 -

AllowSelection

Obtiene o establece un valor que indica si est habilitado el botn de opcin


Pgina desde... hasta...

AllowSomePages

Obtiene o establece un valor que indica si se habilita el botn de opcin


Pginas.

Document

Obtiene o establece un valor que indica el PrintDocument del que se


obtendr PrinterSettings.

PrinterSettings

Obtiene o establece la configuracin de impresora que se modifica en el cuadro


de dilogo.

PrintToFile

Obtiene o establece un valor que indica si la casilla de verificacin Imprimir a


un archivo est activada.

ShowHelp

Obtiene o establece un valor que indica si se muestra el botn Ayuda.

ShowNetwork

Obtiene o establece un valor que indica si se muestra el botn Red.

Para trabajar con el dilogo de impresin, tambin hay que configurar la propiedad Document del
dilogo en el objeto PrintDocument, tal como sigue:
objPrintDialog.Document = objPrintDocument

Demo 67
Esta demostracin tiene por objetivo ensear a crear una pagina a imprimir con un simple mensaje
mediante el objeto PrintDocument y usar los dilogos de presentacin preliminar, de configuracin de
pgina y de impresin.
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 botn
"Preview", configurar la pgina mediante el botn "Page Setup" o imprimir mediante el botn "Print".
Para ver la demostracin debemos realizar los siguientes pasos:
1. Crear una Aplicacin Windows en Visual Basic .NET llamada Demo67.
2. En la ventana del explorador de soluciones seleccionar el archivo Form 1 y en la ventana de
propiedades cambiar la propiedad FileName a frmlmpresion.
3. En el diseador 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:
Objeto

Propiedad

Valor

Form1

Name

frmImpresion

FormBorderStyle

FixedSingle

MaximizeBox

False

MinimizeBox

False

Size

Width=300,Height=300

StartPosition

CenterScreen

10. CREANDO REPORTES DE DATOS

Label1

TexBox1

- 15 -

Text

Impresiones en .NET con Drawing

Name

lblMensaje

Autosize

True

Location

X=16. Y=12

Text

Mensaje a Imprimir

Name

txtMensaje

Location

X=16, Y=36

Multiline

True

ScrollBars

Vertical

Size

Width=26,Height=188

Text
Button1

Name

btnPreview

Cursor

Hand

Location

X=16, Y=236

Size

Width=75, Height=23

Text

Preview

Name

btnPageSetup

Cursor

Hand

Location

X=110, Y=236

Size

Width=75, Height=23

Text

Page Setup

Name

btnPrint

Cursor

Hand

Location

X=204, Y=236

Size

Width=75, Height=23

Text

Print

PrintDocument1

Name

pdtMensaje

PrintPreviewDialog1

Name

ppdMensaje

PageSetupDialog

Name

psdMensaje

PrintDialog1

Name

pdgMensaje

Button2

Button3

4. En la ventana explorador de soluciones dar clic en el botn "View Code".


5. Crear el procedimiento de evento CrearPaginalmprimir, que controle el evento "PrintPage" del
objeto "pdtMensaje" y escribir el siguiente cdigo:
Private Sub CrearPaginaImprimir(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdtMensaje.PrintPage

10. CREANDO REPORTES DE DATOS

- 16 -

Dim Brocha As New SolidBrush(txtMensaje.ForeColor)


Dim X As Integer = e.MarginBounds.Left
Dim Y As Integer = e.MarginBounds.Top
With e.Graphics
.DrawString(txtMensaje.Text, txtMensaje.Font, Brocha, X, Y)
End With
End Sub

Nota: En el cdigo anterior las variables X e Y son usadas para imprimir el texto a partir del margen
actual.

6. Crear el procedimiento de evento PreviewConDialogo, que controle el evento "Click" del botn
"btnPreview" y escribir el siguiente cdigo:
Private Sub PreviewConDialogo(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPreview.Click
With ppdMensaje 'Dialogo de Preview
.Document = pdtMensaje
.Text = "Preview usando PrintPreviewDialog"
.WindowState = FormWindowState.Maximized
.ShowDialog()
End With
End Sub

Nota: En el cdigo anterior no se configura el zoom por cdigo ya que el dilogo automticamente presenta
botones de Zoom y otros botones.

7. Crear el procedimiento de evento ConfigurarPagina, que ocurra en el evento "Click" del botn
"btnPageSetup" y escribir el siguiente cdigo
Private Sub ConfigurarPagina(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPageStetup.Click
With psdMensaje 'Dialogo de Page Setup
.Document = pdtMensaje
.ShowDialog()
End With
End Sub

Nota: En el cdigo anterior no se configura el DefaultPageSettings del PrntDocument ya que el dilogo lo realiza
en forma automtica.

8.

Crear el procedimiento de evento ImprimirDocumento, que ocurra en el evento "Click del botn
"btnPrint" y escribir el siguiente cdigo:
Private Sub ImprimirDocumento(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnPrint.Click
With pdgMensaje 'Dialogo de Print
.Document = pdtMensaje
.AllowPrintToFile = False
.AllowSelection = True
.AllowSomePages = True
If .ShowDialog() = DialogResult.OK Then
pdtMensaje.PrinterSettings = .PrinterSettings
pdtMensaje.Print()
End If
End With
End Sub

Nota: En el cdigo anterior se configura las propiedades Allow del dilogo para permitir mostrar seleccin de
pginas en el dilogo de impresin. Tambin si el . usuario da clic en el botn "OK" del dialogo de imprimir,
entonces, se imprime el contenido del cuadro de texto.

9. Configurar frmlmpresion como el formulario de inicio.

10. CREANDO REPORTES DE DATOS

- 17 -

10. Grabar y ejecutar la aplicacin pulsando F5

Figura 10.5: Ventana del formulario frmlmpresion del Demo67

11.

Escribir un texto cualquiera en el cuadro de texto, clic en el botn "Preview" y se presentar un


dilogo similar a la figura 10.6.

Figura 10.6: Dilogo de Presentacin Preliminar del Demo67.


Observacin: Vea como el dilogo trae botones de impresin, zoom, nmero de pginas a ver y
cerrar ventana.

12.

Cierre la ventana del Preview y luego de clic al botn "Page Setup", mostrndose un dilogo
similar al de la figura 10.

10. CREANDO REPORTES DE DATOS

- 18 -

Figura 10.7: Dilogo de Configurar Pgina del Demo67.

13.

Proceda a configurar la pgina cambiando el tamao del papel, la orientacin y los mrgenes,
luego clic en "Aceptar" para cerrar el dilogo y realizar los cambios.

14.

Nuevamente de clic en el botn "Preview" para ver la presentacin de la pgina con los cambios
realizados, despus cierre el dilogo de Preview.

15.

Clic en el botn "Print" y se presentar el dilogo de impresin, similar al mostrado en la figura


10.8

10. CREANDO REPORTES DE DATOS

- 19 -

Figura 10.8: Dilogo de Impresin del Demo67.


16.

17.

Si tiene varias impresoras instaladas selecciona aqulla que se usar para imprimir el
documento, configure el intervalo de pginas a imprimir y el nmero de copias y luego clic en
"Aceptar" para realizar la impresin y cerrar el dilogo.
Finalmente, cierre la ventana para salir de la aplicacin

CODIGO del Formulario FrmImpresion del Demo67


Public Class frmImpresion
Inherits System.Windows.Forms.Form
Private Sub CrearPaginaImprimir(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdtMensaje.PrintPage
Dim Brocha As New SolidBrush(txtMensaje.ForeColor)
Dim X As Integer = e.MarginBounds.Left
Dim Y As Integer = e.MarginBounds.Top
With e.Graphics
.DrawString(txtMensaje.Text, txtMensaje.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 ppdMensaje 'Dialogo de Preview
.Document = pdtMensaje
.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 btnPageStetup.Click
With psdMensaje 'Dialogo de Page Setup
.Document = pdtMensaje
.ShowDialog()
End With
End Sub

10. CREANDO REPORTES DE DATOS

- 20 -

Private Sub ImprimirDocumento(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnPrint.Click
With pdgMensaje 'Dialogo de Print
.Document = pdtMensaje
.AllowPrintToFile = False
.AllowSelection = True
.AllowSomePages = True
If .ShowDialog() = DialogResult.OK Then
pdtMensaje.PrinterSettings = .PrinterSettings
pdtMensaje.Print()
End If
End With
End Sub
End Class

Demo 68
Hasta el momento todos los documentos que hemos creado para imprimir tenan una simple pgina.
Esta demostracin tiene por objetivo ensear a crear un documento con varias pginas de datos
obtenidos desde una base de datos. En sta trabajaremos con todos los dilogos de impresin.
El ejemplo trabaja con un formulario que al cargar se conecta a la base de datos "NorthWind" de SQL
Server y ejecuta un comando que llena una tabla de un DataSet con los cdigos de rdenes, fecha de
rdenes y cdigo de los clientes de la tabla Ordenes. A partir de esta tabla se crea una vista la cual se
enlaza a un control DataGrid.
La aplicacin tiene un men principal con una opcin de Reporte donde se puede realizar Preview de los
datos usando el PrintPreviewDialog, configurar la pgina usando el PageSetupDialog o imprimir
usando el PrintDialog.
Para ver la demostracin debemos realizar los siguientes pasos:
1.

Crear una Aplicacin Windows en Visual Basic .NET llamada Demo68.

2.

En la ventana del explorador de soluciones seleccionar el archivo Form1 y en la ventana de


propiedades cambiar la propiedad FileName a frmReporteOrden.

3.

En el diseador de formularios Windows, arrastrar un control DataGrid, un MainMenu y un


PrintDocument, un PrintPreviewDialog, un PageSetupDialog y un PrintDialog, luego configurar
las propiedades, tal como se muestra en el siguiente cuadro:
Objeto

Propiedad

Valor

Form1

Name

frmReporteOrden

Size

Width=300,Height=300

StarPosition

CenterScreen

Text

ReportedeOrdenes

Name

dgdOrden

Dock

Fill

ReadOnly

Trae

Name
Name

mnuPrincipal

DataGrid1

MainMenu1
PrintDocument1

Pdt

10. CREANDO REPORTES DE DATOS

- 21 -

PrintPreviewDialog1

Name

Ppd

PageSetupDialog

Name

Psd

PrintDialog1

Name

Pdg

4. Seleccione el componente MainMenu y en la parte superior donde dice "Type Here", escriba
directamente los textos del men y configure sus propiedades, tal como se muestra en el siguiente
cuadro:
Objeto

Propiedad

Valor

MenuItem1

Name

MnuReporte

Text

Reporte

Name

MnuPreview

Text

Reporte

Name

MnuPageSetup

Text

PageSetup

Name

MnuPrint

Text

Print

MenuItem11
MenuItem12
MenuItem13

5. En la ventana explorador de soluciones dar clic en el botn "View Code".


6. En la parte superior del cdigo (antes de la clase) definir los Namespace del proveedor de SQL y de
manejo de cadenas de texto:
Imports System.Data.SqlClient
Imports System.Text 'StringBuilder maneja cadenas

7. Declarar dos variables privadas, una para la vista de Empleados y otra para la posicin del
registro en la vista (contador de registro):
Private dvw As DataView
Private cr As Integer

8. Crear el procedimiento de evento CargarDatos que maneje el evento "Load" del formulario y
escribir el siguiente cdigo:
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 OrderID,OrderDate,CustomerID
From Orders", con)
Dim dst As New DataSet()
dap.Fill(dst, "Ordenes")
dvw = dst.Tables("Ordenes").DefaultView
dgdOrden.DataSource = dvw
End Sub

9. Crear el procedimiento de evento CrearDocumento, que controle el evento "PrintPage" del objeto
"pdt" y escribir el siguiente cdigo:
Private Sub CrearDocumento(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdt.PrintPage
Dim i As Integer
Dim stb As New StringBuilder()
Dim Texto As String
Dim Fuente As New Font("Courier New", 10)

10. CREANDO REPORTES DE DATOS

- 22 -

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

Notas:

Para que los textos de las columnas salgan del mismo ancho se usa la fuente "Courier New".
Para ahorrar memoria al momento de concatenar se usa el objeto StringBuilder.
La cantidad de lneas a imprimir de una pgina (LP) es obtenida dividiendo el alto del margen entre el alto de la
fuente.
Para crear una nueva pgina se usa la propiedad HasMorePage en True slo cuando el contador de registros
(cr) sea menor al ndice del ltimo registro (dvw.Count-1).
El proceso de creacin termina cuando no haya ms registros que mostrar, es decir cuando el contador de
registros llegue a la ltima posicin.

10. Crear el procedimiento de evento MostrarPreview, que controle el evento "Click" del men
"mnuPreview" y escribir el siguiente cdigo:
Private Sub MostrarPreview(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPreview.Click
ppd.Document = pdt
ppd.ShowDialog()
End Sub

11. Crear el procedimiento de evento ConfigurarPagina, que ocurra en el evento "Click" del men
"mnuPageSctup" y escribir el siguiente cdigo:
Private Sub ConfigurarPagina(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPageSetup.Click
psd.Document = pdt
psd.ShowDialog()
End Sub

12. Crear el procedimiento de evento ImprimirReporte, que ocurra en el evento "Click" del men
"mnuPrint" y escribir el siguiente cdigo:
Private Sub ImprimirReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPrint.Click
pdg.Document = pdt
If pdg.ShowDialog() = DialogResult.OK Then
pdt.PrinterSettings = pdg.PrinterSettings
pdt.Print()
End If
End Sub

13. Configurar frmReporteOrden como el formulario de inicio.


14. Grabar y ejecutar la aplicacin pulsando F5.

10. CREANDO REPORTES DE DATOS

- 23 -

Figura 10.9: Ventana del formulario frmReporteOrden del Demo68.

15. Del men "Reporte" seleccionar la opcin "Preview" y se mostrar el dilogo de presentacin
preliminar similar a la figura 10.10

Figura 10.10: Dilogo de Presentacin Preliminar del Demo

Observacin: Vea como.el documento tiene 13 pginas creadas para imprim


16. Cierre la ventana del Preview, luego si desea configure la pgina o realize la impresin mediante las
otras opciones del men de Reportes.
17. Finalmente, cierre la ventana para salir de la aplicacin
Codigo del frmReporteOrden del Demo68
Imports System.Data.SqlClient
Imports System.Text 'StringBuilder maneja cadenas
Public Class frmReporteOrden
Inherits System.Windows.Forms.Form
Private dvw As DataView

10. CREANDO REPORTES DE DATOS

- 24 -

Private cr As Integer
Dim CadenaConexion As String = "Persist Security Info=False;Integrated
Security=SSPI;Initial Catalog=Northwind;server=(local)"
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 OrderID,OrderDate,CustomerID From
Orders", con)
Dim dst As New DataSet()
dap.Fill(dst, "Ordenes")
dvw = dst.Tables("Ordenes").DefaultView
dgdOrden.DataSource = dvw
End Sub
Private Sub CrearDocumento(ByVal sender As System.Object, ByVal e As
System.Drawing.Printing.PrintPageEventArgs) Handles pdt.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
ppd.Document = pdt
ppd.ShowDialog()
End Sub
Private Sub ConfigurarPagina(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPageSetup.Click
psd.Document = pdt
psd.ShowDialog()
End Sub
Private Sub ImprimirReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles mnuPrint.Click
pdg.Document = pdt
If pdg.ShowDialog() = DialogResult.OK Then
pdt.PrinterSettings = pdg.PrinterSettings
pdt.Print()
End If
End Sub
End Class

2. Trabajando Reportes con Crystal Reports


En esta segunda parte ensearemos a crear y usar reportes mediante la herramienta Crystal Reports,

10. CREANDO REPORTES DE DATOS

- 25 -

primero daremos una breve revisin sobre ste, luego veremos sus componentes y finalmente
ensearemos a crear reportes o informes y a mostrarlos en nuestras aplicaciones Windows Forms .NET.

2.1. Breve Revisin sobre Crystal Reports


Crystal Reports para Visual Studio .NET es la herramienta de elaboracin de informes estndar para
Visual Studio .NET Permite crear contenido interactivo con calidad de presentacin en la
plataforma .NET, lo que ha supuesto una ventaja fundamental para Crystal Reports durante aos.
2.1.1.

Introduccin

Para presentar datos a los usuarios, puede escribir cdigo de modo que se lean conjuntos de registros
de manera cclica para luego imprimirlos en una aplicacin Web o de Windows. Sin embargo, en
trabajos que no se ajusten a un formato bsico podra resultar complicado: resulta compleja la
programacin de consolidaciones, totales de varios niveles, grficos y formatos condicionales.
Con Crystal Reports para Visual Studio .NET, puede crear rpidamente informes complejos de
apariencia profesional. En lugar de utilizar programacin, 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 creacin de grficos que especifique.
2.1.2.

Asistente de Informes

Los asistentes de Crystal Report permiten crear rpidamente informes en funcin de las necesidades
de desarrollo:
Seleccionar la opcin de diseo de informes que le interese, desde informes estndar hasta cartas
modelo, o bien cree sus propios informes partiendo de cero.
Mostrar grficos en los que los usuarios puedan profundizar con el fin de ver datos detallados de
los informes.
Calcular resmenes, 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.
2.1.3. Ventajas de Informes
Crystal Reports para Visual Studio .NET es un componente integrado del entorno de desarrollo de
Visual Studio .NET. Esta integracin proporciona a los usuarios las siguientes ventajas relacionadas
con la elaboracin de informes, las cuales la podemos dividir en dos:
1.

Para Programadores:

Seleccin del lenguaje y del proyecto:


Utilice el lenguaje de programacin que desee y obtenga acceso a Crystal Report Designer desde
cualquier 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.
Una vez seleccionado el marco de desarrollo. Crystal Reports proporciona el visor de informes
adecuado para la aplicacin y para el lenguaje de desarrollo utilizados. Estos visores de

10. CREANDO REPORTES DE DATOS

- 26 -

informes tambin se pueden personalizar; puede cambiar la apariencia y las opciones


disponibles de la barra de herramientas.

Personalizacin de visores para interactuar con otros controles:


Durante el diseo, inicie las propiedades de Web Forms Viewer y Windows Forms Viewer. O bien,
configure Web Forms Viewer o Windows Forms Viewer para interactuar con otros controles en
tiempo de ejecucin. La personalizacin en tiempo de ejecucin permite a los usuarios ver
distintos informes o cambiar el formato, la seleccin de datos o las opciones de exportacin de
un informe existente.

Modelo de objetos enriquecido:


El modelo de objetos de informe que muestra el motor de informes permite aadir cdigo al
archivo de cdigo fuente de la pgina de Windows Forms, lo que permite que el control
Windows Forms Viewer interacte con otros controles de la misma pgina.
Por ejemplo, el control Windows Forms puede interactuar con un botn o un cuadro
combinado para proporcionar a los usuarios opciones de exportacin y formato de informes.
2.

Para Usuarios:
Visualizacin de Crystal Reports en el Web.
Si desarrolla una aplicacin Web que contenga un informe o un servicio Web de informes, todos
los procesos se realizan en el servidor. Los usuarios slo necesitan un explorador Web. La
funcionalidad de los informes es la misma en el Web que en una aplicacin de Windows.
Acceso a informes perfectamente integrados:
Los usuarios no necesitan saber que estn accediendo a un informe cuando hacen clic en un
grfico de una aplicacin Web o de Windows. El control del visor de informes puede ser uno de
los muchos controles de la aplicacin.
Fcil interaccin con los informes:
Los usuarios pueden filtrar la informacin de los informes haciendo clic en un botn o
seleccionando una opcin de un cuadro combinado, ya que Crystal Reports para Visual
Studio .NET puede interactuar con otros controles.
Exportacin de informes:
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


La finalidad de esta seccin es explicar el uso del Window Forms Viewer y el Report Document, as
como la forma en la que interactan.
La principal finalidad de los controles Viewer es ver informes en la aplicacin que utiliza el usuario.
Los controles Viewer pueden pasarse como ruta a un archivo de informe o a un objeto
ReportDocument. Adems de mostrar informes, estos controles slo ejercen un control limitado sobre
el informe. Pueden establecer informacin de conexin y parmetros. Asimismo, sus posibilidades
de exportacin son limitadas.
El objeto ReportDocument ejerce mayor control sobre los informes. Tiene muchas propiedades y
muchos mtodos que permiten que el usuario controle la apariencia del informe mediante cdigo. Este

10. CREANDO REPORTES DE DATOS

- 27 -

objeto se puede utilizar tanto en una aplicacin de Windows como en una aplicacin Web; no obstante,
no puede ver los informes. En este punto es donde interactan los controles Viewer y el objeto
ReportDocument. Puede utilizar este objeto para realizar modificaciones y, a continuacin, pasarlo a
los controles Viewer para verlo.
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 mtodos necesarios para interactuar con un informe y
personalizarlo. Puede utilizar su mtodo 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 aplicacin, esta
referencia se agregar automticament

Propiedades

ReportDocument contiene muchas propiedades que permiten al usuario personalizar y controlar la


apariencia y el comportamiento del informe. A continuacin describimos los objetos y las
colecciones principales de ReportDocument:
Database:
El objeto Datbase proporciona acceso a la informacin de la base de datos contenida en el
informe. El objeto Datbase contiene una coleccin Tables. Esta coleccin contiene muchos
objetos Table, que componen todas las tablas utilizadas en el informe. El objeto Table le
permite obtener o establecer la informacin de conexin mediante el objeto Connectionlnfo.
Adems, proporciona informacin sobre todos los campos que estn disponibles en la tabla a
travs de la coleccin DatabaseFieldDefinitions.
DataDefinition:
El objeto DataDefnition proporciona acceso a los siguientes campos: campos de parmetros,
campos de ordenacin, campos de nombre de grupo, campos de resumen, campos de totales
acumulados y campos de enunciados SQL. Este objeto tambin proporciona acceso a los grupos
que se utilizan en el informe.

ExportOptions:
El objeto ExportOptions proporciona las propiedades para recuperar y establecer las opciones
de exportacin del informe. ExportOptions se utiliza para establecer las opciones de destino
(disco, correo electrnico e intercambio) y el tipo de exportacin (Excel, PDF, Word y HTML).

PrintOptions:
El objeto PrintOptions proporciona las propiedades y los mtodos para establecer las opciones
de impresin de un informe. Algunas de las propiedades que puede establecer son el nombre de
la impresora, el tamao y la orientacin del papel, as como los mrgenes de pgina.

10. CREANDO REPORTES DE DATOS

Figura 10.11 Modelo de Objetos de ReportDocument

- 28 -

10. CREANDO REPORTES DE DATOS

- 29 -

ReportDefinition:
El objeto ReportDefinition permite recuperar todas las clases reas, ReportObjects y Section de un
informe. Esto le permite obtener y establecer las opciones de formato de estos elementos para que
pueda personalizarse la apariencia del informe.
ReportOptions:
El objeto ReportOptions le permite obtener y establecer los datos relacionados con las
opciones
del
informe
(EnableSaveDataWithReport,
EnableSavePreviewPicture,
EnableSaveSummariesWithReport y EnableUseDummyData) de un informe.

Summarylnfo

El objeto Summari Info le permite obtener y definir la informacin de resumen del informe. Incluye
Keyword:iReport, ReportAuthor, ReportComments, ReportSubjecty ReportTitle.
2.2.2. Windows Forms Viewer
Si programa una aplicacin Windows, puede almacenar un informe en Windows Forms con "Crystal
Reports Windows Forms Viewer", que est disponible como control en el cuadro de herramientas de
Visual Stiudio (CrystalReportView).
Adems de proporcionar la comodidad de ver informes en una aplicacin de Windows, Windows Forms
Viewer puede interactuar con otros controles de la misma aplicacin y actualizar de forma dinmica el
informe que contiene

Figura 10.12: Modelo de Objetos de Window Forms Viewer

10. CREANDO REPORTES DE DATOS

- 30 -

Propiedades

Windows Forms Viewer contiene propiedades que le permiten al usuario personalizar y controlar la
apariencia y el comportamiento del informe. A continuacin describimos los objetos y las colecciones
principales de Windows Forms Viewer:
TableLogOnInfos:
TableLogOnInfos proporcionar acceso a la coleccin TableLogOnlnfo. El objeto
TableLogOnlnfo proporciona propiedades para recuperar y establecer las opciones de
conectividad de la tabla como: nombre de servidor, nombre de usuario, nombre de la base de
datos y contrasea.
ParameterFields:
El objeto ParameterFields proporciona acceso a la coleccin ParameterField. Este objeto le
permite obtener y establecer la informacin de los parmetros del informe. Por ejemplo, puede
establecer propiedades para recuperar y establecer las opciones y los valores de un campo de
parmetro. Por ejemplo: los valores actuales, los valores predeterminados y el texto de
confirmacin.
ReportSource:
La propiedad ReportSource se utiliza para establecer el origen del informe. Puede ser un objeto
ReportDocument o una cadena que contenga la ubicacin del archivo del informe.

2.3. Creando Reportes con Crystal Reports


En esta seccin veremos como crear reportes usando el Crystal Report Designer y como
visualizarlos en una aplicacin Windows usando el CrystalReportViewer.
2.3.1. Diseando el Informe con Crystal Report Designer
Crystal Report Designer permite disear y modificar reportes dentro del Entorno de Programacin
Integrado (IDE) de Visual Studio .NET.
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 disear el reporte.
Nota: Para aprender a crear un DataSet con tipo consulte la seccin 2 del Captulo 6.
2. Del men "Project", seleccionar "Add New tem..." o pulsar las teclas [Ctrl] + [Shift] + [A].
3. Del dilogo de Aadir Nuevo Elemento seleccionar "Crystal Report".
4. Escribir el nombre del reporte y clic en el botn "Open".
5. Aparecer un dilogo de "Registro del Software", clic en el botn "Register Later" para indicar
que despus se registrar.
6. Se mostrar la ventana de dilogo de Galera de Reportes, similar al de la figura 10.13

10. CREANDO REPORTES DE DATOS

- 31 -

Figura 10.13: Ventana de Galera de Reportes de Crystal Report.


7. En la seccin "Crate a New Crystai Report Document" seleccionar la primera opcin "Using
the Report Expert" para indicar que el reporte se generar con el asistente de reportes.
8. En la seccin "Choose an Expert" seleccionar "Standard" para indicar que se desea crear un reporte
estndar (hoja A4).
9. Clic en el botn "OK" y aparecer la ficha "Data" de la ventana del "Report Expert", similar a la
figura 10.14.

10. CREANDO REPORTES DE DATOS

- 32 -

Figura 10.14: Ficha "Data" de la Ventana del "Report Expert

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 botn "Insert Table".
Nota: Pueden usarse ms de una tabla en el caso de crear reportes agrupados.
12. Clic en el botn "Next" y se mostrar la ficha "Fields" del "Report Expert", similar a la de la
figura 10.15.

10. CREANDO REPORTES DE DATOS

- 33 -

Figura 10.15: Ficha "Fields" de la Ventana del "Report Expert'

13. Seleccionar los campos que se mostrarn en el reporte y clic en el botn "Add", si se desean pasa
todos clic en "Add All
Nota: Despus de pasar los campos, se pueden seleccionar y cambiar el ttulo de las
cabeceras en la opcin "Column Heading".
14. Clic en el botn "Next" y se mostrar la ficha "Group" del "Report Expert", similar a la de la figura
10.16

10. CREANDO REPORTES DE DATOS

- 34 -

Figura 10.16: Ficha "Group" de la Ventana del "Report Expert

15. Si desea agrupar los registros por algn campo en comn que tengan stos seleccionar dicho
campo y clic en el botn "Add"
16. Clic en el botn "Next" y si eligi Agrupar por algn campo se ver la ficha "Total" del "Report
Expert", similar a la de la figura 10.17.

10. CREANDO REPORTES DE DATOS

- 35 -

Figura 10.17: Ficha 'Total" de la Ventana del "Report Expert".

17.

Seleccionar los campos que se mostrarn como clculos en el pie de los detalles, luego
seleccionar cada uno y elegir la funcin que se quiere mostrar; contar, suma, promedio,
mximo, mnimo, etc.

18.

Clic al botn "Next" y si eligi Agrupar por algn campo se ver la ficha "Top N" del
"Report Expert", similar a la de la figura 10.18

10. CREANDO REPORTES DE DATOS

- 36 -

Figura 10.18: Ficha "Top N" de la Ventana del "Report Expert"

19.

Si desea puede sspecificar ordenar los datos agrupados basados en un total o clculo
creado.

20.

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

10. CREANDO REPORTES DE DATOS

- 37 -

Figura 10.19: Ficha "Chart" de la Ventana del "Report Expert


21.

Si desea puede crear un grfico de datos, seleccionando el tipo de grfico, los datos a graficar y
los ttulos del grfico.

22. Clic al botn "Next" y se ver la ficha "Select" del "Report Expert", similar a la de la figura 10.20

10. CREANDO REPORTES DE DATOS

- 38 -

Figura 10.20: Ficha "Select" de la Ventana del "Report Expert

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

10. CREANDO REPORTES DE DATOS

- 39 -

Figura 10.21: Ficha "Style" de la Ventana del "Report Expert".

25.

Escribir el ttulo que ir en el informe y seleccionar el estilo de informe deseado y clic en


el botn "Finish" para crear el reporte

26.

Inmediatamente se presentar sobre el diseador de reportes el reporte creado, similar a


la figura 10.22

Figura 10.22: Vista del reporte en el "Crystal Report Designer".

10. CREANDO REPORTES DE DATOS

- 40 -

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

Figura 10.23: Ficha "Crystal Reports" del "ToolBox"


Nota: Los controles del cuadro de herramientas slo permiten insertar cuadros de texto, lneas y
recuadros. Si desea insertar otro tipo de objetos use las barras de herramientas que a
continuacin explicamos.

Tambin 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 caractersticas de los controles
diseados en el reporte, tal como la fuente, tamao, alineacin. Adems permite cambiar
caractersticas 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 grfico de datos o insertar una imagen.
29. Finalmente despus de realizar cambios al reporte, proceda a grabarlo.
Nota: Los reportes creados en el Crystal Reports tienen la extensin rpt.
2.3.2. Presentando el Informe en Windows Forms Viewer
Una vez creado el reporte con el diseador de reportes es necesario presentarlo en una aplicacin de
Windows Forms, para lo cual se usa el visor de reportes para formularios Windows, en ingls
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 aplicacin Web con ASP .NET ser el Web Forms
Viewer.
En este caso veremos slo el visor de las aplicaciones Windows, el cual se encuentra en el

10. CREANDO REPORTES DE DATOS

- 41 -

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

Retroceder pgina.

Ir a una pgina especificada.

Avanzar pgina.

Ir a la ltima pgina.

Cerrar ventana activa (slo para grupo o subinforme).

Imprimir informe.

Actualizar informe.

Exportar un informe.

Mostrar/ocultar e! rbol de grupos.

Aumentar/reducir informe.

Buscar

Puede personalizar ms la barra de herramientas programando con la descripcin de clase de


Windows Forms Viewer. Por ejemplo, para ocultar el icono Buscar, establezca la propiedad
ShowTextSearchButton en False.
Como alternativa a la utilizacin de la barra de herramientas predeterminada, puede ocultar la barra
de herramientas completa estableciendo la propiedad DisplayToolbar en False. A continuacin, 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 mtodos, las propiedades y los eventos
de Windows Forms Viewer.
2.

rbol de Grupos

El visor de reportes tambin contiene un rbol de grupos ubicado en el lado derecho, ste slo
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 smbolo + que aparece junto a
cada nodo del mismo.

10. CREANDO REPORTES DE DATOS

- 42 -

Demo 69
Esta demostracin tiene por objetivo ensear a 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 informacin de los
Clientes de la BD "Northwind" de SQL Server. En el reporte se muestran el cdigo, nombre y direccin
de los clientes.
Para ver la demostracin debemos realizar los siguientes pasos:
1.

Crear una Aplicacin Windows en Visual Basic .NET llamada Demo69.

2.

En la ventana del explorador de soluciones seleccionar el archivo Form 1 y en la ventana de


propiedades cambiar la propiedad FileName a frmReporteCliente.

3.

En el diseador de formularios Windows, arrastrar un control CrystalReportViewer, luego


configurar las propiedades, tal como se muestra en el siguiente cuadro:
Objeto

Propiedad

Valor

Form1

Name

frmReporteCliente

StartPosition

CenterScreen

Text

Reporte de Clientes

WindowsState

Maximizad

Name

Crv

DisplayGroupTree

False

Dock

Fill

CrsytalReportViewer

4.

Del men "View " elegir la opcin "Server Explorer" o pulsar las teclas [Ctrl] + [Alt] + [S].

5.

Expandir en la seccin "Servers", "Nombre Maquina", "SQL Servers", "Nombre Servidor


SQLY'Northwind".

6.

Expandir la tabla "Customers" y seleccionar sus campos CustomerlD, CompanyName y


Address.

7.

Arrastrar los campos hacia cualquier parte del formulario y automticamente se crearn dos
objetos: un SqlConncctionl y un SqlDataAdapter1 conteniendo todas las instrucciones SQL
para la tabla Clientes (por defecto: Select, Insert, Update y Delete).

8.

En el diseador de componentes seleccionar el objeto "SqlConnection 1" y cambiarle de nombre


por con. Luego seleccionar el "SqlDataAdapterl" y renombrarlo a dap.

9.

Clic derecho al objeto "dap" y del men contextual seleccionar "Generate DataSet".

10.

Aparecer un dilogo, en la opcin Elegir un DataSet, por defecto aparece "Nuevo", escribir el
nombre para el DataSet como dst.

11.

En la lista de tablas seleccionar la tabla Customers (dap) y clic en "OK".

12.

Inmediatamente se crear en esquema XML llamado "dst" y un objeto DataSet con tipo llamado
"Dstl".

10. CREANDO REPORTES DE DATOS

13.

- 43 -

Del men "Project", seleccionar "Add New tem" o pulsar las teclas [Ctrl] + [Shifl] + [A].

14. Del dilogo de Aadir Nuevo Elemento seleccionar "Crystal Report".


15. Escribir en el nombre del reporte Reporte_Clientes y clic en el botn "Open".
16. Aparecer un dilogo de "Registro del Software", clic en el botn "Register Later" para indicar
que despus se registrar.
17. Se mostrar la ventana de dilogo de Galera de Reportes (figura 10.13).
18. En la seccin "Crate a New Crystal Report Document" seleccionar la primera opcin "Using the
Report Expert" para indicar que el reporte se generar con el asistente de reportes.
19. En la seccin "Choose an Expert" seleccionar "Standard" para indicar que se desea crear un reporte
estndar (hoja A4).
20. Clic en el botn "OK" y aparecer la ficha "Data" de la ventana del "Report Expert" (figura 10.14).
21. Expandir el icono de "Project Data", "ADO .NET DataSets" y luego el DataSet "dst".
22. Seleccionar la tabla "Customers" y clic en el botn "Insert Table".
23.

Clic en el botn "Next" y se mostrar la ficha "Fields" del "Report Expert" (figura 10.15).

24.

Clic en el botn "Add All" para mostrar todos los campos en el reporte.

25.

Despus de pasar los campos, modificar los ttulos de las cabeceras, para el primer campo Cdigo,
para el segundo Nombre y para el tercero Direccin.

26.

Clic en el botn "Next" y se mostrar la ficha "Group" del "Report Expert" (figura 10.16).

27.

Clic nuevamente en el boln "Next" ya que nuestro reporte es simple y no tiene


agrupaciones, se mostrar la ficha "Chart" del "Report Export" (figura 10.19).

28.

Clic en "Next" para indicar que no deseamos un grfico de datos y se mostrar la ficha "Select"
del "Report Export" (figura 10.20).

29.

Clic en "Next" para indicar que no deseamos filtrar y se ver la ficha "Style" del "Report Export"
(figura 10.21).

30.

Escribir como ttulo del reporte "Lista de Clientes Northwind" y seleccionar el ltimo estilo de la
lista.

31.

Clic en el botn "Finish" para crear el reporte y aparecer el Crystal Report Designer, por si
deseamos hacer algn cambio.

32.

Regresar al formulario y en la ventana explorador de soluciones dar clic en el botn " View Code".

33.

Crear el procedimiento de evento MostrarReporte, que maneje el evento "Load" del


formulario y escribir el siguiente cdigo:
Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(Dst1, "Customers")
Dim rpt As New Reporte_Clientes()
rpt.SetDataSource(Dst1)
crv.ReportSource = rpt
End Sub

Notas:
El reporie creado con el Crystal Report es una clase, por tanto hay que crear un objeto para trabajar con esta
(rpt).

10. CREANDO REPORTES DE DATOS

- 44 -

El objeto de reporte tiene un mtodo SetDataSource donde hay que pasar como parmetro el origen del
reporte, es decir, el DataSet (Dstl).
Para que se pueda visualizar el reporte en el visor de reportes de Windows hay que configurar la propiedad
ReportSource del visor asignndole el objeto del reporte (rpt).

34.

Configurar frmReporteCliente como el formulario de inicio.

35.

Grabar y ejecutar la aplicacin pulsando F5.

Figura 10.27: Ventana del formulario frmReporteCliente del Demo69.

36.

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

37.

Finalmente, cierre la ventana para salir de la aplicacin.

Codigo del FrmReporte del Demo69

Public Class frmReporteCliente


Inherits System.Windows.Forms.Form
Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap.Fill(Dst1, "Customers")
Dim rpt As New Reporte_Clientes()
rpt.SetDataSource(Dst1)
crv.ReportSource = rpt
End Sub
End Class

Demo 70
Esta demostracin tiene por objetivo ensear a crear un reporte de datos con quiebres o
agrupamientos y subtotales o clculos, usando para ello el Crystal Report Export, el Report Designer y el

10. CREANDO REPORTES DE DATOS

- 45 -

CrystalReportViewer.
El ejemplo trabaja con un formulario que muestra en un control visor de reportes informacin de las
Ordenes y sus Detalles de la BD "Northwind" de SQL Server.
En el reporte se muestran en la cabecera los datos de la orden, como cdigo de orden, fecha de la orden,
nombre del cliente y apellido del empleado; mientras que en el detalle se aprecia el nombre del
producto, precio unitario, cantidad y precio total. Tambin se muestran como subtotales el Total de
tems y el Valor Total de todos los detalles de la Orden.
Para ver la demostracin debemos realizar los siguientes pasos:
1.

Crear una Aplicacin Windows en Visual Basic .NET llamada Demo70.

2.

En la ventana del explorador de soluciones seleccionar el archivo Form 1 y en la ventana de


propiedades cambiar la propiedad FileName a frmReporteDetallesOrden.

3.

En el diseador de formularios Windows, arrastrar un control CrystalReportViewer, luego


configurar las propiedades, tal como se muestra en el siguiente cuadro:
Objeto

Propiedad

Valor

Form1

Name

FrmReporteDetallesOrden

StartPosition

CenterScreen

Text

Reporte de Detalles de Ordenes

WindowsState

Maximizad

Name

Crv

DisplayGroupTree

True

Dock

Fill

CrsytalReportViewer

4.

Del ToolBox seleccionar la ficha "Data" y arrastrar el control "SqlDataAdapter".

5.

Inmediatamente se mostrar el "DataAdaptcr Wizard", clic al botn "Next".

6.

Seleccionar la conexin a la base de datos "Northwind" y clic en "Next".

7.

En el tipo de consulta elegir la primera "Usar instruccin SQL" y clic en "Next".

8.

En el dilogo de "Generar instruccin SQL" clic al botn "Query Builder".

9.

De la lista de tablas seleccionar Orders, Customers y Employees y agregarlas con el botn


"Add", luego "Close".

10. Seleccionar la tabla "Orders y elegir los campos: OrderID y OrderDate. Seleccionar la tabla
"Customers" y elegir el campo CompanyName. Seleccionar la tabla "Employees" y elegir el campo
LastName.
11. Clic al botn "Aceptar" del Query Builder y regresaremos a la ventana de "Generar instruccin
SQL".
12. Clic en el botn "Advanced Options..." y en el dilogo de Opciones Avanzadas desactivar la
primera opcin "Generar instrucciones Insert, Update y Delete", luego clic en el botn "OK".
13. Regresaremos a la Ventana de configuracin del DataAdapter Wizard con la configuracin
seleccionada, clic al botn "Next".
14. Inmediatamente se presentar la ventana con el Resultado, clic en el botn "Finish" y se crearn los

10. CREANDO REPORTES DE DATOS

- 46 -

objetos "SqlConnection1" y "SqlDataAdapter1".


15. En el diseador de componentes seleccionar el objeto "SqlConnection 1" y cambiarle de nombre a
con. Tambin seleccionar el objeto "SqlDataAdapterl" y cambiarle de nombre a dapl.
16. Repetir los pasos del 4 al 14 para crear otro SqlDataAdapter que permita mostrar de la tabla "Order
Details" los campos: OrderID, UnitPrice, Quantity y el campo calculado Total (UnitPrice x
Quantity), adems de la tabla "Products" el campo ProductName.
17. En el diseador de componentes seleccionar el objeto "SqlDataAdapter2" creado y cambiarle de
nombre a dap2.
18. Clic derecho al objeto "dap1" y del men contextual seleccionar "Generate DataSet".
19. Aparecer un dilogo, en la opcin Elegir un DataSet, por defecto aparece "Nuevo", escribir el
nombre para el DataSet como dst.
20. En la lista de tablas seleccionar las tablas: "Orders" (dapl) y "Order Details" (dap2), luego clic en
"OK".
21. Inmediatamente se crear un esquema XML llamado "dst" y un objeto DataSet con tipo llamado
"Dstl".
22. Del men "Project", seleccionar "Add New tem" o pulsar las teclas [Ctrl] + [Shift] + [A].
23. Del dilogo de Aadir Nuevo Elemento seleccionar "Crystal Report",
24. Escribir en el nombre del reporte Reporte_DetallesOrdenes y clic en el botn "Open".
25. Aparecer un dilogo de "Registro del Software", clic en el botn "Register Later" para indicar que
despus se registrar.
26. Se mostrar la ventana de dilogo de Galera de Reportes (figura 10.13).
27. En la seccin "Crate a New Crystal Report Document" seleccionar la primera opcin "Using the
Report Expert" para indicar que el reporte se generar con el asistente de reportes.
28. En la seccin "Choose an Expert" seleccionar Standard para indicar que se desea crear un reporte
estndar (hoja A4).
29. Clic en el botn "OK" y aparecer la ficha "Data" de la ventana del "Report Expert" (figura 10.14).
30. Expandir el icono de "Project Data", "ADO .NET DataSets" y luego el DataSet "dst".
31. Seleccionar las tablas "Orders" y "Oder Details" y clic en el botn "Insert Table".
32. Como son dos tablas relacionadas se mostrar una nueva ficha "Link" similar a la de la figura
10.28

10. CREANDO REPORTES DE DATOS

- 47 -

Figura 10.28: Ficha "Link" de la Ventana del "Report Expert".


33. Clic en el botn "Next" y se mostrar la ficha "Fields" del "Report Expert" (figura 10.15).
34. Seleccionar y pasar los campos que se vern en la seccin de detalles del reporte que son:
ProductNamc, UnitPrice, Quantity y Total.
35. Clic en el botn "Next" y se mostrar la ficha "Group" del "Report Expert" (figura 10.16).
36. Seleccionar y pasar el campo por el cual se desea agrupar que es OrderID de la tabla "Orders".
37. Clic en el botn "Next" y se mostrar la ficha "Total" del "Report Export" (figura 10.17).
38. Seleccionar y pasar los campos que tendrn subtotales, que son OrderID y Total de la tabla
"OrderDetails".
39. Luego seleccionar OrderID y cambiar la funcin a count, tambin seleccionar Total y cambiar la
funcin a sum.
40. Clic en el botn "Next" y se mostrar la ficha "Top N" del "Report Export' (figura 10.18).
41. Clic en el botn "Next" y se mostrar la ficha "Chart" del "Report Export" (figura 10.19).
42. Clic en el botn "Next" y se mostrar la ficha "Select" del "Report Export" (figura 10.20).
43. Clic en el botn "Next" y se mostrar la ficha "Style" del "Report Export" (figura 10.21).
44. Escribir como ttulo del reporte "Lista de Detalles de Ordenes" y seleccionar el ltimo estilo de la
lista.
45. Clic en el botn "Finish" para crear el reporte y aparecer el Crystal Report Designer, por si

10. CREANDO REPORTES DE DATOS

- 48 -

deseamos hacer algn cambio.


46. Regresar al formulario y en la ventana explorador de soluciones dar clic en el botn "View Code".
47. Crear el procedimiento de evento MostrarReporte, que maneje el evento "Load" del formulario y
escribir el siguiente cdigo:
Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap1.Fill(Dst1, "Orders")
dap2.Fill(Dst1, "Order Details")
Dim rpt As New Reporte_DetallesOrdenes()
rpt.SetDataSource(Dst1)
crv.ReportSource = rpt
End Sub

48. Configurar frmReporteDetallesOrden como el formulario de inicio.


49. Grabar y ejecutar la aplicacin pulsando F5.

Figura 10.29: Ventana del formulario frmReporteDetallesOrden del Demo70.


Consejo: Puede irse a tomar un caf mientras aparece el reporte, el cual tomar unos minutos.

50. Una vez mostrado el reporte podemos navegar directamente hacia una orden a travs del rbol de
Grupos ubicado en la parte izquierda del visor.
51.

Finalmente, cierre la ventana para salir de la aplicacin

CODIGO DEL FORMULARIO frmReporteDetallesOrden del Demo70


Public Class frmReporteDetallesOrden
Inherits System.Windows.Forms.Form

10. CREANDO REPORTES DE DATOS

- 49 -

Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles MyBase.Load
dap1.Fill(Dst1, "Orders")
dap2.Fill(Dst1, "Order Details")
Dim rpt As New Reporte_DetallesOrdenes()
rpt.SetDataSource(Dst1)
crv.ReportSource = rpt
End Sub
End Class

Demo 71
Esta demostracin tiene por objetivo ensear a crear un reporte de datos que use procedimientos
almacenados, tanto sin parmetros como con parmetros, usando para los reportes el Crystal Report
Export, el Report Designery el CrystalReportViewer.
El ejemplo trabaja con dos formularios, uno creado en tiempo de diseo que muestra las
"Categoras" de productos en un ComboBox, las cuales se obtienen ejecutando un procedimiento
almacenado sin parmetros.
Al seleccionar una categora se crea un formulario en tiempo de ejecucin donde se muestra en un
visor el reporte de Productos de dicha categora, el cual se obtiene ejecutando un procedimiento
almacenado con un parmetro.
Para ver la demostracin debemos realizar los siguientes pasos:
1. En el Visual Studio .NET, del men "View" seleccionar "Server Explorer".
2. Expandir el servidor y luego la base de datos "Northwind".
3. En el icono de "Stored Procedures" dar clic derecho y seleccionar "New Stored Procedure".
4. Crear un procedimiento que permita Listar las Categoras:
CREATE PROCEDURE up_Categoria_Listar
As
Select CategoryID,CategoryName From Categories

5. Crear un procedimiento que permita Listar los Productos de una Categora:

ALTER PROCEDURE up_Producto_ListarPorCategoria


@CategoryID int
As
Select ProductID,ProductName,UnitPrice,CategoryID From Products
Where CategoryID=@CategoryID

6. Crear una Aplicacin Windows en Visual Basic .NET llamada Demo71.


5. En la ventana del explorador de soluciones seleccionar el archivo Forml y en la ventana de
propiedades cambiar la propiedad FileName a frmReporteProductosCategoria.
6. En el diseador de formularios Windows, arrastrar un control ComboBox y un Button, luego
configurar las propiedades, tal como se muestra en el siguiente cuadro:
Objeto

Propiedad

Valor

Form1

Name

frmReporteProductosCategoria

MaximizeBox

False

10. CREANDO REPORTES DE DATOS

ComboBox1

Button1

- 50 -

MinimizeBox

False

Size

Width=300 ,Height=180

Star Position

CenterScreen

Text

Selecciona Categora del Producto

Name

cboCategoria

DropDownStyle

DropDownList

Location

X=16,Y=24

Size

Width=260,Height=21

Name

BtnReporte

Cursor

Hand

Location

X=66,Y=84

Size

Width=160,Height=21

Text

Ver Reporte de Productos

9. Del ToolBox seleccionar la ficha "Data" y arrastrar el control "SqlDataAdapter".


10. Inmediatamente se mostrar el "ataAdapter Wizard", clic al botn "Next".
11. Seleccionar la conexin a la base de datos "Northwind" y clic en "Next".
12. En el tipo de consulta elegir la tercera "Usar procedimiento almacenado existente" y clic
en "Next".
13. En el dilogo de "Enlace a procedimientos almacenados" de a lista del "Select" elegir
"up_Categora_Listar".
14. Clic al botn "Next" e inmediatamente se presentar la ventana con el Resultado de la creacin.
15. Clic en el botn "Finish" y se crearn los objetos "SqlConnectionl" y "SqlDataAdapterl".
16. En el diseador de componentes seleccionar el objeto "SqlConnectionl" y cambiarle de nombre a
con. Tambin seleccionar el objeto "SqlDataAdapter 1" y cambiarle de nombre adapl.
17. Repetir los pasos del 9 al 15 para crear otro SqlDataAdapter que permita ejecutar el procedimiento
"up_Producto_ListarPorCategoria".
18. En el diseador de componentes seleccionar el objeto "SqlDataAdapter2" creado y cambiarle de
nombre a dap2.
19. Clic derecho al objeto "dap1" y del men contextual seleccionar "Generate DataSet".
20. Aparecer un dilogo, en la opcin Elegir un DataSet, por defecto aparece "Nuevo", escribir el
nombre para el DataSet como dst.
21. En la lista de tablas seleccionar las tablas: "upCategoriaListar" (dapl)y "up Producto
ListarPorCategoria" (dap2), luego clic en "OK".
22. Inmediatamente se crear un esquema XML llamado "dst" y un objeto DataSet con tipo llamado
"Dstl".
23. Del men "Project", seleccionar "Add New tem..." o pulsar las teclas [Ctrl] + [Shift] + [A].

10. CREANDO REPORTES DE DATOS

- 51 -

24. Del dilogo de Aadir Nuevo Elemento seleccionar "Crystal Report".


25. Escribir en el nombre del reporte Reporte_ProductosPorCategoria y clic en el botn "Open".
26. Aparecer un dilogo de "Registro del Software", clic en el botn "Register Later" para indicar
que despus se registrar.
27. Se mostrar la ventana de dilogo de Galera de Reportes (figura 10.13).
28. En la seccin "Crate a New Crystal Report Document" seleccionar la primera opcin "Using the
Report Expert" para indicar que el reporte se generar con el asistente de reportes.
29. En la seccin "Choose an Expert" seleccionar "Standard" para indicar que se desea crear un reporte
estndar (hoja A4).
30. Clic en el botn "OK" y aparecer la ficha "Data" de la ventana del "Report Expert" (figura
10.14).
31. Expandir el icono de "Project Data", "ADO .NET DataSets" y luego el DataSet "dst".
32. Seleccionar las dos tablas del DataSet y clic en el botn "Insert Table".
33. Como son 2 tablas relacionadas se mostrar la ficha "Link" (figura 10.28).
34. Clic en el botn "Next" y se mostrar la ficha "Fields" del "Report Expert" (figura 10.15).
35. Seleccionar y pasar los campos que se vern en la seccin de detalles del reporte que son:
CatcgorylD, ProductID, ProductNamey UnitPrice.
36. Clic en el botn "Next" y se mostrar la ficha "Group" del "Report Expert" (figura 10.16).
37. Seleccionar y pasar el campo por el cual se desea agrupar que es CategorylD de la tabla
"up_Producto ListarPorCategoria".
38. Clic en el botn "Next" y se mostrar la ficha "Total" del "Report Export" (figura 10.17).
39. Clic en el botn "Next" y se mostrar la ficha "Style" del "Report Export" (figura 10.21).
40. Escribir como ttulo del reporte "Lista de Productos de la Categora" y seleccionar el ltimo estilo
de la lista.
41. Clic en el botn "Finish" para crear el reporte y aparecer el Crystal Report Designer, por si
deseamos hacer algn cambio.
42. Regresar al formulario y en la ventana explorador de soluciones dar clic en el botn "View Code".
43. Crear el procedimiento de evento CargarDatos, que maneje el evento "Load" del formulario y
escribir el siguiente cdigo:
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap1.SelectCommand.CommandType = CommandType.StoredProcedure
dap1.Fill(Dst1, "up_Categoria_Listar")
With cboCategoria
.DataSource = Dst1.Tables(0)
.DisplayMember = "CategoryName"
.ValueMember = "CategoryID"
End With
End Sub

44. Crear el procedimiento de evento MostrarReporte, que maneje el evento "clic botn "btnReporte" y
escribir el siguiente cdigo:

10. CREANDO REPORTES DE DATOS

- 52 -

Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles btnReporte.Click
dap2.SelectCommand.Parameters("@CategoryID").Value =
cboCategoria.SelectedValue
If Not Dst1.Tables(1) Is Nothing Then Dst1.Tables(1).Clear()
dap2.Fill(Dst1, "up_Producto_ListarPorCategoria")
Dim rpt As New Reporte_ProductosPorCategoria()
rpt.SetDataSource(Dst1)
Dim crv As New CrystalReportViewer()
crv.ReportSource = rpt
crv.Dock = DockStyle.Fill
Dim frmReporte As New Form()
With frmReporte
.Controls.Add(crv)
.Text = "Reporte de Productos x Categoria"
.WindowState = FormWindowState.Maximized
.ShowDialog()
End With
End Sub

45. Configurar frmReporteProductosCategoria como el formulario de inicio.


46. Grabar y ejecutar la aplicacin pulsando F5

Figura 10.30: Ventana del formulario frmReporteProductosCategoria del Demo71.

47. Seleccionar una categora y clic en el botn "Ver Reporte de Productos"

10. CREANDO REPORTES DE DATOS

- 53 -

Figura 10.31: Ventana del formulario frmReporte del Demo71.

48. Finalmente, cierne la ventana para salir de la aplicacin


NOTA: para que funcione Imports CrystalDecisions.Windows.Forms use la referencia
CrystalDecision.Windows.Forms

10. CREANDO REPORTES DE DATOS

- 54 -

Codigo de frmReporte del Demo71


Imports System.Data.SqlClient
Imports CrystalDecisions.Windows.Forms
Public Class frmReporteProductosCategoria
Inherits System.Windows.Forms.Form
Private Sub CargarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
dap1.SelectCommand.CommandType = CommandType.StoredProcedure
dap1.Fill(Dst1, "up_Categoria_Listar")
With cboCategoria
.DataSource = Dst1.Tables(0)
.DisplayMember = "CategoryName"
.ValueMember = "CategoryID"
End With
End Sub
Private Sub MostrarReporte(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnReporte.Click
dap2.SelectCommand.Parameters("@CategoryID").Value =
cboCategoria.SelectedValue
If Not Dst1.Tables(1) Is Nothing Then Dst1.Tables(1).Clear()
dap2.Fill(Dst1, "up_Producto_ListarPorCategoria")
Dim rpt As New Reporte_ProductosPorCategoria()
rpt.SetDataSource(Dst1)
Dim crv As New CrystalReportViewer()
crv.ReportSource = rpt
crv.Dock = DockStyle.Fill
Dim frmReporte As New Form()
With frmReporte
.Controls.Add(crv)
.Text = "Reporte de Productos x Categoria"
.WindowState = FormWindowState.Maximized
.ShowDialog()

10. CREANDO REPORTES DE DATOS

- 55 -

End With
End Sub
End Class

3. Trabajando con Informes usando MS Office


En esta ltima parte veremos como crear informes usando MS Word y MS Excel que son parte de MS
Office. Primero veremos como crear documentos con datos de una aplicacin y luego aprenderemos
como crear hojas de clculo y grficos con datos de la aplicacin.

3.1. Usando MS Word para Crear Documentos


La mayor parte de usuarios de computadoras conocen el uso de MS Word y sobre sta base podemos
trabajar con documentos que almacenen los datos de nuestras aplicaciones, para lo cual debemos
entender el modelo de objetos que nos brinda dicho programa.
3.1.1. Entendiendo el Modelo de Objetos de MS Word
Los objetos de Microsoft Word estn organizados en orden jerrquico, siendo Application y Document
las dos clases principales de la cima de la jerarqua. La gran importancia de estas dos clases se debe a
que la mayor parte del tiempo trabajar con la propia aplicacin Word o haciendo algn tipo de
manipulacin en documentos de Word.
El modelo de objetos de Word est estrechamente relacionado con la interfaz de usuario. El objeto
Application proporciona un contenedor para la aplicacin completa, cada objeto Document representa
a un nico documento de Word, el objeto Paragraph corresponde a un slo prrafo, etc. Todos y cada
uno de estos objetos poseen numerosos mtodos y propiedades que permiten su manipulacin y la
interaccin mutua.
A primera vista, parece haber un alto grado de superposicin en el modelo de objetos de Word. Por
ejemplo: los objetos Document y Selection son miembros del objete Application, pero el objeto
Document tambin es miembro del objeto Selection. Tanto Document como Selection contienen
objetos Bookmarky Range.
A continuacin presentamos el modelo de objetos de MS Word:

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

El objeto Application contiene los objetos Document, Selection, Bookmark y Range.

10. CREANDO REPORTES DE DATOS

- 56 -

En la siguiente seccin explicamos brevemente los objetos de nivel superior y cmo interactan entre
s.

Application
El objeto Application representa la aplicacin 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 mtodos para controlar el entorno de Word.

Document
El objeto Document es de vital importancia para la programacin 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 coleccin Documents de Word. El documento que tiene el foco se llama documento
activo y se representa mediante la propiedad ActiveDocument del objeto Application,

Selection
El objeto Selectior representa el rea que est seleccionada. Cuando se realiza una operacin en la
interfaz de usuario de Word, como poner texto en negrita, se selecciona o resalta el texto y, a
continuacin, se aplica el formato. El objeto Selection siempre est presente en un documento.
Adems, tambin puede representar varios bloques de texto no contiguos.

Range
El objeto Range representa un rea contigua de un documento, y se define mediante una
posicin de carcter inicial y una posicin de carcter final. Pueden utilizarse varios objetos Range
a la vez. El mismo documento puede tener definidos varios objetos Range. Un objeto
Range tiene las siguientes caractersticas:
- Puede ser e1 punto de insercin solamente, un rango de texto o el documento
completo.
- Incluye caracteres no imprimibles como espacios, caracteres de tabulacin y marcas de
prrafo.
- Puede ser el rea representada por la seleccin actual, o puede representar otra rea
diferente de la de la seleccin actual.
-

No se guarda con un documento y slo existe mientras se ejecuta el cdigo.

- Guando se inserta texto al final de un rango, Word ampla ste automticamente 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 posicin inicial y una posicin final. Los marcadores se utilizan para
marcar una ubicacin en un documento o como contenedores de texto en un documento. Un
objeto Bookmark puede ser el punto de insercin o el documento completo. Tambin se pueden
definir varios marcadores en un documento. Un objeto Bookmark tiene las siguientes
caractersticas 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 ejecucin del cdigo o al cerrar el documento.

10. CREANDO REPORTES DE DATOS

- 57 -

- De manera predeterminada los marcadores estn 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).
Aunque el propsito de este libro no es programar en Visual Basic para Aplicaciones (VBA) creo que es
necesario conocer los objetos del software que vamos a programar en este caso MS Word.
Luego de esta breve revisin ya podemos crear un documento que nos sirva de plantilla para llenarlo
con los datos de la aplicacin.
3.1.2. Creando el Documento en MS Word para el Informe
Si queremos crear un documento en Microsoft Word que sirva para aceptar datos desde una
aplicacin debemos usar campos dentro de un formulario.
En general, debemos realizar los siguientes pasos para crear un documento para nuestro informe:
1. Abrir el MS Word, del botn 'inicio", seleccionar "Programas", luego "Microsoft Office 2000" y
finalmente "Microsoft Word".
2. Del men "Ver" seleccionar "Barras de herramientas" y elegir "Formularios

Figura 10.33: Barra de herramientas de Formularios de MS Word.

3. Empezar a crear la parte fija del documento, como ttulos, prrafos, mensajes, imgenes, tablas,
etc.
4. Cuando desee crear un dato variable (campo) que se llenar desde la base de datos ubicarse sobre
la posicin y clic en el primer botn 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 aplicacin.
Nota: Cuando desarrollamos aplicaciones Windows usando el Visual Studio .NET, la carpeta donde est la
aplicacin (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 Aplicacin


Una vez creado el documento hay que crear una aplicacin que permita enviar los datos hacia el
documento mediante programacin, a lo que se le conoce como "Automatizacin COM" o
"ActiveX".
Para llenar un documento de MS Word con datos de una vista desde la aplicacin debemos realizar
los siguientes pasos:
1.

Hacer una referencia a la librera de tipos de MS Word:

Del men "Project" seleccionar "Add Reference".

Del dilogo seleccionar la segunda ficha "COM".

Seleccionar "Microsoft Word 9.0 Object Library".

Clic en el botn "Select" y luego clic en "OK".

10. CREANDO REPORTES DE DATOS

- 58 -

Nota: Por ser un componente COM el Visual Studio .NET crear unas libreras de interoperabilidad entre
COM y .NET (Interop), las cuales se crean en el mismo directorio donde se ejecuta la aplicacin.

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 mtodo Open de la
coleccin 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 coleccin Fields del objeto Document de la aplicacin Word:
W.ActiveDocument.Fields.Item(l).Result.Text = dgdProducto.Item(N, 0)

Nota: En Word el ndice de os campos empieza en 1 y en .NET empieza en 0.

Demo 72
Esta demostracin tiene por objetivo ensear a crear documentos para informes en MS Word y
llenarlos desde una aplicacin 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 Categoras y otra de Productos. La tabla de Categoras se enlaza a un
ComboBox mostrndose el nombre de la categora y la tabla de Productos sirve para crear una vista, la
cual se enlaza a un DataGrid mostrndose el cdigo, nombre, precio y cdigo de la categora del
producto.
Al seleccionar una Categora del combo, la vista se filtra mostrando los productos de dicha
categora. Finalmente, a! seleccionar un registro y dar clic al botn "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 demostracin debemos realizar los siguientes pasos:
1. Abrir el MSWcrd, del botn "Inicio", seleccionar "Programas", luego "Microsoft Office 2000" 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
Cdigo

Descripcin

Precio Unitario

Categoria

Aprobado Por:

Nota: Para agregar los campos (cuadros con sombra) dar clic al primer botn de la barra de formulario

4. Grabar el archivo como "Informe del Producto.doc" y salir de Word.

10. CREANDO REPORTES DE DATOS

- 59 -

5. Crear una Aplicacin Windows en Visual Basic .NET llamada Demo72.


6. En la ventana del explorador de soluciones seleccionar el archivo Form 1 y en la ventana de
propiedades cambiar la propiedad FileName a frmConsultaProductosCategoria.
7. En el diseador 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

Propiedad

Valor

Form1

Name

FrmConsultaProductosCategoria

MinimumSize

Width=350,Height=320

Size

Width=350,Height=320

StartPosition

CenterScreen

Text

Consultade
Categora

Name

lblCategoria

AutoSize

True

Location

X=16, Y=20

Text

Elige la categoria

Name

cboCategoria

Anchor

Top,Left,Tight

DropDownStyle

DropDownList

Location

X=136, Y=16

Size

Width=190,Heiight=21

Name

dgdProducto

Anchor

Top,Bottom,Left,Right

Location

X=16,Y=52

ReadOnly

True

Size

Width=310, Height=200

Name

btnCrearDocumento

Anchor

Bottom,Left,Right

Cursor

Hand

Location

X=117, Y=260

Size

Width=108.Height=23

Text

Crear Documento

Label1

ComboBox1

DataGrid1

Button1

8. Hacer una referencia a la librera de tipos de MS Word.

Productos

10. CREANDO REPORTES DE DATOS

- 60 -

9. En la ventana explorador de soluciones dar clic en el botn "View Code".


10. En la parte superior del cdigo (antes de la clase) definir el Namespace del proveedor d< SQL:
Imports System.Data.SqlClient

11. Declarar una variable privada para la vista de productos:


Private dvw As DataView

12. Crear el procedimiento de evento LlenarDatos, que ocurra en el evento "Load" del formulario y
escribir el siguiente cdigo:
Private Sub LlenarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New SqlConnection("Persist Security Info=False;Integrated
Security=SSPI;Initial Catalog=Northwind;server=(local)")
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 cboCategoria
.DataSource = dst.Tables("Categorias")
.DisplayMember = "CategoryName"
.ValueMember = "CategoryID"
End With
dgdProducto.DataSource = dvw
End Sub

13. Crear el procedimiento de evento FltrarProductos, que ocurra en el evento


"SelectionChangeCommitted" del "cboCategoria" y escribir el siguiente cdigo:
Private Sub FilltrarProductos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cboCategoria.SelectedIndexChanged
Try
dvw.RowFilter = "CategoryID=" & cboCategoria.SelectedValue
Catch ex As Exception
End Try
End Sub

14. Crear el procedimiento de evento CrearDocumento, que ocurra en el evento "Click" del botn
"btnCrearDocumento" y escribir el siguiente cdigo:
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 = dgdProducto.CurrentRowIndex
Dim W As New Word.Application()
W.Visible = True
W.Documents.Open(ruta & ".doc")
With W.ActiveDocument.Fields
.Item(1).Result.Text = dgdProducto.Item(N, 0)
.Item(2).Result.Text = dgdProducto.Item(N, 1)
.Item(3).Result.Text = dgdProducto.Item(N, 2)
.Item(4).Result.Text = dgdProducto.Item(N, 3)
End With
W.ActiveDocument.SaveAs(ruta & " " & dgdProducto.Item(N, 1) & ".doc")
End Sub

Nota: El archivo de Word que sirve de plantilla para el informe lo estamos recuperando de la ruta

10. CREANDO REPORTES DE DATOS

- 61 -

donde se encuentra la aplicacin mediante la propiedad StartupPath del objeto Application de .NET.

15. Configurar frmConsultaProductosCategoria como el formulario de inicio.


16. Grabar y ejecutar la aplicacin pulsando F5

Figura 10.34: Ventana del formulario frmConsultaProductosCategoria del Demo72.

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

10. CREANDO REPORTES DE DATOS

- 62 -

Figura 10.35: Ventana del MS Word con el documento creado.

20. Proceder a crear varios documentos para los productos deseados cerrando siempre Word
21. Finalmente, cerrar la ventana para finalizar la aplicacin.
Cdigo del formulario frmConsultaProductosCategoria del Demo72
Imports System.Data.SqlClient
Public Class frmConsultaProductosCategoria
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("Persist Security Info=False;Integrated
Security=SSPI;Initial Catalog=Northwind;server=(local)")
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 cboCategoria
.DataSource = dst.Tables("Categorias")
.DisplayMember = "CategoryName"
.ValueMember = "CategoryID"

10. CREANDO REPORTES DE DATOS

- 63 -

End With
dgdProducto.DataSource = dvw
End Sub
Private Sub FilltrarProductos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cboCategoria.SelectedIndexChanged
Try
dvw.RowFilter = "CategoryID=" & cboCategoria.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 = dgdProducto.CurrentRowIndex
Dim W As New Word.Application()
W.Visible = True
W.Documents.Open(ruta & ".doc")
With W.ActiveDocument.Fields
.Item(1).Result.Text = dgdProducto.Item(N, 0)
.Item(2).Result.Text = dgdProducto.Item(N, 1)
.Item(3).Result.Text = dgdProducto.Item(N, 2)
.Item(4).Result.Text = dgdProducto.Item(N, 3)
End With
W.ActiveDocument.SaveAs(ruta & " " & dgdProducto.Item(N, 1) & ".doc")
End Sub
End Class

3.2. Usando MS Excel para Crear Grficos


Todos conocemos las prestaciones de MS Excel para realizar clculos, manejar datos y crear grficos.
Esta funcionalidad tambin esta disponible para los programadores a travs de su modelo de objetos,
que a continuacin revisamos.
3.2.1. Entendiendo el Modelo de Objetos de MS Excel
Para desarrollar soluciones que utilice Microsoft Excel, debe interactuar con los objetos
proporcionados por el modelo de objetos de Excel. Principalmente, descubrir que el modelo de
objetos emula directamente la interfaz de usuario. Por ejemplo, el objeto Application proporciona un
contenedor de toda la aplicacin y cada objeto Workbook contiene una coleccin de objetos
Worksheet. A partir de este punto, la abstraccin principal que representa las celdas es el objeto Range,
que permite trabajar con celdas individuales o con un grupo de celdas.
Excel proporciona cientos de objetos con los que quiz desee interactuar, pero puede empezar a trabajar
con el modelo de objetos centrndose en un subconjunto muy pequeo de los objetos disponibles.
Entre ellos, cabe destacar:
Application
El objeto Application de Excel representa la propia aplicacin. Este objeto proporciona mucha
informacin sobre la aplicacin en ejecucin, 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 aplicacin Excel. Muchos de los
miembros de la clase Application tambin se muestran como miembros de la clase Workbook. En

10. CREANDO REPORTES DE DATOS

- 64 -

este caso, las propiedades se aplican a un libro especfico, en vez de aplicarlas al libro activo
completo.
Worksheet
Aunque la clase Worksheet proporciona muchos miembros, la mayora de las propiedades, de los
mtodos y de los eventos sor idnticos o similares a los miembros proporcionados por las clases
Application o Workbook.
Excel proporciona una coleccin Sheets como propiedad de un objeto Workbook, pero no existe
ninguna clase Sheet en Excel. En su lugar, cada miembro de la coleccin 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 regin de Excel, debe expresarla corno objeto Range y trabajar con los
mtodos y las propiedades de este objeto. Un objeto Range representa una celda, una fila, una
columna, una seleccin de celdas que contienen uno o ms bloques de celdas (que pueden ser
contiguas o no) o incluso un grupo de celdas de varias hojas de clculo.
En este tema se han descrito brevemente las clases ms importantes: Application, Workbook,
Worksheet y Range. Hay muchas otras clases que podran ser tiles, como PivotTable y Chart. El
modelo de objeto permite que el usuario realice prcticamente cualquier tarea automatizada necesaria.
En nuestro caso, para crear grficos de datos usaremos la clase Application y las colecciones
WorkBooks y Charts, tal como explicamos en la siguiente seccin.
3.2,2. Creando un Grfgo de Datos con MS Excel
Para crear un grfico en MS Excel con datos de una vista desde la aplicacin debemos realizar los
siguientes pasos:
1. Hacer una referencia a la librera de tipos de MS Excel:

Del men 'Project" seleccionar "Add Reference".

Del dilogo seleccionar la segunda ficha "COM".

Seleccionar "Microsoft Excel 9.0 Object Library".

Clic en el botn "Select" y luego clic en "OK".

2. Crear un objeto que apunte a la clase Application de Excel;


Dim X As New Excel.Application()

3. Adicionar un libro en blanco:


X.WorkBooks.Add( )

4. Escribir cada valor de un campo de la vista en una celda de la aplicacin Excel:


X.Cells(F,1).Value = dvw(I) (1)

5. Especificar el rango de datos que se desea graficar:


Dim Rango As Excel.Range = X.Selection.CurrentRegion

6. Aadir un grfico a la coleccin de grficos de Excel:


X.Charts.Add(

7. Configurar las propiedades del grfico actual, entre ellas:

10. CREANDO REPORTES DE DATOS

- 65 -

X.ActiveChart.ChartType = Nmero_Grfico
X.ActiveChart.SetSourceData(Rango, Nmero_Orientacin)
X.ActiveChart.Location(Nmero_Ubicacin)

Demo 73
Esta demostracin tiene por objetivo ensear a crear un grfico de barras en MS Excel con datos
obtenidos desde una aplicacin 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 Categoras y otra de Productos. La tabla de Categoras se enlaza a un
ComboBox mostrndose el nombre de la categora y la tabla de Productos sirve para crear una vista,
la cual se enlaza a un DataGrid mostrndose el cdigo, nombre, precio y cdigo de la categora del
producto.
Al seleccionar una Categora del combo la vista se filtra mostrando los productos de dicha categora.
Finalmente, al seleccionar un registro y dar clic al botn "Crear Grfico" se abrir el Excel y se enviarn
los datos de la vista filtrada por categora, con los cuales se construir un grfico de barras el cual
tambin se guarda en disco como archivo gif.
Para ver la demostracin debemos realizar los siguientes pasos:
1. Crear una Aplicacin Windows en Visual Basic .NET llamada Demo73.
2. En la ventana del explorador de soluciones seleccionar el archivo Forml y en la ventana de
propiedades cambiar la propiedad FileName a frmConsultaProductosCategoria.
3. En el diseador 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

Propiedad

Valor

Form1

Name

frmConsultaProductosvategoria

MinimumSize

Width=350,Height=320

Size

Width=350,Height=320

StartPosition

CenterScreen

Text

Consulta de Productos x Categoria

Name

lblCategoria

AutoSize

Trae

Location

X=16,Y=20

Text

Elige la Caegoria

Name

cboCategoria

Anchor

Top,Left,Right

DropDownStyle

DropDownList

Location

X=136,Y=16

Size

Width=190, Height=21

Name

dgdProducto

Label

ComboBox1

DataGrid1

10. CREANDO REPORTES DE DATOS

Button1

- 66 -

Anchor

Top, Bottom, Left, Right

Location

X=16,Y=32

ReadOnly

True

Size

Width=310,Height=200

Name

btnCrearGrafico

Anchor

Bottom,Left,Right

Cursor

Hand

Location

X=117, Y=260

Size

Width=108,Height=23

Text

Crear Grfico

4. Hacer una referencia a la librera de tipos de MS Excel.


5. En la ventana explorador de soluciones dar clic en el botn "View Code".
6. En la parte superior del cdigo (antes de la clase) definir el Namespace del proveedor SQL:
Imports System.Data.SqlClient

7. Declarar una variable privada para la vista de productos:


Private dvw As DataView

8. Crear el procedimiento de evento LlenarDatos, que ocurra en el evento "Load" del formulario y escribir el
siguiente cdigo:
Private Sub LlenarDatos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim con As New
SqlConnection("uid=sa;server=(Local);database=northwind")
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 cboCategoria
.DataSource = dst.Tables("Categorias")
.DisplayMember = "CategoryName"
.ValueMember = "CategoryID"
End With
dgdProducto.DataSource = dvw
End Sub

9. Crear el procedimiento de evento FiltrarProductos, que ocurra en


"SelectionChangeCommitted" del "cboCategoria" y escribir el siguiente cdigo:

el

Private Sub FilltrarProductos(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles cboCategoria.SelectedIndexChanged
Try
dvw.RowFilter = "CategoryID=" & cboCategoria.SelectedValue
Catch ex As Exception
End Try
End Sub

evento

10. CREANDO REPORTES DE DATOS

- 67 -

10 rear el procedimiento de evento CrearGrafico, que ocurra en el evento "Click" del botn
"btnCrearGrafico" y escribir el siguiente cdigo:
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 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
Next
X.Columns.AutoFit()
X.Range("A1").Select()
Dim R As Excel.Range = X.Selection.CurrentRegion
X.Charts.Add()
With X.ActiveChart
.ChartType = -4100
.SetSourceData(R, 2)
.Location(1)
.Export(ruta & cboCategoria.Text & ".gif", "gif")
End With
End Sub

Notas:

ChartType en -4100 indica que el tipo de grfico es de barras en 3D.


SetSourceDate(R,2) indica que el rango a graficar es R y su orientacin es en columnas
Location(1) indica que el grfico saldr en una nueva hoja
Advertencia: Se generar una excepcin en el mtodo Export si no se ha instalado los filtros grficos
para poder crear archivos mediante MS Office al momento de su instalacin.

11 onfigurar frmConsultaProductosCategora como el formulario de inicio


12 Grabar y Ejecutar la aplicacin pulsando F5

10. CREANDO REPORTES DE DATOS

- 68 -

Figura 10.36 Ventana del Formulario frmConsultarProductoCategoria del Demo73


13. Seleccionar una categora y ver como se filtran los productos de dicha categora.
14. Seleccionar un registro y clic al botn "Crear Grfico" e inmediatamente se abrir MS
Excel con los datos de la vista filtrada, con los cuales crear el grfico, similar al mostrado
en la figura:

Figura 10.27.Ventana del MS Excel con el grfico creado

10. CREANDO REPORTES DE DATOS

- 69 -

15. Revisar que en la carpeta Bin se ha creado un archivo gif con un grfico de productos de dicha
categora.
16. Cerrar el Excel y si desea puede guardar el archivo.
17 Finalmente, cerrar la ventana para finalizar la aplicacin.
Cdigo del formulario frmConsultaProductosCategoria del Demo73
Imports System.Data.SqlClient
Public Class frmConsultaProductosCategoria
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("uid=sa;server=(Local);database=northwind")
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 cboCategoria
.DataSource = dst.Tables("Categorias")
.DisplayMember = "CategoryName"
.ValueMember = "CategoryID"
End With
dgdProducto.DataSource = dvw
End Sub
Private Sub FilltrarProductos(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CboCategoria.SelectedIndexChanged
Try
dvw.RowFilter = "CategoryID=" & cboCategoria.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 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
Next
X.Columns.AutoFit()
X.Range("A1").Select()
Dim R As Excel.Range = X.Selection.CurrentRegion
X.Charts.Add()
With X.ActiveChart
.ChartType = -4100

10. CREANDO REPORTES DE DATOS

- 70 -

.SetSourceData(R, 2)
.Location(1)
.Export(ruta & CboCategoria.Text & ".gif", "gif")
End With
End Sub
End Class

Glosario de Trminos
A Continuacin un glosario de trminos usados ordenados alfabticamente:
ACID :

Atomicity, Consistency, Isolation, Durability.

ActiveX:

Tecnologa de Reuso de Componentes.

ADO :

ActiveX Data Objects.

ADSI :

Active Directory Service Interfaces.

ANSI :

American National Standards Institute.

API

Application Program Interface.

Array :

Arreglo o conjunto de datos de un mismo tipo.

ASCII :

American Standard Code for Information Interchange.

ASP

Active Server Pages.

Assembly:

Ensamblado. Archivo compilado en Lenguaje Intermedio.

BLOB :

Binary Large Object (Objeto Binario Grande).

Breakpoint

:Punto de interrupcin donde se detiene la ejecucin de la aplicacin para


depuracin.

CICS :

Customer Information Control System.

Clase :

Plantilla para definir propiedades, mtodos, eventos, etc.

CLI

Call Level Interface.

CLR :

Common Language Runtime.

Collection:

Coleccin o conjunto de datos de cualquier tipo (objetos).

COM :

Component Object Model.

Componente:

Unidad de Cdigo Reusable.

Constructor:

Procedimiento que se ejecuta al inicio.

CURSOR:

CURrent Set Of Row (Conjunto de registros actuales).

DAO :

Data Access Objects.

DataSet:

Conjunto de tablas y relaciones almacenados en memoria usado en ADO .NET.

DDL

Dynamic Data Language.

Destructor

Procedimiento que se ejecuta al final.

DLL

Dinamic Link Library.

EDP

Event Driven Programming.

10. CREANDO REPORTES DE DATOS


Encapsulacin

Ocultar los atributos de una clase.

Event Handler

Procedimiento que maneja eventos.

Evento

Accin que sucede sobre el objeto.

GDI

Graphic Device Interface.

GUI

Graphic User Interface.

GUID's

Global Unifier ldentifier's.

Herencia

Extender la funcionalidad de una clase.

IDE

Integrated Development Environment.

IMS

Information Management System.

Interface

Tiene varios significados.

ISAM

Index Sequential Access Method.

Items

Elementos de una coleccin.

MDAC

Microsoft Data Access Component.

MDI

Mltiple Document Interface.

Mtodo

Procedimiento que modifica las caractersticas del objeto.

Miembro

Elemento de una clase.

MMC

Microsoft Management Consol.

Modo Depuracin

- 71 -

Cuando probamos la aplicacin fijando un punto de interrupcin en el editor de


cdigo.

Modo Diseo

Cuando estamos creando la interface o escribiendo cdigo desde Visual Studio NET.

Modo Ejecucin

Cuando ejecutamos la aplicacin desde Visual Studio .NET.

MSDE

Microsoft Data Engine.

NameSpace

Espacio de Nombres

Objeto

Instancia de una clase

ODBC

Open Database Connectivity

OLEDDB

Object Linking & Embedding Database

OOP

Oriented Object Programing

Polimorfismo

Modificar Comportmiento de un miembro

Proceso

Tarea que realiza el sistema operativo

Propiedad

Atrbuto o caracterstica de un objeto

RAD

Rapid Application Development

RDO

Remote Data Objects

RecordSet

Conjunto de registros almacenados en memoeria usado en DAO y ADO

ResultSet

Conjunto de registros almacenados en memoria usado en RDO

RPC

Remote Procedure Call

RTF

Rich Text Format

10. CREANDO REPORTES DE DATOS

- 72 -

SDI

SingleDocument Interface

Setup

Programa de Instalacin de una aplicacin

ShortCut

Tecla de acceso directo a una opcin

ShortKey

Tecla de Acceso Corto a una opcin , por ejemplo pulsando ctrl. +Carcter

Thread

Hilo o subproceso

UDA

Universal Data Access

VSAM

Visual Sequential Accees Method

XML

eXtended Markup Lenguaje

XSD

Xml Schema Definition.

Enlaces de Internet
A continuacin, algunos enlaces de inters sobre Desarrollo de Aplicaciones Windows Forms con .NET que
recomiendo:
En Espaol
1. Microsoft Devel oper Network
http://www.msdn.microsoft.com/library/spa
2. Soporte para desarrollares Microsoft
http://support.microsoft.com
3. La Web del Guille de Espaa
h*tp://www.eIguilIe.info
4 La Web de WillyDev de Colombia
htrp:/Avww.wlydev.net
En Ingls
5. Sitio Oficial de Windows Forms .NET
http://www.windowsforms.net
6. Comunidad Oficial del .NET Framework
http:/Avww.gotdotnet.com
7. Preguntas a Respuestas Frecuentes sobre Windows Forms .NET
http://www.syncfusion.com/FAQ/WindowsForms/Dcfault.aspx

También podría gustarte