https://foro.gambas-es.org/viewtopic.php?f=1&t=1379
-----------------------------------
soplo
Lunes, 07 Febrero 2011, 18:17

A Vueltas Con Los Reportes
-----------------------------------
Tengo este problema desde que empecé con gambas y ya va siendo hora de que lo encare.

Hasta ahora he utilizado una clase (que está aquí publicada) para imprimir en HTML. Dispongo de otra para imprimir en XLS de manera que cualquier listado puedo entregarlo en cualquiera de los dos formatos.

Pero no es suficiente. Ambos formatos tienen una gran pega. No son suficientemente seguros. Son fácilmente manipulables y eso me complica la vida. Yo quiero imprimir en PDF que aún siendo posible complica lo bastante un informe para que pueda considerarlo a priori un formato válido.

Y me pongo a estudiar como imprimir en PDF y no encuentro soluciones en Gambas. Tengo que acudir a terceras partes bien aplicaciones que lo hacen o bien imprimir con la impresora pdf. No acaba de convencerme.

También tengo entendido que un documento XML es fácilmente convertible a pdf.

El caso es que estoy considerando todas las formas posibles de crear un pdf no interactivo (esto es que pueda incluir imágenes, textos, hipervínculos y textos realzados utilizando únicamente gambas. Cuando termine habrá un componente con una serie de propiedades (márgenes, orientación papel, ...,etc) y funcionará algo parecido a un textedit. De hecho un textedit sería ideal para componer el texto solo que la propiedad text resultante debería ser un pdf y no un html.

Aún no tengo el dominio suficiente de textedit porque es bastante peleón, pero mas o menos esa es la idea que tengo y lo escribo porque no encuentro RFC ni lugar donde se explique la estructura de estos archivos. Todo lo mas la IO 19005-1:2005 pero es que hay que pagar $118 y paso. Debe haber algún sitio donde se explique con detalle este formato ¡si hay cientos y la madre aplicaciones que lo hacen! Si alguien conoce algún sitio donde pueda encontrar esa información le estaría muy agradecido.


-----------------------------------
shordi
Lunes, 07 Febrero 2011, 19:40

Re: A Vueltas Con Los Reportes
-----------------------------------
Ni idea, Soplo, tan sólo que sepas que abres camino para muchos. Actualmente yo estoy construyendo pdf imprimiendo html en el /tmp y luego usando otras herramientas (wkhtmltopdf, ps2pdf, etc) de modo transparente al usuario, pero tampoco me convence. 

Si lo consigues y decides pasarlo será una gran ayuda.


-----------------------------------
kotonfree
Lunes, 07 Febrero 2011, 22:46

Re: A Vueltas Con Los Reportes
-----------------------------------
Yo si que no tengo ni idea... :( . Soplo podrías explicarme como lo has hecho hasta ahora con el HTML? Es que estoy haciendo un editor de texto con un TextEdit, y me imprime en HTML.


-----------------------------------
jsbsan
Lunes, 07 Febrero 2011, 22:49

Re: A Vueltas Con Los Reportes
-----------------------------------
Soplo:
He mirado la wikipedia (supongo que tu tambien), y he encontrado este enlace que parece interesante [url=http://www.fpdf.org/]http://www.fpdf.org/,

"FPDF es una clase escrita en PHP que permite generar documentos PDF directamente desde PHP, es decir, sin usar la biblioteca PDFlib. La F de FPDF significa Free (gratis y libre): puede usted usarla para cualquier propósito y modificarla a su gusto para satisfacer sus necesidades."
Supongo que habra alguna panera de ejecurtar un programa PHP desde gambas...

Esta tambien [url=http://sourceforge.net/projects/pdfcreator/]http://sourceforge.net/projects/pdfcreator/ (que es código libre, y podrias estudiar como lo hace...)

En fin, si encuentro algo, vuelvo a escribir....

Saludos

Julio


-----------------------------------
fabianfv
Martes, 08 Febrero 2011, 03:15

Re: A Vueltas Con Los Reportes
-----------------------------------
Soplo, Shordi, dicen que generar un pdf a través de Cups o wkhtmltopdf no les convence, ¿cuál es el problema?

Otra opción es htmldoc.

Soplo, podrías ponerte en contacto con Luigi Carlotto que ha portado parcialmente la biblioteca FPDF a Gambas con el nombre [url=http://sourceforge.net/projects/pdfwriter/]PdfWriter (Luigi es también autor de PgDesigner entre otros programas).

Saludos.


-----------------------------------
shordi
Martes, 08 Febrero 2011, 09:37

Re: A Vueltas Con Los Reportes
-----------------------------------
Estoy ultimando un programa que permite imprimir cualquier dato de cualquier tabla MySQL o SQLite. Permite guardar formatos de listados, elegir entre un montón de diseños CSS, generar filtros y almacenarlos, hacer etiquetas de direcciones (o de lo que quieras), etc. etc. Todo ello sobre HTML.

El problema, Fabian, es el "renderizado" del html. Por ejemplo: Haces un listado html en el cual los datos están en una tabla y las cabeceras en el <theader>. Si lo imprimes desde wkhtmltopdf esas cabeceras no se repiten en cada página ni el <tfooter> tampoco.

Si pasas de renderizados y calculas tú las líneas de impresión e insertas cabeceras "a pelo", en la pantalla son horribles de ver, y ya no puedes dar libertad al usuario de elegir los campos a imprimir, etc (por cuanto ya no controlas el ancho del papel y demás.)

Tal vez haya alguna manera de "predecir" el ancho que tendrá la línea de datos seleccionados por el usuario impresa sobre el papel y dar el formato necesario, y los márgenes de impresora, etc. etc... pero yo no la conozco.

Por mi parte todo estaría correcto si wkhtmltopdf generase un resultado igual al que generan los navegadores (o si se pudiese decir al firefox que sólo queremos que imprima la página y no la muestre, claro). Lo más parecido que se me ha ocurrido es añadir en el html que genero aquello de <BODY onload="window.print()"> para que la caja de impresión se le abra al usuario... 

Si alguien tiene alguna manera mejor de manejar el tema... por favor que lo diga.


-----------------------------------
soplo
Martes, 08 Febrero 2011, 14:36

Re: A Vueltas Con Los Reportes
-----------------------------------
Al reflexionar sobre el tema me doy cuenta que son dos problemas.

Uno es obtener el informe propiamente dicho y otro el formatearlo.

El primer problema es obtener el informe. Estoy pensando en una clase con las siguientes propiedades
1. Papel a utilizar
2. Orientación
3. Titulo del informe
4. Cabecera de pagina
5. Pie de pagina
6. Ancho de columnas
8. Formato de dato en columnas
9. Grupos/Subtotales
10. Total General
11. Pie de informe
12. Numeracion de paginas

Y el resultado sería un texto ASCII con cada línea calculada del informe y un descriptor para indicar si esa linea es titulo, cabecera, grupo, pie, detalle, ... Sería un texto ascii donde únicamente está el contenido.

A partir de ese texto que sería un txt ya se lo podría meter a otra rutina que coge eso y es capaz de dejarlo en otro formato que podría ser desde html, xls, odt, pdf, ps y algún otro que ahora no caigo.

El formateado de informe
El formateado tendría que ver con la clase de documento a crear. Para definir un formato utilizaría un string mas o menos como sigue Fuente/tamaño/color/Negrita/Cursiva/Subradado/Tachado/Alineacion
Por ejemplo
1/24/255/N/c/s/t/C
Esto significa fuente 1 (font[1]
tamapño 24
azul (color.blue=255
N --> si está en mayuscula negrita ON si está en minuscula negrita OFF
C --> si está en mayuscula cursiva ON si está en minuscula cursiva OFF
S --> Si está en mayúscula subrayado ON si está en minúscula subrayado OFF
T --> Si está em mayúscula tachado ON si está en minúscula tachado OFF
A --> i izquierda D derecha C centro J justificado
Así que el ejemplo anterior es fuente 1 tamaño 24 en negrita centrado

Con esa definición de formato podría hacer tener las siguientes propiedades:
Titulo --> formato para el titulo
Cabecera --> formato para las cabeceras
Detalle --> formato para las líneas de detalle
Grupo --> formato para las lineas de grupo/subtotales
Totales --> formato para las lineas de total general
Pie --> formato para las lineas de pie.
Formato Salida --> html, pdf, xls, ps, ... el formato de salida
Fichero Salida --> nombre del informe resultante

La ventaja que le veo a este sistema es que parto de una misma base para formatear cualquier informe al sistema que quiera. 

La parte que mas me interesa en este instante es la de crear el informe. Pongamos que tengo la clase hecha y le digo
Dim P as NEW GenerarInformeASCII
dim Titulo as NEW String[]
Dim Cabeceras as NEW String[]
Dim Grupos as NEW String[]
Dim Pie as NEW String[]
Dim Anchos_Columna as string
Dim Formato_Columna as String
P.query="select nombre as Nombre, telef as Telefono, dni as CIF/DNI, imp as Importe, iva as Iva, imp+iva as Total from ..."
P.Papel="A4"
P.Orientacion="P" 'orientación Portrait
Titulo.add"IINFORME DE FACTURAS A REALIZAR"
titulo.add("")
titulo.add("Desde "& Fecha_Desde & " a " & Fecha_Hasta)
titulo.add("")
Cabeceras.add("primera linea en cada página")
Cabeceras.add("segunda linea en cada pagina")
Grupos.add(3,"Cabecera_grupo",4,"Pie Grupo","MAX")
Grupos.add(4,"Cabecera grupo",4,"Pie Grupo","SUM")
Pie.add("primera linea pie de pagina"
Pie.add("segunda linea pie de pagina"
Anchos_Columna>"20/10/10/7/7/8" 'primera columna 20 car, segunda 10 car, ...
Formato_Columnas=" "/" "/" "/###.###,00/###.###,00/###.###,00"

todo así.

Puedo tener tantos subgrupos como quiera, en la select con el AS especifiqué el título de cada columna. El título por ejemplo puede tener tantas lineas como quiera. En los grupos especifico un string que la columna por la que agrupar, dice el texto de cabecera de cada grupo, la columna por la que calcular  a pie de grupo y el texto que debe tener. Tantos grupos como quiera. Cada uno dentro del anterior. Los anchos de columna medidos en caracteres. El formato de columnas en un formato válido FORMAT.

La clase genera la query, formatea los datos y devuelve el nombre de un archivo temporal que contiene eaa información. 
Un Cat a ese archivo debería mostrar el informe con los campos separados por / las anchuras adecuadas y el formato de fechas, numeros, etc correcto. A partir de se archivo con las lineas ya calculadas realizar un formatu u otro solo es ir escribiendo en ese formato un string tras otro.

Ya quedaría formatear el informe con negritas, fuentes, etc y dejarlo en el tipo de salida especificado que es el segundo problema.

De esa forma podría tener una clase a la que le doy una query y me devuelve un archivo en un formato espeficado con datos debidamente calculados y formateados.


-----------------------------------
soplo
Martes, 08 Febrero 2011, 19:28

Re: A Vueltas Con Los Reportes
-----------------------------------
Llevo toda la tarde pensando en ello y me doy cuenta que ese es el planteamiento correcto. Partir de un formato de datos con solo texto que yo pueda convertir a lo que quiera.

En la práctica funciona igual que un crystal report salvo el pequeño detalle de que no es WYSWYGET pero permite coger cualquier query y obtener un informe en formato pdf, Txt, ps, html y algún otro con cierta facilidad. De ellos el que tengo menos idea es el pdf, pero seguro que lo conseguiré. 

A ver si saco un poquito de tiempo y me pongo a ello. Si funciona como creo será una clase con muchas propiedades porque habrá que darle los títulos, encabezados, pies, grupos, formato de números, fechas, etc pero a cambio se obtiene el equivalente a crystal report en Gambas.

Tengo que sacar un poquito de tiempo que ahora ando bastante pillado.

 :mryellow:


-----------------------------------
shordi
Martes, 08 Febrero 2011, 20:34

Re: A Vueltas Con Los Reportes
-----------------------------------
Creo que son dos problemas distintos. La exportación de datos a html, csv, xls, odt o lo que sea es una cosa. 

La impresión es otra.

Generar formatos tipo csv es bastante sencillo y no tiene nada que ver con la imprsión, tipo de letra, etc. etc.
En cuanto a los códigos para imprimir, ese camino lo empece yo hace algún tiempo... no exactamente igual, claro (que yo no utilizo el paradigma poo), pero acabé dándome cuenta de que volvía a intentar inventar la rueda. 
Me explico: No es que no funcione, que funcionaría. Es que ya existe un lenguaje de marcas para todos esos formateos de datos: html y css.

Creo que con html y css se puede generar cualquier reporte con un sistema fácil de modificación. Entre ambos tienes clara la sepración de lo que es la estructura del listado, cabeceras, filas, líneas divisorias, márgenes, etc. y lo que son los tipos de letra, tamaños, etc. etc.

El 80% del trabajo ya está echo, creo. Lo que falta es el traspaso de ese conjunto a la impresora o al pdf (que es casi lo mismo).

Es mi opinión. A ver si lo afino un poco más y puedo subir el programa que tengo casi en fase Alfa para ilustrar esto que digo.
Lo he llamado, siguiendo mi sistema Mortadelo-Filemoniano de buscar nombre a los programas: La SIESTA (Solución para Impresos y Etiquetas de Tamaño Ajustable).


-----------------------------------
jsbsan
Martes, 08 Febrero 2011, 21:33

Re: A Vueltas Con Los Reportes
-----------------------------------
¿por que no usas el componente odt.gb[url=http://jsbsan.blogspot.com/2010/12/gbodt-2-version.html](version 0.2.0), que cree?
[img]http://4.bp.blogspot.com/_Nr9BGSyAYMU/TQPVuLd67iI/AAAAAAAAADw/9Nmh_UyUUbQ/s1600/Pantallazo-2.png[/img]
[img]http://3.bp.blogspot.com/_Nr9BGSyAYMU/TQPVyurRZoI/AAAAAAAAAD0/SfXrVNBp_X4/s1600/Pantallazo-1.png[/img]

Transforma un archivo "con etiquetas parecidas al html" y lo pasa a odt, y luego desde el openwrite lo puedes pasar a pdf. Asi te olvidas de numeros de paginas, y puede "reeditarlo" con el openwrite..

Si quieres ver un ejemplo "complejo" de como lo uso mira el programa lince. Genera informes, cambiando tipo de letras, tamaños, negrita, cursiva, etc....
[img]https://9166795319856577431-a-1802744773732722657-s-sites.googlegroups.com/site/xlincegambas/capturas-de-pantallas/Pantallazo-1.png?attachauth=ANoY7cq3ug7eyHNJahiNeNvQKK6snNAE4cUrol324uPtkCostxk7EbmccPYZlpVWoiLh5JLXIiNCB3nrqLYiBnm_VUSsdke7F4JonTJmU4Z7b5vclH7QOr5vGxaYJ7axG2IWEeE2ydepnWWc5HYBqx6AbmnCF_qjaeGhVH9w6A53UxNUQcDTIhxaqMkRoNuKBxbrfdGP_JPyQ_-140-EI-auSu5BUbyNglLv8eL5-PY1-S4j9Q3AjeY%3D&attredirects=0[/img]

Saludos...


-----------------------------------
shordi
Martes, 08 Febrero 2011, 23:04

Re: A Vueltas Con Los Reportes
-----------------------------------
Julio, he echado un ojo a tu componente y si abres el archivo "documento base.html", que es el que utilizas, creo, como punto de partida, con el procesador de textos se ve prácticamente igual que el resultado final, por lo que me parece dar muchas vueltas para acabar donde empezaste, la verdad. 

Vuelvo a decir lo mismo, no veo la necesidad de utilizar tanta etiqueta propia -¿Para qué, si los que parieron HTML y CSS lo hicieron mucho mejor de lo que tú y yo somos capaz de hacer?-, tanta ida y venida para, al final, tener un documento .odt, que el usuario puede modificar y del que él mismo debe encargarse de archivar, imprimir, pasar a pdf, etc. etc.   

En última instancia, eso de usar etiquetas propias o acoplarse al estándar HTML y CSS es lo de menos. Al final obtienes un documento con texto etiquetado que hay que pasar a la impresora... y entonces dependemos de el navegador web, en mi caso, o del procesador de texto en el tuyo. El problema, repito, no es el formato, es la impresión. Si alguien sabe cómo generar directamente pdf a partir de html (con un buen renderizado, claro, que wkhtmltopdf, que es lo único que he encontrado, deja bastante que desear)... pues como que sería muy bienvenido.

Suerte


-----------------------------------
soplo
Miercoles, 09 Febrero 2011, 18:49

Re: A Vueltas Con Los Reportes
-----------------------------------
La cuestión es que con html y odt se tienen algunas ventajas, pero hay algunos inconvenientes. uno de ellos es la inseguridad porque es fácil modificar el mensaje.

Viendo el problema de los reportes desde un punto de vista global he tratado de buscar una base desde la cual una deetrminada información pueda transformarla al formato que quiera. Estoy de acuerdo con Shordi que muchas veces el formato html puede ser perfectamente conveniente y el odt también, pero no siempre. Cuando pasa eso es cuando te metes en un berenjenal. Yo he tratado de buscar un método común para presentar una información de manera profesional y en el formato que en cada momento se quiera tal como lo hace crystal report.

Por eso yo parto de la base de crear un documento base en el cual estén ya los datos tal y como se deben mostrar (esto es los totales y subtotales, los números y fechas en formato adecuado, las cabeceras y pies, etc. A partir de ese documento base que está en ascii yo crearía bien un html, bien un odt, bien un csv, bien un ps, bien un txt, bien un pdf, ..., etc. 

Ese documento base debe tener las lineas calculadas nada mas y probablemente el mejor formato para él es CSV pero eso lo tengo por pensar bien.

luego queda hacer una rutina que coge un csv y construye un html. Una rutina que coge un csv y construye un pdf. Una rutina que coge un csv y construye un ps, una rutina que coge un csv y construye un xls,..., etc. Cuando las tenga todas hago un componente con todo eso y el resultado es que tu creas un NEW de ese componente, rellenas sus propiedades, le indicas el formato de salida y ya lo tienes. Cualquier formato con el mismo esfuerzo. 

La que veo mas problemática es las del pdf porque me falta información, pero ya la encontraré.

 :mryellow:


-----------------------------------
razaAztk
Jueves, 10 Febrero 2011, 07:17

Re: A Vueltas Con Los Reportes
-----------------------------------
@ soplo:

Pero no entiendo bien para que crear un sistema de marcas propio para terminar usando html, odt, ps, pdf, etc (tercer parrafo)

Ahora si te preocupa que se pueda modificar la información, yo que tu mejor usaría encriptación, o proveería al documento de una especie de "firma digital" (no sé, talvez un checksum al menos para los datos importantes).

Dices que tienes problemas a lograr una buena conversión de html a PDF, que tal si mejor te creas un documento Latex y lo compilas con el mismo compilador existente de Latex, con lo que obtienes el PDF y hay también scripts/librerías para obtener documentos html a partir del Latex. Así ya no te creas un nuevo lenguaje de marcas, ya no reinventas la rueda (je, como dicen los programadores).

Saludos!


-----------------------------------
shordi
Jueves, 10 Febrero 2011, 09:34

Re: A Vueltas Con Los Reportes
-----------------------------------
razaAztk: ¿podrías ampliar un poco eso del Latex? Nunca he utilizado ese formato. 
Gracias


-----------------------------------
soplo
Jueves, 10 Febrero 2011, 19:21

Re: A Vueltas Con Los Reportes
-----------------------------------
[quote]Pero no entiendo bien para que crear un sistema de marcas propio para terminar usando html, odt, ps, pdf[/quote]
Pues parece bastante claro. Sobre una query tu puedes querer generar un reporte. Un reporte no es una query. Es un informe en el que los datos se agrupan, calculan y se distribuyen a lo largo de una página que puede ser un A4 o un A3 o lo que sea.

Hay veces que el resultado lo quieres en un csv por el uso que le vas a dar. Otras veces quieres un pdf y otras veces quiers un html por razones diversas. Actualmente para cada formato hay que aplicar una técnica con lo cual si en una aplicación quieres todos esos tienes que codificar todas esas rutinas. Yo quiero agruparlas todas en un solo componente al que puedas decirle en una propiedad que quieres el resultado en pdf o xls o csv o lo que sea y lo tengas.

[quote]Ahora si te preocupa que se pueda modificar la información, yo que tu mejor usaría encriptación, o proveería al documento de una especie de "firma digital" (no sé, talvez un checksum al menos para los datos importantes). [/quote]
¿Como vuy a encriptarlo? entonces no lo leería nadie. Hago un reporte para darle la información a alguien. La encriptación no vale. Un html es fácilmente manipulable como lo es un txt osea que yo no renuncio a usarlos, pero quiero algún otro sistema para cuando quiero un informe que no sea fácilmente manipulable. Ese es el papel de pdf que además de hacer mas dificl su manipulación permite integrarlo con una clave pública para garantizar su autenticidad.

Yo estoy harto de los muchos problemas que me dan los distintos sistemas de reporte y quiero hacerme un componente que resuelva eso para siempre y por eso ese componente tendrá todos los formatos que se me ocurran.

[quote]que tal si mejor te creas un documento Latex[/quote]
No conozco latex y además para ese viaje no necesito esas alforjas. Ya hay herramientas de terceras partes que me hacen pdfs y demás. Yo quiero huir de eso y tener un control total sobre mi informe. En ese sentido latex es un formato tan válido como cualquier otro salvo el caso que para convertirlo a pdf necesito ina herramienta ajena a gambas. Por eso he escogido csv. Porque es un formato muy simplón que no le ocasiona problemas a nadie y a partir de eso se podrá generar un reporte completo.

No voy a crear un nuevo lenguaje de marcas. Voy a utilizar csv.

Y luego haré una rutina que a partir de un vsv construya un pdf.
Una rutina que a partir de un csv construya un xls
Una rutina que a partir de un csv construya un txt
...
etc.

Y luego todas esas rutinas agrupadas en un solo componente.

Y se acabó el problema de los dichosos reportes.


-----------------------------------
razaAztk
Viernes, 11 Febrero 2011, 05:27

Re: A Vueltas Con Los Reportes
-----------------------------------
@ Soplo:

Ten en cuenta que no soy programador y en tanto me es dificil captar vuestras ideas....
Cómo no había entendido tus requerimientos y tus soluciones (y creo sigo sin comprender al 100%), di en mi anterior mensaje puntos sueltos (y desvarios) que en realidad no tienen ningún aporte. Por lo que no me queda más que permanecer de observador ante tus avances, y también esperar que tengas éxito. ;)

@ Shordi:

Latex es un lenguaje para la creación de documentos profesionales, muy utilizado en el mundo de los reportes cientificos. Pero mejor leete el articulo de la wiki, je http://es.wikipedia.org/wiki/LaTeX

Saludos!


-----------------------------------
soplo
Viernes, 11 Febrero 2011, 06:07

Re: A Vueltas Con Los Reportes
-----------------------------------
No hombre, di lo que quieras. Tus observaciones son bienvenidas. En mi opinión con latex no tendría mas de lo que tengo con cualquier otro formato.

Lo que yo persigo es la creación de un método que me permita generar reportes profesionales de cualquier tipo con la máxima sencillez y para eso esta reflexión de como debe funcionar ese componente a fin de garantizar el poder llegar a cualquier formato.

Cuando lo tenga hecho podrás meterle una query, elegir el formato en el que quieres tu reporte y tenerlo. Podrás crear un csv de cualquier otra manera, pasarlo al componente y convertirlo a cualquier otro formato. Esa es la idea.


