https://foro.gambas-es.org/viewtopic.php?f=1&t=1379&p=8031#p8031
-----------------------------------
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.


