https://www.gambas-es.org/viewtopic.php?f=1&t=48&p=121#p121 ----------------------------------- soplo Viernes, 18 Septiembre 2009, 19:07 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. [color=darkgreen][size=14]Rutinas en la clase[/size][/color] Las rutinas son las siguientes: [color=darkred]Cabecera[/color] ---> función privada de la clase que recibe los argumentos variables que se quieran incluir en el encabezado del HTML. [color=darkred]Pie[/color] ----> función privada de la clase que recibe los argumentos variables que se quieran incluir en el pie del código HTML [color=darkred]Cuerpo[/color] ---> 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 [color=darkred]InformeHtml[/color] ----> 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 [code linenumbers=false] 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] = " " Linea[1] = "" Linea[2] = " " Linea[4] = "" Linea[5] = " Aplicación " Linea[6] = "" Linea[6] = "  " Linea[7] = " " Linea[8] = "" IF vertical THEN '-------> decidir si el informe será vertical o apaisado linea[8] & = "
" ELSE linea[8] & = "
" ENDIF linea[9] = "" Linea[10] = " " Linea[11] = "" Linea[20] = "
  "< td> Linea[13] = "
" Linea[14] = " " Linea[15] = " " Li nea[16] = " " Linea[17] = " " Linea[18] = "

" & Left(ti tulo, 45 ) & "

 
Fecha de Impresió n: " & Day(Now) & "/" & Month(Now ) & "/" & Year(Now) & " " & Hour(Now) & ": " & Minute(Now) & "
" Linea[19] = "
" Linea[21] = "
" ' 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[/code] ---------------------------------------------------------------------- La función Pie ' Parámetros de entrada Fichero -----> nombre del fichero donde se grabará. [code linenumbers=false]PRIVATE SUB Pie(Fichero as string) DIM Linea AS String, F as file Linea = "
" 'Imprimir el pie F=open fichero for write print #F, Linea close F END[/code] ------------------------------------------------------------------------------------- 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 [code linenumbers=false]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 , "" PRINT #F ,"
" print #F,"" 'Escribir cabecera de campos print #F,"" for each Campo in Query print #F, " next 'Escribir campos do while Query.Available for earch Campo in Query Linea &= "" next print #F,linea next print #F, print #F,"
Campo.name"|" & Query.fields(Campo.name) & "|
print #F,"
'cerrar el fichero close #1 end[/code] ----------------------------------------------------------- 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. [code linenumbers=false]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[/code]