miércoles, junio 21, 2006

Xailer y Crystal Reports

Una cosa que habían pedido los usuarios de Xailer era conectividad con Crystal Reports, ya que este generador de informes es una de las herramientas de desarrollo mas utilizada por muchos programadores alrededor del mundo.

En FiveWin Tom Groeger escribió una clase que facilita enormemente el manejo de motor de impresión de Crystal (el Crystal Reports Print Engine ó CRPE), esta clase está construida utilizando wrappers a las funciones del DLL CRPE32.DLL.

La clase Crystal funciona perfectamente en FiveWin 16 bits y con algunas modificaciones minimas que hice sobre la clase original de Tom, funciona impresionante en Fivewin Harbour a 32 bits.

Cuando comencé a trabajar en Xailer, traté de hacer funcionar la clase de Tom de la misma manera en que funcionaba con FiveWin, pero tuve problemas con las estructuras y el motor de vista previa, así que desistí en mi intento.

Hace un par de días, decidí retomar el tema, pero en vez de complicarme la vida usando wrappers, estructuras y tratando de adaptar una clase de FW, decidí empezar de cero y utilizar algo mas simple: OLE, ya que el CRPE es un servidor OLE que puede ser atacado fácilmente desde xHarbour.

Pense que la cosa iba a ser muy simple, y en realidad lo fue, 3 líneas de código en un evento OnInitialize de Xailer y tenía funcionando el CRPE dentro de un formulario de Xailer.... bueno, eso de "tener funcionando" es un decir, porque "algo" me faltaba que hacia que el motor de vista previa apareciera y desapareciera nada mas crearse la ventana. Estas son las 3 líneas de código originales:

oCrystal := TOleAuto():New( "Crystal.CRPE.Application" )
oCRReport := oCrystal:OpenReport( ".\impagen.rpt" )
oCRReport:Preview( "", 0, 0, 0, 0)


Así pues decidí plantear mi duda en el foro de Xailer, y Jose Giménez, mas rápido que inmediatemante encontró ese "algo" que estaba mal en mi aproximación a Crystal, el caso es que oCrystal y oCRReport eran declaradas como variables locales dentro del evento OnInitialize, y cuando se pintaba el formulario que contenía la vista previa, este desaparecía porque estas variables locales dejaban de tener valor una vez terminado el pintado.

La solución de Jose fue sumamente elegante: crear una clase TCrystalPreview derivada de TForm y manejar las variables que yo había puesto como locales, como DATAs de la clase, de tal forma que su valor no se perdiera y se pudiera desplegar correctamente la vista previa.

El resultado, pues juzga por tí mismo:



El motor de vista previa de Crystal puede trabajar como formulario, como dialogo, o como ventana hija en un MDI, todo gracias la versatilidad de la clase TForm de Xailer.

El proyecto que genera la imagen anterior lo puedes descargar haciendo click aqui. Este proyecto incluye el archivo .RPT pero quizá tengas problemas por la ubicación de la base de datos, puedes probarlo cambiando el nombre de reporte por uno que tu hayas creado.

Al manejar Crystal como objeto OLE tenemos muchísima versatilidad para manipular Crystal Reports, lo importante es tener la documentación del componente COM, misma que puedes descargar haciendo click aquí.

Otro punto mas para Xailer, ahora puedes diseñar tus reportes en Crystal, y hacerlos funcionar muy fácil con Xailer

No hay comentarios.: