Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Reportes En HTML

Reportes En HTML
Artículo
Responder citando    Descargar mensaje  
Mensaje 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 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Viernes, 18 Septiembre 2009, 18:07 ]
 


Reportes En HTML
Comentarios
Responder citando    Descargar mensaje  
Mensaje 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.



 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Viernes, 18 Septiembre 2009, 18:42 ]
Responder citando    Descargar mensaje  
Mensaje 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...



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Martes, 22 Septiembre 2009, 20:26 ]
Responder citando    Descargar mensaje  
Mensaje 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
 



 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Martes, 22 Septiembre 2009, 20:30 ]
Responder citando    Descargar mensaje  
Mensaje 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



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Miercoles, 23 Septiembre 2009, 01:31 ]
Responder citando    Descargar mensaje  
Mensaje Re: Reportes En HTML 
 
Agradecido shordi, que ya veo que te ha costado.

Voy a echarle un vistazo a ver
   



 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Miercoles, 23 Septiembre 2009, 14:29 ]
Responder citando    Descargar mensaje  
Mensaje 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.



 
david - Ver perfil del usuario Enviar mensaje privado  
david [ Miercoles, 23 Septiembre 2009, 15:21 ]
Responder citando    Descargar mensaje  
Mensaje 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.



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Miercoles, 23 Septiembre 2009, 17:50 ]
Responder citando    Descargar mensaje  
Mensaje 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.

 



 
soplo - Ver perfil del usuario Enviar mensaje privado  
soplo [ Viernes, 25 Septiembre 2009, 18:42 ]
Responder citando    Descargar mensaje  
Mensaje 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.



 
angelnu - Ver perfil del usuario Enviar mensaje privado  
angelnu [ Lunes, 28 Septiembre 2009, 14:34 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 3
Ir a la página 1, 2, 3  Siguiente
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron