PDA

Ver la Versión Completa : Solicito consejo para generar un documento totalmente dinámico


rolandoj
05-10-2010, 02:49:30
Hola a todos,

Agradezco me aconsejen como para resolver el siguiente problema:

Debo imprimir un documento totalmente dinámico, a partir de una lista de campos y de formatos introducidos por usuarios. Esto es esencialmente la misma idea de la generación de páginas Web dinámicas con TPageProducer; o sea:

Existe un registro con los valores actuales de n campos; pero, la posición y el orden en que se van a imprimir no es conocida de antemano. Para ello, el usuario haría modelos de documentos, parametrizados mediante marcadores con el nombre de un campo, indicando la posición de despliegue de cada campo. Estos modelos deben soportar un formateo básico (alineación justificada, centrada, etc; varios tipos de fuentes, y cosas similares).

El software debe hacer un parser de ese documento, encontrar las posiciones de los campos y reemplazarlos por los valores actuales. El resultado es el documento a imprimir.

La lógica es clara y facil de codificar; pero, al momento de imprimir, que técnología me brinda el mejor soporte ?

Mis dos opciones básicas son :

A. Que un componente Memo de un reporteador imprima el texto formateado. En ese caso necesito un componente de impresión de Memo que soporte un texto formateado con las especificaciones dadas. Normalmente uso QuickReport; pero el TQRMemo standard no soporta las características y el TQRRichText solo algunas, no produciría un documento de calidad. Alguién conoce componentes que lo hagan ?, quizás en otro reporteador ?

B. Generar directamente un archivo en PDF o Word, o algo similar, y mandar a imprimir el archivo. Que componente podría usar ?.

Nota 1: Descarten la automatización OLE. Serviría; pero, he detectado problemas de compatibilidad.

Nota 2: Debe funcionar con Delphi 2007, o con Delphi 4 (preferiblemente)

Neftali [Germán.Estévez]
05-10-2010, 11:36:48
Además de las opciones que comentas, creo que te has olvidado de la más "rapida" o al menos es la que primero se me ocurriría a mí. La de un componente que permita generar reportes en ejecución.
En el caso de QR, si no recuerdo mal, existía QRDesign (http://www.quickreport.co.uk/WebInfoPage.aspx?WebInfoID=646); Aunque en su momento me suena haber leído sobre otros similares. Es un pequeño diseñador que pueden usar los usuarios finales. Con un poco de práctica se pueden generar y personalizar sus listados. Se trata de arrastrar los campos donde quieran, cambiar los tipos de letra y poco más.

La segunda opción, es utilizar por ejemplo Word o Writer (OpenOffice), generar la plantilla en Word/Writer (como para realizar una Combinación de Correspondencia o MailMerge) y luego desde programa generar los datos y realizar por código (automatización) esa combinación. Tienes que escribir más código, la automatización no es sencilla y puedes tener problemas de versiones (no con Delphi, sino con las versiones de Word -con Writer no lo he probado-).

Por último puedes trabajar directamente con TRichEdit (o similar), sin el Reporteador, puesto que TRichEdit ya posee el método de Imprimir (bastante básico, pero puedes probar si te es suficiente). Que el usuario "diseñe" el listado sobre el RichEdit con referencias a donde quieres los campos (tipo <<NOMBRE>>, <<DIRECCION>>,...) y luego tú por programa haces las sustituciones y lanzas la impresión.

Espero no haberte liado más de lo que estabas.

Un saludo.

rolandoj
05-10-2010, 20:40:34
Hola Neftali,

Muchas gracias por el apoyo. Veo que entendistes perfectamente lo que estoy buscando. Te comento lo siguiente:

1. Respecto a lo que dices de problemas con las versiones de Word, etc, y no con Delphi, estoy totalmente de acuerdo. De hecho, cuando dije que descartaba la automatización OLE fué precisamente porque en un proyecto anterior implementé así un caso similar. Funcionó muy bien; pero después se armó un problema grave cuando salió la nueva versión de Office.

2. Lo que dices del TRichEdit, conceptualmente es exactamente lo que quiero; el problema es que le falta cierta capacidad de formateo y por ello los documentos no salen muy bien presentados.

3. El QRDesign que mencionas no es un componente standard de QuickReport. Voy a investigar sobre él

Jab
06-10-2010, 13:10:34
¿Por qué no usas el FreeReport? Funciona para Delphi 4 y pueden configurar sus propios informes y documentos.
Permite exportar a Word para luego su manipulación.

Para PDF sino encuentras componente (el Quickreport permite exportar a PDF pero a partir de las versión 4) puedes usar el PDFCreator, aplicación gratuita que te instala una impresora PDF que pueden usar.

Esto son alternativas.

El QRDesign es como el FreeReport, pero mientras que el primero debes pagar por usarlo, el FreeReport es gratuito y te permite modificar el código fuente para mejorarlo o eliminar lo que no necesites.

Hay traducciones en varios idiomas.
Saludos.

Neftali [Germán.Estévez]
06-10-2010, 14:05:27
2. Lo que dices del TRichEdit, conceptualmente es exactamente lo que quiero; el problema es que le falta cierta capacidad de formateo y por ello los documentos no salen muy bien presentados.

3. El QRDesign que mencionas no es un componente standard de QuickReport. Voy a investigar sobre él

Sé que hay algun componente de RichEdit que permite más cosas que el Estandard, sería cuestión de ver si encuentras uno que se ajuste a lo que necesitas.

El QRDesign es aparte; lo que ya no se si hay alguno más similar.

Otra opción, tal y como dice Jab, es buscar otro generador de reportes que posea ese módulo para que el usuario pueda crearse los suyos propios, sin necesidad de añadidos.
En mi caso no conozco ninguno, pero si FreeReport lo posee, deberías revisarlo.

Ya dirás cómo te va y que opción has escogido finalmente.

Un saludo.

rolandoj
06-10-2010, 15:52:53
Hola,

Gracias a todos por la información.

El QRdesign es un componente pago, así que debo investigarlo con cuidado antes de proceder a una compra.

El PDFCreator lo usamos actualmente para generar la salida en PDF; pero, eso asume que la salida ya está formateada. No conozco si también pued facilitar armar un documento PDF, ponerle marcadores para campo y reemplazarlos a tiempo de ejecución. Investigaré eso.

El freereport no lo conozco; pero, por la descripción parece una opción interesante; especialmente porque me permite seguir con Delphi 4 y honestamente no quisiera sacrificar Delphi 4 porque su IDE es mucho mejor que el del 2007. También lo miraré.

La opción que más me llama la atención es la posibilidad de un TRichEdit extendido; ya que el standard tiene casi todo lo que se necesita y la codificación es facil. Pienso que, de conseguir uno mejorado, el esfuerzo de implementación sería mucho menor en comparación a las otras alternativas.

El día lo tengo complicado; pero, trataré de investigar hoy mismo.

De todas formas, estaré pendiente del fory y de antemano agradezco igualmente cualquier sugerencia adicional.

movorack
06-10-2010, 16:27:18
Hola,

Solo para reforzar la idea del free-report (http://freereport.sourceforge.net/en/). es muy bueno para conseguir no solo lo que quieres sino para hacer casi que la mayoria de reportes que usamos constantemente.

Aquí te puedes descargar el demo (con el designer incluido): http://www.fast-report.com/pbc_download/fr233demo.zip

si tienes presupuesto valdria la pena mirar fast-report (http://www.fast-report.com/en/products/report-generator-for-delphi-fastreport-4.html) que además de tener el reporteador también te permite la autimatización de los reportes con PascalScript y conexiones a datos desde el mismo reporte.... Imaginate pasandole solo el ID de la factura al reporte y el reporte se encargue de hacer las consultas necesarias y mostrarlas deacuerdo a la programación hecha en el script.

rolandoj
06-10-2010, 18:26:30
Hola,

Estuve investigando por el lado de FreeReport, ya que también hablaba de un RichText extendido; pero, me encontré con el mismo handicap del RichText de Delphi.

El componente para RichText de FreeReport pide la librería Rx (versión 2.6 o superior). Instalé Rx Library 2.75, la que trabaja con Rich Edit 2.0 y tiene un interesante demo de RichEdit , con básicamente la misma funcionalidad que yo implementé en un proyecto anterior usando el TRichEdit standard y que se ilustró en otras respuestas de esta nota. Sin embargo, tiene la misma limitante de no soportar la alineación justificada. Para este proyecto en particular, eso es fundamental; ya que sin alineación justificada la calidad de impresión de los documentos no es satisfactoria.

Parecía un buen camino. Antes de abandonarlo, alguién puede aportar algo ?. Por ejemplo, en lugar de Rich Text tiene algún mecanismo similar ?

Muchas gracias

rolandoj
06-10-2010, 19:44:42
Hola,

Para retroalimentarlos les comento lo siguiente:

El componente TRichView de http://www.trichview.com parece ser una excelente opción. En lugar de marcadores soporta la colocación incluso de controles.

Infortunadamente es un componente pago demasiado costoso. Aclaro : demasiado costoso para lo que necesito; el precio me parece muy razonable considerando todas las capacidades que le he podido observar.

Aparte de eso, a primera vista, no me parece facil de usar. Creo que más bien es para quienes necesiten un nivel de sofisticación muy alto en sus impresiones y dispongan del tiempo necesario para trabajar con un producto tan elaborado.

Bueno, a seguir investigando

rolandoj
07-10-2010, 22:31:48
Hola a todos,

Les cuento que se agotó el tiempo que podía dedicarle a buscar una solución y no pude hallar ninguna satisfactoria. Las únicas que, según la publicidad con que se presentan, parece que funcionarían son demasiado costosas.

La opción de PDF Creator la estuve mirando; pero, su archivo de ayudas dice que es la aplicación la que ya debe tener el documento generado. PDF Creator tan solo la convierte a PDF; por tanto, no arregla el problema del texto justificado. En otras palabras, solo sirve para lo que hemos venido usándola.

Lamentablemente, toca resignarse a sacar un documento sin la calidad del caso.

De todas formas, dejaré abierto el hilo por si alguién encuentra alguna solución.

Al González
08-10-2010, 01:43:04
Hola Rolando.

He leído este hilo desde hace varios días, pero me queda la duda (y estoy seguro de que no soy el único) sobre:

[...] cuando dije que descartaba la automatización OLE fué precisamente porque en un proyecto anterior implementé así un caso similar. Funcionó muy bien; pero después se armó un problema grave cuando salió la nueva versión de Office.

¿En qué consistió ese problema? ¿De qué versión de Office hablas? ¿Podrías explayar al respecto? Gracias.

Al González. :)

rolandoj
08-10-2010, 02:14:18
Hola,

Gracias por interesarte.

Se trataba de una aplicación hecha con Delphi 5. La automatización la habíamos hecho con Excel para generar un reporte, que por cierto era bastante complejo. Funcionó bien con versiones de Office 97 hasta Office 2003

El caso fué cuando la empresa cliente pasó a Office 2007. La conexión OLÉ fallaba desde el arranqué. Investigamos un tiempo y, según lo que leímos en el propio sitio de Microsoft, el problema era que había que inicializar una variable a la cual Office accedía vía .NET; pero, no encontramos manera de acceder desde Delphi 5. En ese entonces buscamos algún componente que lo hiciera; pero, no hallamos nada.

Se planteó actualizar Delphi y/o recodificar en específico para Office 2007, ya que ni siquiera encontramos un componente que nos permtiera escribir un archivo Excel sin usar OLE.

Sin embargo, esa funcionalidad se perdió porque la empresa consideró que las alternativas no justificaban el esfuerzo y el costo. Al usuario principal le tocó hacer períodicamente el reporte a partir de un copy & paste desde nuestro aplicativo

rolandoj
10-11-2010, 18:45:56
Hola a todos,

En este tema ya nos habíamos resignado a que no se puede; pero, en la empresa me pidieron que hiciera un nuevo intento.

He estado investigando y desarrollando código propio. Algo avanzamos; pero, seguimos estancados. Por si le sirve a alguién, o puedo aportar algo, comento mis intentos con Delphi 4:

Hay 4 versiones principales de RTF : La 1.0, la 2.0, la 3.0 y la 4.1

La implementación de TRichEdit en Delphi 4 y Delphi 2007 directamente usa solo la versión 1.0 de RTF, la cual no soporta la alineación justificada. Ahora bien, al parecer, a nivel del propio Windows, cuando están instaladas las versiones 2 o 3, una llamada a la 1, es redirigida para usar la versión 2 o 3. Alguién podría confirmarlo ?. Es una deducción mía basada en ciertos indicios; no una certeza.

Uno de ellos es el hecho de que si se envía al control TRichEdit el mensaje de alineación justificada (propio de las versiones más nuevas), Windows lo procesa aparentemente bien. Se visualiza inmediatamente la alineación y cuando se guarda, el archivo lo guarda correctamente. El mismo comportamiento correcto ocurre si se pega al control un texto que se ha justificado en Word u otro producto similar.

Sin embargo, hasta ahí llegan las buenas noticias. Si se trata de visualizar de nuevo el archivo, cargandolo al control RichEdit, se pierde la alineación justificada.

Alguién puede preguntar aquí como sé entonces que el archivo se guardó bien. La respuesta es porque si se abre desde Word o desde Open Office, ahí sí se visualiza correctamente.

Sin embargo, si se abre con WordPad, presenta el mismo problema que en Delphi : Adios a la alineación justificada.

Lo anterior indica que lo más probable es que exista un error, a nivel del propio control RichEdit de Windows, cuando se esté cargando información al control. Si es así, creo que ya no hay más nada que podamos hacer para arreglar el problema por ese lado. Alguién puede confirmar esto ?.

La solución que quedaría sería usar la versión 4.1. Hay dos diferencias importantes con las anteriores : El nombre de la librería y el nombre de la clase. Probé redefinir CreateParams para que usara la librería y la clase de la versión 4.1; pero, en algún momento posterior empiezan a aparecer errores. Supongo que hay algunas otras cosas que deben ajustarse; pero, no he encontrado nada al respecto. Alguién puede aportar algo ?

rolandoj
11-11-2010, 01:53:35
Hola a todos,

Logré solucionarlo. Me falta optimizar dicha solución, y detalles menores; pero, el problema básico está solucionado. Todo ello con QuickReport y Delphi 4.

Más tarde daré detalles. Les adelanto algo:

Básicamente me puse a estudiar los comando RTF generados en los archivos "malo", contra los archivos "buenos" generados por otra herramienta. A prueba y error encontré que, por alguna razón, hay un par de comandos que hay que agregar al que genera el componente en su forma normal.

yusnerqui
14-12-2010, 00:17:38
He leido el hilo desde el principio y me he quedado como el que ve una peli de suspenso jajaja, esperemos que el amigo rolandoj se anime a detallarnos su ingeniosa solución.

Saludos

martinartaza
24-12-2010, 16:41:48
yo también me trague todo el hilo y me quede en suspenso.

martinartaza
22-01-2011, 16:24:03
Hola estoy tratando de hacer un reporte con fastReport y no logro que me ande la banda detalle, alguien tiene algún tuto en español?.
Desde ya muchas gracias.