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] = " "
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 %' > </ 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> </td></tr>"
Linea[17] = " <tr><td align='center'>Fecha de Impresió 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
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] = " "
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 %' > </ 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> </td></tr>"
Linea[17] = " <tr><td align='center'>Fecha de Impresió 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
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
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
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