domingo, mayo 17, 2009

FastReport.... Desde Rusia con amor para xHarbour

Odio hacer informes.

Así de fácil, me encanta programar, me encanta resolver problemas de cálculo, de acceso a datos, me fascina diseñar pantallas, pero ODIO hacer los informes.

Ese odio me viene desde los tiempos de Clipper, de aquellos tiempos lejanos de las impresoras de matriz de puntos guardo mi utilísima regla de metal para medir caracteres, que si condensado caben tantos caracteres por pulgada, que si expandido tantos, que si normal otros, que si el reporte va en hojas de 10 pulgadas o de 15 y luego a nivel programación las famosas "secuencia de escape" para los distintos tipos de letra, vamos, que era una alegría eso de hacer informes en los tiempos del ms-dos.

Vi la gloria cuando comencé a utilizar Band-IT, sin duda el mejor generador de informes para CA-Clipper, simple de usar y poderoso.

Pero entramos a programar en Windows y vamos de vuelta al problema de los informes, las impresoras dejaron de ser un problema, ahora el problema de los informes es mas simple de solucionar, pero cada día hay que darles mas versatilidad a los dichosos informes.

En Xailer y FiveWin el problema se soluciona relativamente fácil a través de la clase TReport y de los Objetos Printer y Device:Canvas, pero ahora, conforme vamos añadiendo complejidad a los sistemas, hay que añadir complejidad a los informes, y para esto de hacer difícil lo complicado y lo complicado imposible, los usuarios se pintan solos.

Ahora no solo hay que hacer informes sobre DBFs, hay que hacerlos sobre tablas SQL, ya no basta con hacer una vista previa de como se verá el reporte en pantalla, hay que enviar de la pagina tal a tal únicamente, hay que exportar los informes a Excel (de cajón) a PDF, a Word, enviarlos por correo, publicarlos en internet.... POR FAVOR !!!!! son solo INFORMES.

Tengo un cliente que se queja amargamente conmigo.... tiene un sistema que genera mas de 400 informes distintos, y no pasa un mes sin que alguno de sus clientes le pida un nuevo informe o que modifique alguno de los existentes, como todos los informes están en código, cada vez que hay que mover un reporte, pues hay que volver a generar un nuevo EXE..... bueno si estás ocupado, haz un generador visual de reportes y déjame hacerlos a mí.... como si fuera tan fácil tanto hacer el diseñador visual, como aprender a usarlo.

Hay numerosos generadores de informes visuales para Windows, la mayoría son "genéricos", enfocados para usarse con cualquier lenguaje de programación y con cualquier base de datos.

Yo comencé con esto de los informes visuales con Crystal Reports versión 4.0 y lo abandoné en la versión 7.x, porque las versiones posteriores sencillamente perdieron el piso, ya no es Crystal Reports, ahora es Crystal Decisions.... y aquel generador de informes se convirtió en una parte de una herramienta que es un MONSTRUO y encima con unos precios extremos. Luego fue adquirido por SAP y ahora es un división de la empresa alemana.

Luego hice algunos experimentos con List & Labels, me gustó la filosofía de programación: el informe visual solo es una plantilla, y el programa "alimenta" los datos al informe por programación y en tiempo de ejecución, de tal manera que nosotros siempre tenemos control de los datos a imprimir desde programa por medio de filtros, scopes o queries SQL, luego estos datos se "bombean" al motor de informes, y el motor de informes hace el resto, estupenda filosofía, el generador es poderoso y se pueden hacer muchas cosas con él, sin embargo al igual que Crystal Reports, es un MARTIRIO la distribución del run-time para que el usuario pueda ver los informes, requiere de mas de 10 DLLs que hay que ir instalando equipo por equipo, si usas la version OCX, ir registrando en cada equipo el OCX del visualizador, instalar la licencia en los clientes, si quieres modificar un informe, hay que comprar licencias del diseñador, y todo por tener la facilidad de hacer reportes rápido y bonitos.

Hace unos meses me llegó por parte de un programador ruso llamado Sergey Spirin un demo de un producto llamado FastReport para xHarbour, en su momento no le dí toda la importancia que se merecía por falta de tiempo (de lo cual me arrepiento ahora), desde mi punto de vista FastReport es la solución IDEAL para la generación de informes con xHarbour.

Pero no adelantemos vísperas, en primer lugar .... ¿ quién o qué está detrás de FastReport ?, esa fue mi primer "sospecha" porque como habrás visto, la página de FastReport para xHarbour no es precisamente una maravilla, así que me puse a investigar detenidamente y averigué que FastReport es producido por una empresa Rusa, y que además es uno de los productos mas famosos y populares para los programadores de Delphi, bueno, eso para mí ya es un buen principio.

Si revisas la página de FastReport verás que es un generador de informes genérico, para usar con varios lenguajes de programación, y aquí es donde entra en acción Sergey Spirin, quien es un programador que además de programar, distribuye FastReport para (x)Harbour
con licencia OEM (confirmando por mí directamente con la gente de FastReport).

Sergey ha desarrollado interfaces para FastReport para Xbase++ y mas recientemente para (x)Harbour y aquí es donde comienza la magia de FastReport para (x)Harbour.

Para empezar me ENCANTO el producto por una simple y sencilla razón: TODO el generador de informes, incluyendo el diseñador visual y el motor de vista previa junto con los 13 motores de exportación vienen contenidos EN UNA SOLA DLL, lo asombroso no es que sea una sola DLL, lo realmente asombroso es que dicha DLL no mide mas de 3.5 Mbytes y no requiere ningún proceso de instalación ni de registro, simplemente la copias donde tienes tu archivo EXE de tu programa hecho en (x)Harbour y listo, ya tienes tu generador de informes.

El segundo punto a favor de FastReport es que la integración y manipulación del generador es mas simple que el mecanismo de un chupete, para integrarlo en tu programa (x)Harbour, y por programa (x)Harbour entendamos CUALQUIER programa que use este compilador, ya sea en modo consola, o para Windows hecho con Xailer, MiniGUI o FiveWin, Sergey ha creado una clase, la cual te la entrega con todo y el código fuente en un .PRG y un archivo de cabecera .CH, basta con agregar este archivo a tus programas (x)Harbour y la integración con FastReport está hecha.

Para usar FastReport en tu programa (x)Harbour, primero hay que crear la clase, la cual carga el DLL y luego hay que configurarlo para trabajar en el idioma que desees:

oFrPrn := frReportManager():new()

Los idiomas en FastReport se configuran a través de un archivo en XML, FastReport viene con 32 archivos de configuración de idioma:

oFrPrn:LoadLangRes("spanish.xml")

El idioma configurado será valido para la interfaz del diseñador, del motor de vistas previas y de los diálogos para la exportación de los informes. En productos como List & Label, los módulos de traducción de idioma te los venden por separado, y te cobran por cada idioma que quieras manejar, en FastReport están incluidos sin costo adicional.

Una vez configurado FastReport, entonces podemos elegir entre diseñar un informe nuevo, visualizar uno ya diseñado, o modificarlo.

Si queremos activar el diseñador visual, para hacer un informe nuevo, basta con hacer:

oFrPrn:DesignReport()

y aparece el diseñador en una ventana por separado:



Si queremos modificar un reporte previamente hecho, hacemos:

oFrPrn:LoadFromFile("archivo.fr3")
oFrPrn:DesignReport()

Y finalmente para visualizar un informe hacemos:

oFrPrn:LoadFromFile("archivo.fr3")
oFrPrn:ShowReport()



El diseñador de informes es 100% configurable, tanto con respecto a la forma de obtener los datos, que pueden ser DBF, ADT, o SQLs via ADO, también puedes añadir tus propias constantes y fórmulas, una cosa increíble de FastReport es que puede llamar a una función contenida en tu EXE.... así como lo lees, tu puedes escribir una función en (x)Harbour, compilarla en tu programa, y FastReport puede llamarla, ejecutarla y obtener el resultado para incluirlo en el informe al momento de la vista previa.

Lo mas complejo y desde mi punto de vista lo mas importante para aprovechar al máximo FastReport, es aprender como utilizar el diseñador visual, el cual es muy completo y no le pide nada a productos como Crystal o List&Labels, el manual del diseñador son mas de 300 páginas y en él vienen perfectamente documentados el uso de todas las características del diseñador, tenerlo a mano en los primeros pasos con el producto es muy necesario, de ser posible lo recomendable es tratar de leerlo previamente antes de comenzar a aventurarnos a hacer nuestros propios informes, tengo que admitir que el grado de complejidad que se puede lograr en un informe es bastante alto.

Todo lo contrario en cuanto a voluminosidad es el manual del programador: es de tan solo 50 páginas, pero en esas 50 páginas son oro molido para el desarrollador porque vienen documentados absolutamente todos los métodos, eventos y propiedades del objeto FastReport para su manipulación desde tu código fuente.

Hablemos un poco ahora del diseñador, el cual es "basado en bandas", cada banda corresponde a una parte del informe, la cabecera es una banda, el cuerpo es una banda, y el pie de página es otra banda, puedes agregar todas las bandas que quieras, por otro lado FastReport sabe perfectamente como hacer informes Maestro-detalle, con tablas DBF relacionadas, vamos, se entiende con los DBFs y ADTs de manera extraordinaria:



Es importante tocar el tema de como se alimentan los datos tanto al diseñador como al motor de vista previa, lo cual se hace mediante el método ::SetWorkArea() de la propia clase:

USE Customer SHARED NEW
SET INDEX TO CustA, CustB
oFrPrn:SetWorkArea("customer",1)

Asignar a través de este método el "Alias" de la tabla DBF o ADT al objeto FastReport cumple con 2 funciones: La primera es cuando llamas al diseñador de informes a través del método ::DesignReport(). En el diseñador visual la estructura de la base de datos aparece para que puedas seleccionar los campos visualmente para integrarlos en el diseño del informe:



Y al mismo tiempo el hecho de asignar el alias al reporte, le indica al motor de vista previa, LOS DATOS A IMPRIMIR, el motor de vista previa tomará los datos del área de trabajo y los pondrá en el informe a presentar, por esta razón tu puedes organizar los datos de la forma en que mas te convenga, ya sea indexados, filtrados, con un Scope, etc.

También es posible asignar mas de un solo "alias" al mismo informe, con sus repectivas relaciones previamente establecidas por código para lograr reportes aún mas complejos que vinculen datos de mas de una sola tabla.

Esta técnica también es válida para alimentar al infomre trayendo datos vía ADO y SQL y con los DataSets de Xailer (puedes generar informes a partir de un DataSet de Xailer sin importar sobre que base de datos trabaje), y para rizar el rizo, puedes definir tu mismo la manera en que se alimenta el informe con los datos, por ejemplo, cuando generas un informe a partir de un array, tu le puedes "enseñar" a FastReport la manera en que tiene que moverse sobre los elementos del array para ponerlos en el informe esto se hace por medio del método ::SetUserDataSet(), y FastReport generá un informe a partir de un array generado por tu programa, aquí un ejemplo de la función Directory():



FastReport también te permite generar gráficas de negocios a partir de los datos del informe:



También puedes diseñar etiquetas, imprimir códigos de barra y añadir imágenes a tus informes tales como fotografías, logos, etc. También puedes hacer reportes para formatos pre-impresos como facturas o formularios, y hasta diseñar un informe por programa, tal como lo harías con un objeto Report de Xailer o de FiveWin.



El motor de vista previa se cuece aparte, los informes los presenta de manera perfecta, incluso con miniaturas como lo hace por ejemplo el Acrobat Reader cuando te muestra un PDF con varias páginas:



Desde el motor de vista previa también es posible exportar el informe a 13 formatos distintos, puedes generar un informe para impresora de matriz de puntos, pero también para: Excel, Word, PDF, Imagenes (BMP, JPG, GIF, TIFF), Txt, XML, RTF, HTML, etc.



Las exportaciones son PERFECTAS con donde las mires, en el caso de la exportación a Excel la exportación es hecha celda por celda, hasta el mas mínimo detalle.

FastReport tiene su propio cliente de correo electrónico, lo que te permite enviar el informe por correo desde el motor de vista previa en cualquier formato de los contemplados en la exportación:



Otra característica "peligrosa" pero que alguna vez ya un cliente me la había pedido, es la capacidad de modificar el reporte DESPUES de generado, esta característica se puede anular por su puesto desde la configuración del informe desde tu programa:



A diferencia de otros generadores de informes, no es necesario pasar por la vista previa para imprimir o exportar un informe, puedes enviar un informe directamente a la impresora y en el caso de la exportación, todos los componentes de FastReport son manipulables a nivel individual, por ejemplo puedes hacer envíos masivos de correo a partir de los informes generados por FastReport, usando el mismo cliente de correo del producto.

Yo he aprovechado esta capacidad para hacerme un pequeño programa con Xailer para publicación en internet de los informes generados por FastReport, haz click aquí para ver los informes publicados en web.

Me tomé la libertad de descargar de la web de Sergey los ejemplos de FastReport para Xailer y FiveWin y generar un demo listo para funcionar, puedes descargarlos de aquí:

Ejemplo con Xailer
Ejemplo con FiveWin
Ejemplo en Internet

Simplemente descarga los archivos comprimidos, desempácalos en cualquier directorio y ejecuta el programa EXE incluído, los ejemplos ya vienen construidos, pero también se ha incluido el código fuente del programa de ejemplo tanto del proyecto Xailer y como de FiveWin.

¿ Y cuanto cuesta todo este poder ?, pues solo 300€, realmente un regalo, tomando en cuenta que no hay que pagar por la distribución, tu compras una sola vez tu licencia OEM de FastReport para desarrollador y puedes distribuir libremente la DLL con todos tus desarrollos. Solo para darte una idea, la versión mas básica de List&Label cuesta $ 725.00 USD y Crystal Reports 10 Developer cuesta $995.00 USD.

19 comentarios:

Jose dijo...

Hola René

Yo utilizo Fastrepots con xbase++ desde hace 2 años. Desde el principio me parecio maravilloso, muy fácil y fiable. Solo me extraño que no tuviera mas aceptación.

Recuerdo que le hicieron algunas críticas y Sergei es muy preciso y eficaz con sus respuestas pero poco amable, poco comercial. Hacía falta un artículo como el tuyo para potenciar este producto.

Sergei tenía previstas muchas mejoras (mas tipos de gráficos, Olap, etc.) espero que con el nuevo impulso que das al producto se anime a continuar.

Trabaje con Clipper mas de 20 años y siempre hice los informes con código. Hacer lo primeros informes con Frax me llevó menos de una semana. Actualmente dedico la mitad del tiempo a cada informe, me canso mucho menos y el cliente queda mucho mas contento.

Aún no he probado Xailer, pero si se hacen las pantallas de entradas de datos con la misma facilidad y fiabilidad de Frax lo compraría de inmediato.

Llevo años leyendo lo que escribes asi que aprovecho para agradecerte lo que nos has enseñado.

Jose Valle

Wilson 'W' Gamboa A dijo...

Maestro Excelente su articulo donde se compra esta maravilla y funciona con driver AdsNtx para ads Server 7.x ?
saludos desde Ecuador

Rene Flores dijo...

Se compra directamente con Sergey Spirin en Rusia (puedes pagar con tu tarjeta de crédito) en:

http://www.partitetsoft.ru/frh.htm

Y sí, si funciona perfectamente con ADS tanto con NTX, CDX y ADTS.

nyebit dijo...

Estoy empezando a probar FR4 para Delphi, sabeis donde puedo encontrar algun tutorial o algo asi para empezar.
He mirado la documentación que hay en la web de FastReport pero no acabo de aclararme.

Gracias

Jose dijo...

Puedes ver un tutorial en:

http://www.anapi.com/descarga/h6guiafr.pdf

está un poco anticuado pero puede ser útil.

Para mi lo mas util fué la demo de Fastrepotrs y la documentacion.

También hay un grupo de noticias que funcionó muy bien mientras un tal Gord K solucionaba las preguntas que le hacían.

http://www.fast-report.com/en/support/

nyebit dijo...

Muy agradecido.

Anónimo dijo...

Hola Rene

Excelente has visto la Luz llevo 2 años utilizando FR para Delphi y la verdad es una maravilla.

Saludos
Ramiro desde Guadalajara

Rene Flores dijo...

Ramiro:

Definitivamente soy un convencido de los generadores de informes visuales.

Como comento en el artículo he trabajado con varias soluciones visuales de reportería muy buenas, los peros: El precio, y el dolor de ..... cabeza que es instalar el runtime en los equipos que van a visualizar los reportes, una vez me encontré que los DLLs de Crystal eran mas grandes que el EXE que hacía uso de ellos, hazme el favon cabror.

Por otro lado se agradece MUCHISIMO que tengas un componente nativo de tu lenguaje de programación para acceder a toda la capacidad del generador de reportes. En este caso la clase creada por Sergey para utilizar xHarbour es simplmente MARAVILLOSA, tiene algunos detallitos que hemos ido puliendo (la ventaja de tener el código fuente), hoy por hoy te puedo decir que con Xailer funciona que se te cae la baba.

El amigo Bingen Ugaldebere de BiSoft, tiene en su sistema BiConta todos los informes hechos con Fast, y le he visto hacer unas cosas que francamente son imposibles de hacer con los generadores nativos de informes de las GUIs para xHarbour (Xailer, MiniGui o FiveWin), y aun de la misma clase Win32Prn() de xHarbour, es mas, estoy seguro que a Crystal o a List&Label les costaría mucho trabajo hacerlos.

En este momento estoy trabajando con Sergey para poder integrar FastReport como un componente de Xailer en la versión 2.0, pero antes de hacerlo, estamos trabajando en hacer que el motor de vista previa de Fast corra dentro de un formulario de Xailer, y estamos a punto de lograrlo, una vez hecho esto veremos si es posible integrarlo en el IDE de Xailer.

Conclusión, los mejores 300€ invertidos en herramientas de desarrollo.

Joel Armando dijo...

Como bien dice Master la página de FastReport da mucho que desear, pero el producto vaya que es una maravilla, no habia tenido la oportunidad de testearlo y me a sorprendido.
Una pregunta, se pueden generar reports partiendo de un RecordSet via ADO ?

saludos y gracias por el excelente artículo
Joel Andujo

Armando dijo...

Master:

Como siempre !, Ilustrativo.

Voy a echarle una mirada.

Saludos

Armando dijo...

Maestro:

En una cuantas horas y con la ayuda de tu excelente artículo he logrado incluir FastReport un una de mis aplicaciones, compilar sin problemas y lo que es mejor he logrado emitir un reporte.

Hasta ahora FastReport ha superado mis espectativas.

Tengo una duda, en la página de FastReport se muestra un precio de 249 USD, sin embargo en la página de Sergey se muestra el precio de 299 Euros, por qué ?

Saludos

Jose dijo...

Hola Armando.

Lo que nosotros compramos a Sergei es Fastreports mas la adaptación que el hizo. De hecho Sergei paga al fabricante de Fastreports por cada copia que vende.

Otra ventaja que tenemos es que tu puedes terminar todos los informes antes de comprar. La limitación es que solo puedes imprimir 5 páginas.

En resumen, una maravilla en todos los sentidos y espero que compremos las suficientes copias para que Sergei se anime con Fastcube, etc.

Rene Flores dijo...

Armando:

Lo que Sergey te vende es una licencia de FastReports OEM + la clase que el diseñó para (x)Harbour con FastReports, la verdad 100€ por todo lo que hace la clase merece mucho la pena.

Armando dijo...

René:

Como dice nuestro querido y viejo amigo.. "Lo sospeché desde un principio", solo quería estar seguro.

Desde luego que aún con la diferencia FastReports vale la inversión.

Un abrazo

oncle dijo...

Que tal René

Estoy intentando descargar los ejemplos que comentas, pero no funcionan los links.

Quisiera modificar unos informes realizados con fastreport y que van con el programa FormulaGes y que no son de mi agrado. Me he metido en la opción que da el programa para modificar el informe, pero lo veo muy complicado, por eso intentaba descargar los ejemplos para ver si era capaz.
Saludos.

Oncle

Ing. Ramiro Flores dijo...

Hola Rene.

Yo he trabajado con el Fast Report desde la vrsion 2 con Delphi y actualmente la trabajo con la version 3.24, es como dicen una verdadera maravila en cuestion de facilidad, completa, y rapida respuesta.

Ahora me ha surgido la necesidad de hacer unos reportes en Web con c# y vi que tiene una opcion de Fast Report Net, pero no veo documentacion de como generar los reportes en runtime, o sea, pongo el componente y diseño el reporte hasta ahi no hay problema, mi problema viene de como agregarle el dataset que estoy generando en runtime.

Bueno, espero haberme explicado y que puedas ayudarme.

gracias de antemano.
Saludos

P.D.
Apenas conoci esta pagina, y me parece buena, estare mas al pendiente

Anónimo dijo...

Como puedo crear un fichero.fr3 para ver un fichero dbf sencillo,
por ejemplo el tipico de clientes.

Tengo esto:

********** Inicio
FrPrn := frReportManager():new()
FrPrn:Loadlangres(resdir+"spanish.xml")
FrPrn:SetWorkArea("clientes",6)
FrPrn:LoadFromFile("1.fr3")
** pava ver
FrPrn:ShowReport()
** para diseñar
FrPrn:DesignReport()
FrPrn:DestroyFR()

********** Final
No Puedo acceder a el fichero de clientes, o cualquier fichero que
ponga.

Un Saludo Angel.

Anónimo dijo...

Soy Angel (El ultimo anonimo)
el problema anterior lo tengo mas o menos solucionado pero tengo otro
que es ?

Cuando utilizo ficheros con un nombre que varia, por ejemplo
datofavxx, donde xx es el numero de
ejercicio ,no consigo pasar ese nombre en el formulario y me da el
siguiente error

Work Area No ......: 2
Alias .............: HISTO18
Current Recno .....: 120
Current Filter ....:
Relation Exp. .....:
Index Order .......: 4
Active Key ........: TIPO+MOVIM

Work Area No ......: 6
Alias .............: FTMP
Current Recno .....: 1
Current Filter ....:
Relation Exp. .....:
Index Order .......: 0
Active Key ........:


-------------------- Internal Error Handling Information ---------------------

Subsystem Call ....: BASE
System Code .......: 1003
Default Status ....: .F.
Description .......: Variable does not exist
Operation .........: FTMP
Arguments .........:
Involved File .....:
Dos Error Code ....: 0

En este caso concreto en el fichero
ftmp que es un alias

select 6
use ficheroxx alias ftmp

Como tengo que definir el report
o los datos de paso ....?

Un saludo Angel.

Jose Valle dijo...

Hola Angel

Hay un grupo de Google

groups.google.com/group/fastreport_for_x_harbour

En el que te responderán antes.