Vous êtes sur la page 1sur 11

Cmo abrir un reporte hecho en Crystal Reports (Visual Basic)

Autor: Daniel Maya Ortiz < danielmaya@hotmail.com > Fecha: 22/Ago/2003 Actualizado: 22/Ago/2003

CMO ABRIR UN REPORTE HECHO EN CRYSTAL REPORTS


Para abrir un reporte hecho en Crystal Reports existen dos posibilidades: 1. Hacer que el reporte est dentro del proyecto, mediante el diseador de Crystal Reports.

Ventajas: El reporte forma parte del proyecto, de manera que no se tiene que agregar ningn archivo de reporte al empaquetado. Al usar el diseador se tiene la posibilidad de capturar algunos eventos que el reporte dispara, por ejemplo a la hora de leer los registros y a la hora de imprimir el reporte. Existe una mayor flexibilidad para manejar la jerarqua de objetos y acceder a ella. Se tiene mayor control sobre los objetos que forman parte del reporte.

Desventajas: El uso de diseadores hace que el proyecto crezca en tamao. Un paquete de instalacin con diseadores de Crystal Reports es ms propenso a fallar (en mi experiencia) que si se lee un reporte desde un archivo externo.

2. Ventajas:

Abrir el reporte mediante cdigo.

El proyecto es mucho ms ligero, puesto que no requiere ms que el archivo RPT (que no es parte del proyecto). El paquete de instalacin falla menos (lstima, me hubiera gustado teclear que no falla).

Desventajas: Se pierde el control que se obtiene con el diseador. Si alguien intencionadamente borra el archivo RPT causar un error a la hora de querer ver dicho reporte.

A final de cuentas, por experiencia propia yo he elegido la segunda opcin. Y en el presente artculo voy a explicar lo ms detalladamente posible cmo abro los reportes desde Visual Basic.

Los preparativos
Antes de comenzar, voy a considerar que al proyecto de Visual Basic slo le faltan los reportes, y que stos ya estn hechos en Crystal, es decir, ya se tienen los archivos RPT. Para este artculo usar un reporte que nicamente contiene dos parmetros, una frmula y 3 objetos de texto. Otra consideracin importante en la versin del producto. Utilizar Visual Basic 6.0 Profesional y Crystal Reports 9 Developer Edition. Lo primero que hay que hacer es agregar la librera Crystal Reports 9 ActiveX Designer Run Time Library. Adems se debe agregar el componente Crystal Reports Viewer Control 9, como se muestra en las siguientes figuras:

A continuacin necesitamos dos formularios, en uno de ellos vamos a insertar una instancia del CRViewer9, de manera que ste ser el formulario donde finalmente de ver el reporte; yo acostumbro ponerle el estado inicial al formulario como maximizado, sin embargo, esto no es necesario. El tamao del CRViewer9 no importa ya que mediante programacin haremos que su tamao se ajuste al tamao del formulario; el nombre tampoco importa mucho, sin embargo, yo usar como nombre crViewer, slo por costumbre ms que por otra cosa. A este formulario le llamaremos frmReporte. El otro formulario servir para que el usuario pueda introducir los parmetros que requiere el reporte. En el ejemplo de reporte que usar para este artculo he definido dos parmetros, Parametro1 de tipo Cadena y Parametro2 de tipo Nmero. Por lo que un par de Labels y un par de TextBox, adems de un par de botones ser suficiente. Al formulario le llamaremos frmParametros.

Formulario frmReporte
A continuacin voy presentando el cdigo por partes, y voy a explicarlo lo ms detallado que pueda. Comenzaremos con el formulario ms importante: frmReporte.

Seccin de declaraciones
Option Explicit Private crApp As New CRAXDRT.Application Private crReport As New CRAXDRT.Report Private mflgContinuar As Boolean Private mstrParametro1 As String Private mlngParametro2 As Long

En la seccin de declaraciones necesitamos las siguientes variables: DESCRIPCIN Objeto que representa una instancia del programa crApp Crystal Reports. crReport Objeto que representa el reporte que deseamos abrir. Variable booleana que nos indica si hubo error al tratar mflgContinuar de abrir el archivo RPT. Variable de cadena que almacenar el valor que se le mstrParametro1 pasar al Parametro1 del reporte. Variable numrica que almacenar el valor que se le mlngParametro2 pasar al Parametro2 del reporte. Cabe mencionar que en el formulario se deben declarar tantas variables como parmetros tenga el reporte, adems de las tres primeras variables, que no debern faltar independientemente del nmero de parmetros. VARIABLE

Evento Resize
Private Sub Form_Resize() crViewer.Top = 0

crViewer.Left = 0 crViewer.Height = ScaleHeight crViewer.Width = ScaleWidth End Sub

En este evento hacemos que el control crViewer ocupe toda el rea del formulario en el que se encuentra, supongo que este cdigo no requiere mayor explicacin.

Procedimiento PasarParametros
Public Sub PasarParametros(sParam1 As String, lParam2 As Long) mstrParametro1 = sParam1 mlngParametro2 = lParam2 End Sub

Este procedimiento sirve para mandar desde el formulario de parmetros los valores que tendrn los parmetros del reporte. Las variables a nivel de formulario sirven para guardar estos valores mientras se abre el reporte.

Evento Load del formulario


Private Sub Form_Load() Dim crParamDefs As CRAXDRT.ParameterFieldDefinitions Dim crParamDef As CRAXDRT.ParameterFieldDefinition On Error GoTo ErrHandler 'Abrir el reporte Screen.MousePointer = vbHourglass mflgContinuar = True Set crReport = crApp.OpenReport(App.Path & "\Ejemplo.rpt", 1) ' Parametros del reporte Set crParamDefs = crReport.ParameterFields For Each crParamDef In crParamDefs Select Case crParamDef.ParameterFieldName

Case "Parametro1" crParamDef.AddCurrentValue (mstrParametro1) Case "Parametro2" crParamDef.AddCurrentValue (mlngParametro2) End Select Next crViewer.ReportSource = crReport crViewer.DisplayGroupTree = False crViewer.ViewReport Screen.MousePointer = vbDefault Set crParamDefs = Nothing Set crParamDef = Nothing Exit Sub ErrHandler: If Err.Number = -2147206461 Then MsgBox "El archivo de reporte no se encuentra, resturelo de los discos de instalacin", _ vbCritical + vbOKOnly Else MsgBox Err.Description, vbCritical + vbOKOnly End If mflgContinuar = False Screen.MousePointer = vbDefault End Sub

La lneas:
Dim crParamDefs As CRAXDRT.ParameterFieldDefinitions Dim crParamDef As CRAXDRT.ParameterFieldDefinition

se utilizarn para establecer los valores de los parmetros. A continuacin se muestra su descripcin. DESCRIPCIN Objeto que representa a la coleccin de Parmetros de crParamDefs un reporte. Objeto que representa a un parmetro en especfico. crParamDef Esta variable se utilizar para iterar por la coleccin crParamDefs VARIABLE

En otras palabras crParamDefs ser la variable que utilizaremos para referirnos a la coleccin de parmetros del reporte y crParamDef se utilizar para referirnos a un parmetro en particular. Los nombres de las variables no tienen que ser los mismos, los puse as para que el nombre indique el uso que se le dar a cada variable. A continuacin establecemos un manejador de error para nuestro procedimiento. Esto es necesario porque puede darse el caso de que el reporte no se encuentre en la ubicacin que le especifiquemos, y debemos manejar ese error.
On Error GoTo ErrHandler

Luego debemos abrir el reporte, pero es conveniente establecer el puntero del cursor como reloj de arena por si acaso llegara a tardar mucho esta operacin. Claro est que el tiempo que tarde variar de una computadora a otra.
'Abrir el reporte Screen.MousePointer = vbHourglass

Tambin debemos establecer nuestra variable mflgContinuar a TRUE, esto es as, por que por default, las variables booleanas se establecen a FALSE, y en este caso queremos indicar que podemos continuar, es decir, que no ha pasado nada que nos impida continuar en el proceso.
mflgContinuar = True

A continuacin viene la instruccin que propiamente abre el archivo RPT y establece la referencia a nuestra variable crReport. Si se generara algn tipo de instruccin en esta instruccin, nuestro manejador de errores se hara cargo de informarle al usuario sobre lo ocurrido. Si no se genera ningn error, entonces ahora la variable crReport apunta a nuestro reporte. Cabe aclarar un par de cosas sobre esta instruccin. El primer parmetro, como es de imaginarse, es el nombre del reporte con todo y su ruta. Podemos usar ubicaciones de nuestro disco duro o ubicaciones dentro de red, si es que usamos el programa en un ambiente de red. No debemos olvidar el .rpt, de lo contrario la instruccin fallar. Yo acostumbro crear una carpeta Reportes dentro de cada aplicacin que hago y ah guardo los archivos RPT de mi aplicacin, de manera que si alguien borra uno o varios de los archivos RPT puedo crear un programita que los restaure a

partir de una ubicacin de red, por ejemplo. O yo mismo puedo respaldarlos a partir de los discos de instalacin. El segundo parmetro del mtodo OpenReport es opcional, un 1 indica que queremos abrir el reporte de manera exclusiva, un 0 indica que queremos crear una copia temporal y trabajar con ella. Este parmetro se utiliza porque mediante programacin podemos modificar el diseo del reporte, por lo que si abrimos una copia temporal, los cambios no afectarn al archivo original. Como ya mencion el parmetro es opcional, y su valor por default es 1. Otra nota importante, el mtodo OpenReport regresa una instancia del reporte indicado o 0 si el archivo no existe o se genera algn error. Por lo tanto no es estrictamente necesario establecer un manejador de errores para esta rutina, basta con checar si crReport vale 0 para darnos cuenta de que se gener un error. Sin embargo, yo prefiero establecer un manejador de error para poder manejar otros errores de otras instrucciones, aunque por simplicidad no lo hago en este ejemplo.
Set crReport = crApp.OpenReport(App.Path & "\Ejemplo.rpt", 1)

Una vez que tenemos abierto el reporte, debemos establecer los valores de los parmetros antes de visualizar el reporte. la instruccin Set que se muestra a continuacin hace que la variable crParamDefs apunte a la coleccin de parmetros del reporte.
' Parametros del reporte Set crParamDefs = crReport.ParameterFields

Ya podemos hacer una iteracin por la coleccin de parmetros para asignarle un valor a cada uno de ellos. Dentro del ciclo usamos la estructura Select Case para evaluar el nombre del parmetro, el cual est contenido en el miembro ParameterFieldValue del objeto crParamDef. Cabe aclarar que para la clusula Case debemos usar exactamente el mismo nombre que le dimos a cada parmetro dentro de Crystal Reports. El mtodo AdCurrentValue es el que propiamente asigna el valor que le pasemos como parmetro al parmetro en s.
For Each crParamDef In crParamDefs Select Case crParamDef.ParameterFieldName Case "Parametro1" crParamDef.AddCurrentValue (mstrParametro1) Case "Parametro2" crParamDef.AddCurrentValue (mlngParametro2)

End Select Next

Ahora s el reporte est listo para ser desplegado en el crViewer. Al asignar la variable crReport al miembro ReportSource del control crViewer estamos propiamente asignando el reporte al control, pero no el reporte no ser visible hasta que se mande llamar al mtodo ViewReport del crViewer. Y por ltimo restauramos el puntero del ratn al valor por default.
crViewer.ReportSource = crReport crViewer.ViewReport Screen.MousePointer = vbDefault

El establecer a Nothing las variables crParamDefs y crParamDef no es obligatorio, debido a que no usamos el New, sin embargo es una prctica sana de programacin. La instruccin Exit Sub es necesaria para no caer en el manejador de errores.
Set crParamDefs = Nothing Set crParamDef = Nothing Exit Sub

Lo que nos falta para completar el evento Load del formulario es el manejador de errores. Lo primero que preguntamos en el manejador de errores es si el error que se gener es el nmero 2147206461, el cual se genera cuando la instruccin OpenReport no encuentra el archivo que se especific como primer parmetro. El nmero del error lo encontr haciendo que se generara el error para anotar el nmero, no lo encontr en ninguna documentacin de Crystal Reports. Si se genera otro error, solamente mostramos el mensaje de acuerdo a la descripcin que contenga dicho error. Lo importante aqu es establecer la variable mflgContinuar a FALSE, para indicar al programa que por un error no puede continuar la ejecucin normal del cdigo.
ErrHandler: If Err.Number = -2147206461 Then MsgBox "El archivo de reporte no se encuentra, resturelo de los discos de _ instalacin", vbCritical + vbOKOnly Else MsgBox Err.Description, vbCritical + vbOKOnly End If

mflgContinuar = False Screen.MousePointer = vbDefault End Sub

Evento Activate del formulario


Private Sub Form_Activate() If Not mflgContinuar Then Unload Me End Sub

He aqu la razn fundamental del uso de la variable mflgContinuar, recordemos que el evento Load se ejecuta antes del evento Activate, por lo tanto, si en el evento Load del formulario aparece un error, en el evento Activate haremos que el formulario se descargue de la memoria, en pocas palabras, si se genera algn tipo de error, el formulario ni siquiera se muestra en la pantalla.

Evento Unload del formulario


Private Sub Form_Unload(Cancel As Integer) Set crReport = Nothing Set crApp = Nothing End Sub

Y por ltimo hacemos limpieza de memoria.

Formulario frmParmetros
A continuacin presento el cdigo

Private Sub cmdSalir_Click() Unload Me End Sub

El cdigo que realmente vale la pena mencionar de este formulario es el que se presenta a continuacin, en el cual declaramos una intancia del formulario en el que se ver el reporte, a continuacin y muy importante es pasarle los parmetros al formulario para que ste a su vez los pase al reporte y mandamos mostrar dicho formulario.
Private Sub cmdVerReporte_Click() Dim frmRep As New frmReporte frmRep.PasarParametros txtParametro1, CLng(txtParametro2) frmRep.Show vbModal Set frmRep = Nothing End Sub

Espero que este artculo haya sido de utilidad para ustedes. Cualquier duda o comentario pueden mandarme un mail a: danielmaya@hotmail.com Saludos. Daniel Maya Ortiz.