Reportes En HTML


Ir a la página 1, 2, 3  Siguiente

Objetivo: Reportes En HTML
Aquí presento una clase que sirva para volcar el contenido de un recordset en un archivo HTML.

Tiene algunas deficiencias fácilmente subsanables porque trato de hacer código comprensible mas que completo.

Entre las deficiencias mencionadas indico que cada rutina recibe un string con el nombre de un fichero donde se vuelcan los datos. Sería mejor abrir el fichero en la primera rutina y cerrarlo en la última. Las rutinas por tanto en vez de recibir un string y tener que volver a abrir y luego cerrar el archivo simplemente recibirían el puntero y continuarían escribiendo en él lo que les tocara.

Otra deficiencia es que no se contempla la posibilidad de alinear a la derecha o al centro los campos en cada columna de linforme. Esto es fácil de hacer pero para ello debería pasar como argumento un array con los campos que se quieren y la alineación que se desea y he preferido obviarlo a cambio de una mejor comprensión del código.

Otra deficiencia es que no se contempla que en el informe se desee un ancho de columna distinto de la longitud del campo en la tabla. Para solucionarlo habría que hacer lo mismo que ocn la alineación. Es decir pasar un array donde se indique la longitud de los campos en el informe para definir el ancho de columna.

Por último no he incluído la posibilidad de incluir campos resumen.

Cuando haya optimizado este código es posible que acabe programando un componente con ello.

Rutinas en la clase
Las rutinas son las siguientes:

Cabecera ---> función privada de la clase que recibe los argumentos variables que se quieran incluir en el encabezado del HTML.
Pie ----> función privada de la clase que recibe los argumentos variables que se quieran incluir en el pie del código HTML
Cuerpo ---> función privada que recibe un recordset y devuelve un archivo temporal con código HTML en el que se encuentran tabulados los datos de la tabla
InformeHtml ----> función pública que genera un informe HTML a partir de un recordset. Utiliza las funciones anteriores para la generación del código.

-----------------------------------------------------------
La función Cabecera
Parámetros de entrada
Titulo ---> Tïtulo que debe tener el informe en la cabecera
Vertical ----> Si el informe será vertical o apaisado. Si es vertical será TRUE y si es apaisado FALSE.
Parámetros de salida
Devuelve de salida un string con la ubicación del archivo que ha creado
Private Function Cabecera(Titulo as string, Vertical as boolean) as string
DIM x AS Integer, Fichero as string, F as File
DIM linea[22] AS String
Linea[0] = "<!DOCTYPE HTML PUBLIC ' -//W3C//DTD HTML 4.01 //EN' 'http://www.w3.org/TR/html4/strict.dtd'> "
Linea[1] = "<html><head>"
Linea[2] = "<meta http-equiv = 'Content-Type' content='text/html; charset=iso-8859-1 >"
Linea[3] = "<meta name='description' content= 'Información corporativa de aplicación '> "
Linea[4] = "<meta name= 'keywords ' content =' factura, albaran, pedido, orden, proveedor, almacén, trabajador, cliente, horario, turno, incidencia, proyecto' >"
Linea[5] = "<title> Aplicación </title >"
Linea[6] = "<LINK rel ='style sheet' type =' text/css' href= 'http://localhost/Themes/default/style.css?fin11' >"
Linea[6] = " &nbsp;"
Linea[7] = "</head> "
Linea[8] = "<body>"

IF vertical THEN '-------> decidir si el informe será vertical o apaisado
linea[8] & = "<div style ='width: 100% '> "
ELSE
linea[8] & = "<div style =' width: 300% '> "
ENDIF

linea[9] = "<table width='100%' cellpadding =' 0' cellspacing =' 0' border=' 0' >"
Linea[10] = "<t r><td width =' 15 0px; '><img.src= 'http://localhost/imagen/logo.gif Alt=''></td> "
Linea[11] = "<td width= '10 %' >&nbsp; </ td >"< td>
Linea[13] = " <table border =' 2' width= '100 %' ><tr><td>"
Linea[14] = " <table width ='100%' cellpadding = '2 ' cellspacing =' 2' border =' 0' >"
Linea[15] = " <tr><td><h2> " & Left(ti tulo, 45 ) & " </h2></td></t r> "
Li nea[16] = " <tr><td>&nbsp;</td></tr>"
Linea[17] = " <tr><td align='center'>Fecha de Impresi&oacute; n: " & Day(Now) & "/" & Month(Now ) & "/" & Year(Now) & " " & Hour(Now) & ": " & Minute(Now) & "</td> </tr>"
Linea[18] = " </table> "
Linea[19] = " </table></td></tr>"
Linea[20] = " </table>"
Linea[21] = "<br>"

' Obtener nuevo nombre para el fichero temporal
Fichero=temp()
'Crear el fichero
F=open fichero for create

FOR x =0 TO 21
PRINT #F, Linea [x ]
NEXT
close F
return Fichero
END


----------------------------------------------------------------------
La función Pie

' Parámetros de entrada Fichero -----> nombre del fichero donde se grabará.

PRIVATE SUB Pie(Fichero as string)
DIM Linea AS String, F as file
Linea = "</div></body></html> "

'Imprimir el pie
F=open fichero for write
print #F, Linea
close F
END


-------------------------------------------------------------------------------------
La función Cuerpo
Recoge el recordset y vuelca los datos en una tabla html que agrega al informe.
Parámetros de entrada:
Query ----> recordset con los datos a volcar
Fichero ---> Fichero donde escribir

PRIVATE SUB Cuerpo( Query as result, Fichero as string )
DIM Linea AS String, Dim Campo as resultfield
Dim F as file

'Abrir el fichero donde escribir
F=open Fichero for write
PRINT #F , "<table width ='100%' cellpadding= '0' cellspacing ='0' border ='0'>"
PRINT #F ,"<tr><td Align='center' width ='90%'>"<td>
print #F,"<table width ='100%' cellpadding= '0' cellspacing ='0' border ='0'>"

'Escribir cabecera de campos
print #F,"<tr>"
for each Campo in Query
print #F, "<td align='center' width='" & Campo.length & "'">Campo.name</td>
next

'Escribir campos
do while Query.Available
for earch Campo in Query
Linea &= "<td>"|" & Query.fields(Campo.name) & "|</td>"
next
print #F,linea
next

print #F,</tr>
print #F,"</table>
print #F,"</td></tr></table>

'cerrar el fichero
close #1

end


-----------------------------------------------------------
La función InformeHTML que genera el informe
Parámetros
entrada
Titulo ----> El título que aparecerá en el encabezado del informe
Query ----> Un recordset que contiene los datos a imprimir
Vertical ----> TRUE si el informe se quiere vertical. FALSE si el informe se quiere apaisado.
Salida
Fichero ---> el nombre del fichero temporal ubicado en /tmp donde quedó el informe generado.

Public Function InformeHtml(Titulo as string, Query as result, Vertical as boolean) as string
Dim ArchivoTmp as string

ArchivoTmp=Cabecera(Titulo,Vertical) '---> En Archivotmp queda la cabecera del informe
Cuerpo(Query,ArchivoTmp) '---> Se imprime en el informe el contenido del recordset
Pie(ArchivoTmp) '---> se imprime el pie del informe

Return ArchivoTmp ----> Devuelve el nombre del archivo que contiene el informe en formato HTML
end

última edición por soplo el Viernes, 15 Enero 2010, 00:52; editado 5 veces
Perfil MP  
Objetivo: Re: Reportes En HTML
Aquí hago un añadido al código anterior en el que se crea un informe y se envía por email a un destinatario

Los datos básicos de transmisión (smtp, usuario, clave, host, puerto smtp, etc) se obtienen de un supuesto archivo de configuración

Public sub EnviarEmail(Destino as string,Asunto as string,TextoEmail as string,Adjunto as string)
Dim Smtp as SmtpClient, Adjunto as string

Smtp=new smtpclient

Smtp.to=Destino
Smtp.from=Setings[Email/EmailOrigen,"admin@dominio.com"]
Smtp.Subject=Asunto
Smtp.host=settings[Email/Host,"localhost"]
Smtp.user=settings[Email/User,"Usuario"]
Smtp.password=settings[Email/Password,"123456"]
Smtp.port=Settings[Email/Port,"25"]
Smtp.add(TextoEmail,Settings[Email/Mime,"text/plain",Adjunto]

end


El Adjunto sería el archivo devolvió la rutina InformeHtml en el código anterior.
De esta forma podemos enviar un informe html de un recordset llamando únicamente a la rutina InformeHtml para generarlo y a la rutina EnviarEmail para enviarlo.

Perfil MP  
Objetivo: Re: Reportes En HTML
Tengo hecho algo parecido, pero en lugar de implicar directamente el código html en el código gambas, utilizo una plantilla (template) que permite la edición del listado de manera independiente a la de la consulta de la base de datos.
No sé si es publicable aquí, que es parte de un proyecto mucho mayor, pero si interesa tal vez pueda extractar algo...

Perfil MP  
Objetivo: Re: Reportes En HTML
Bueno, no expongas todo el código si eso te da trabajo. Expon la idea para que los demás podamos ver como aplicarlo y con eso es suficiente.

Gracias

Perfil MP  
Objetivo: Re: Reportes En HTML
Efectivamente el código fuente no está presentable, el pobre... (ya sabéis hay dos tipos de programadores, los que nunca comentan su código y los que no se acuerdan de cómo se hace...). Pero os adjunto un enlace a un .pdf con las pantallas de la aplicación que se encargan de configurar e imprimir un listado vía plantilla .html Si os interesa... pues no me importaría adecentar el código y subirlo después. Eso sí... sin prisas por favor, como decía el de la Voll-Damm

impresion_gambas.pdf

Perfil MP  
Objetivo: Re: Reportes En HTML
Agradecido shordi, que ya veo que te ha costado.

Voy a echarle un vistazo a ver

Perfil MP  
Objetivo: Re: Reportes En HTML
shordi,
esto es una gran idea, pero no una idea cualquiera, es un pedazo de idea, haber quienes el guapo de poner en marcha y hablar con el principal para que lo coloque en gambas.

Perfil MP  
Objetivo: Re: Reportes En HTML
Joer, anima ver que lo que uno trajina en su solitaria cueva pueda ser útil a otros... ya mismo me encargo de hacer una versión tipo "utilidad" que os sirva de ejemplo y a la vez sea utilizable.

Perfil MP  
Objetivo: Re: Reportes En HTML
Muy interesante shordi.

Si necesitas ayuda dilo. De hecho a mi me parece que si hiciéramos de este proyecto algo traducible a diversas lenguas sería una magnífica herramienta para desarrolladores de todo el mundo, solo que no tengo ni idea de como se hace eso de traducir strings aunque se que gambas tiene una capacidad muy poderosa para ello.


Perfil MP  
Objetivo: Re: Reportes En HTML
Hola me he descargado el enlace de shordi, perdona pero soy nuevo en gambas y no se como implementas los tags y Loop en gambas para enlazar con la plantilla, si pudieras publicar un ejemplo mas de uno te lo agradeceríamos.

Muy versátil y muy buena idea.

Un saludo a todos, espero que el foro funcione.

Perfil MP  
Ir a la página 1, 2, 3  Siguiente

Página 1 de 3


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.0916s (PHP: 10% SQL: 90%)
Consultas SQL: 20 - Debug off - GZIP Activado