Minicursillo de Cristal Reports
Fernando Alvarez Lama
[email protected]
Antes de empezar, os digo que no os desesperéis y no dudéis en consultarme vía e-mail. Cualquier indicio de "producto estable" que podáis encontrar en CR, es pura coincidencia, pero como lo "regalan" con el VB, bueno es.
Después de todo no es tan malo, y cundo le has cogido el punto rueda mas o MENOS bien.
Voy a intentar ofreceros unas líneas generales de actuación para poder trabajar con el CR, algunos trucos y la forma de resolver esos errores tan típicos que, en la mayoría de los casos, no están documentados.
En este último apartado, hay un par de errores que os contaré como evitarlos, pero que aún no he logrado interceptar.
Bueno, para empezar, voy a obviar, es lo único, la inclusión del control en nuestro proyecto, que todos, a estas alturas, debemos saber como hacer.
Crystal Reports se presenta para Visual Basic como Custom Control de 32 bits del tipo ActiveX. En la versión 5 de VB nos entregan la versión 4.6. Para hacer uso de él tenemos que tener instalada la aplicación de CR , que lo hacemos en el momento de instalación o reinstalación del VB. Si lo hemos comprado a parte , seguiremos las normas de instalación del CD de Crystal.
Consideraciones Generales
Antes de empezar, os recomendaría, por cuestiones de optimización del tamaño del código, que uséis tan solo 1 control CR en todo vuestro proyecto. No es necesario mas. Cuando hagáis referencia a el solo tenéis que poner la ruta completa.
Por ejemplo, tengo un CR llamado CR1 y quiero usarlo, pero esta en el Form1. Lo llamaría así:
Form1.CR1. ReportFileName = "MiInforme.RPT"
Esto lo usamos desde cualquier formulario de la aplicación y funciona. Ganas orden y no tener que "bautizar" 300 controles distintos, amén de acordarse del nombre de todos ello o tener que recurrir a la molesta caja de propiedades a ver como le puse
Cuando diseñéis el informe, tened claro lo que queréis mostrar. El diseñador no es precisamente un ejercicio de diseño ( valga la redundancia ) excelente, por lo que la repetición del diseño resulta muy tediosa.
Además, tened en cuenta el realizar el diseño del informe cuando la tabla este completamente terminada. En la mayoría de los casos la imagen interna creada por CR de la tabla sobre la que realizas el informe, hace que si modificas los campos, nombres de los mismos, tipos de datos que contienen o cualquier otra cosa, CR no reconozca estos cambios y tengas que empezar de nuevo.
El diseñador, como el producto en completo, es muy mejorable, y os desesperará tener que abrir una caja de dialogo para editar un texto, tener que pulsar un botón para tener que seleccionar mas de una caja de texto o datos de una vez, ver que el WYSIWYG ( What You See Is What You Get ) en este caso es solo el nombre, es mas bien es WYSIMWYG ( What You See Is Maybe What You Get ), que cuando cambiéis de impresora tendréis que modificar el informe en muchos casos y un largo etc.
Al final, casi, merece la pena
Propiedades
Las propiedades mas típicas de este control son:
DataFiles
Destination
Formulas
ReportFileName
SelectionFormula
WindowControlBox
WindowState
WindowTitle
Os aseguro que con el uso exclusivo de estas propiedades se pueden hacer aplicaciones profesionales. Olvídate del resto de momento, aunque ya hablaremos algo de las otras, porque no son estrictamente necesarias.
Vamos a verlas una por una
DataFiles
Vemos que al generar nuestro informe usando la aplicación de diseño, CR ejecuta el informe sobre la base de datos que lo hemos generado, en el lugar que lo hemos generado (path). Pero supongamos que nuestra base de datos se encuentra en otro equipo, y que nuestro programa esta en red. Bien, siempre que el informe haga referencia a una tabla de idéntica estructura del diseño original, el rpt funcionará correctamente, en el momento que le indiquemos donde esta esa base de datos.
Mi equipo es C:\, lógicamente, y la DB se encuentra en una equipo cuya unidad he colgado al mío llamándola X:, pues bien, le indicaríamos a CR donde esta la DB. Subdirectorio incluido, de esta forma:
Form1.CR1.DataFiles(0) ="X:\MIAPLICACION\MiBd.MDB" ( no olvidéis el "0" )
Suponemos que la DB es del tipo Access y esta en el subdirectorio de MIAPLICACION.
Podemos usar variables globales para introducir el DataFiles. Si al principio de mi programa he declarado una variable de uso global de cadena donde he introducido el Path de los datos esto podría quedar así:
Form1.CR1.DataFiles(0) = FuenteDatos + "\ANGL.mdb"
Igualmente lo puedo hacer para el nombre de la DB.
Particularmente yo uso un INI, donde grabo la localización del servidor de datos en una sección, y al empezar la aplicación declaro y cargo una variable global con estos datos usando una API para leer ficheros INIs privados que se llaman VBGetPrivateProfileString. Si queréis datos sobre esto no dudéis en preguntármelo.
Destination
Simple como ella sola:
Form1.CR1. Destination = 1 Lo lanza por la impresora por defecto de Windows
Form1.CR1. Destination = 0 Lo previsualiza en pantalla.
¿ Alguna pregunta ?
Formulas()
Cuantas veces hemos querido introducir información complementaria en nuestros informes, información que no tiene la base de datos, pero no hemos sabido como. Aquí se encuentra la solución.
En el diseñador podemos introducir cuantas formulas queramos y en la posición, tipo, tamaño y fuente que queramos. Pues bien, al añadir formula, introducimos un nombre y en el cuadro de diseño de la formula introducimos "" ( si, dobles comillas ).
Una vez hecho esto colocamos la caja de texto que nos ha generado el diseñador, donde queramos.
Cuando emitamos el informe, queremos introducir en esa caja la información. Por ejemplo en nombre completo del informe, algo así como "Listado de clientes desde el 1 de Enero al 31 de Diciembre", por ejemplo. Veamos el ejemplo
Form1.CR1.Formulas(0) = "Titulo=' Listado de Clientes '"
Form1.CR1.Formulas(1) = "Subtitulo='1 de Enero a 31 de Diciembre 1998 '"
O bien
Dim Titulo1 as String
Dim Titulo2 as String
Titulo1 = "Listado de Clientes"
Titulo2 = "1 de Enero a 31 de Diciembre 1998"
Form1.CR1.Formulas(0) = "Titulo='" & Titulo1 & "'"
Form1.CR1.Formulas(1) = "Subtitulo='" & Titulo2 & "'"
No olvidéis poner consecutivamente el numero de orden en los paréntesis después de Formulas(n). Si duplicáis "n", obtendréis, en el mejor de los casos, un error
ReportFileName
Otra simple. Con ella indicamos al motor de CR que informe lanzar
Form1.CR1.ReportFileName ="MiInforme.rpt"
o
Form1.CR1.ReportFileName ="C:\MIAPLICACION\MiInforme.rpt"
o
Form1.CR1.ReportFileName = FuenteDatos + "MiInforme.rpt"
( recuerda DataFiles para el tema de FuenteDatos)
CONTINUARA .