https://foro.gambas-es.org/viewtopic.php?f=1&t=48 ----------------------------------- soplo Viernes, 18 Septiembre 2009, 18: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] ----------------------------------- soplo Viernes, 18 Septiembre 2009, 18:42 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 [code linenumbers=false]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[/code] 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. ----------------------------------- shordi Martes, 22 Septiembre 2009, 20:26 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... ----------------------------------- soplo Martes, 22 Septiembre 2009, 20:30 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 :lol: ----------------------------------- shordi Miercoles, 23 Septiembre 2009, 01:31 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 [url=http://www.menguante.es/archivos/impresion_gambas.pdf]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 [url=http://www.menguante.es/archivos/impresion_gambas.pdf]impresion_gambas.pdf ----------------------------------- soplo Miercoles, 23 Septiembre 2009, 14:29 Re: Reportes En HTML ----------------------------------- Agradecido shordi, que ya veo que te ha costado. Voy a echarle un vistazo a ver :mryellow: :mryellow: ----------------------------------- david Miercoles, 23 Septiembre 2009, 15:21 Re: Reportes En HTML ----------------------------------- [b]shordi[/b], 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. ----------------------------------- shordi Miercoles, 23 Septiembre 2009, 17:50 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. ----------------------------------- soplo Viernes, 25 Septiembre 2009, 18:42 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. :mryellow: ----------------------------------- angelnu Lunes, 28 Septiembre 2009, 14:34 Re: Reportes En HTML ----------------------------------- Hola me he descargado el enlace de [b]shordi[/b], 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. ----------------------------------- shordi Lunes, 28 Septiembre 2009, 23:00 Re: Reportes En HTML ----------------------------------- Momento, plis, que estoy en ello... ----------------------------------- shordi Miercoles, 30 Septiembre 2009, 00:50 Re: Reportes En HTML ----------------------------------- Ya casi. Estoy añadiendo el control del aspecto de los listados vía hoja de estilos CSS. En realidad ha sido una labor de comentar, reorganizar y, sobre todo, cortar y cortar cosas que no venían a cuento. En breve os subo el proyecto... pero aviso que no tengo ni idea de cómo se lleva un proyecto compartido. ¿Quien controla las aportaciones?¿Quién decide cuándo publicar versión nueva?¿cómo se organizan los colaboradores?,. etc.etc. ¿Alguien tiene experiencia en ese campo? ----------------------------------- jguardon Miercoles, 30 Septiembre 2009, 11:19 Re: Reportes En HTML ----------------------------------- [quote user="shordi" post="267"]... pero aviso que no tengo ni idea de cómo se lleva un proyecto compartido. ¿Quien controla las aportaciones?¿Quién decide cuándo publicar versión nueva?¿cómo se organizan los colaboradores?,. etc.etc. ¿Alguien tiene experiencia en ese campo?[/quote] Hola La verdad que esa cuestión merece [url=http://foro.gambas-es.org/viewtopic.php?f=1&t=87]un hilo aparte, porque hay varias formas de hacerlo. Instalar tu propio gestor colaborativo de código fuente o usar uno público como Code Google o SourceForge. Hay muchos más, algunos de pago. En todos los casos se utiliza [url=http://es.wikipedia.org/wiki/Subversion]SVN o [url=http://es.wikipedia.org/wiki/Git]GIT para subidas/bajadas/commits de versiones, etc, porque se trata de eso precisamente, del control de versiones. Mi granito de arena... Saludos ----------------------------------- shordi Jueves, 01 Octobre 2009, 00:26 Re: Reportes En HTML ----------------------------------- Al final lo he terminado... o, mejor dicho, no puedo dedicarle más tiempo ahora mismo al tema. [url=http://foro.gambas-es.org/viewtopic.php?f=5&t=83]Lo tenéis en el foro Aplicaciones/Fragmantos de código en el hilo "Impresión HTML". Es una utilidad que te permite conectarte a una base de datos MySQL, seleccionar tablas o introducir tu propia sentencia SQL de selección y fabricar después un listado que se genera en un fichero .html en tu escritorio. Con ese fichero puedes hacer lo que quieras luego vía navegador: Pasarlo a papel, convertirlo en .pdf, etc. etc. Si el listado que se te genera no te satisface, puedes guardarlo en una tabla y modificarlo a tu gusto. Puedes hacer listados o formularios, todo depende de dónde coloques los tags de plantilla que el programa contempla (o los que tú quieras añadir), y de la consulta SQL que utilices como fuente de datos. Si aún así no te vale, el programa te permite exportar los datos seleccionados y listados a un fichero .CSV y a partir de éste puedes importarlo en tu generador de listados favorito. Hay un fichero (~home/.config/gambas/plantillaStandar.html) que contiene la cabecera .html del listado a imprimir y los estilos .CSS que he implementado por defecto. Cambiando un parámetro en el fichero de configuración de entorno puedes imprimir listados en estilo "cebra" o tabla tradicional. Si modificas el .CSS puedes utilizar cualquier estilo que quieras. Si a alguno le interesa y lo usa... me gustaría saberlo, para notar que el curro que me he dado no ha sido para nada. Si alguien lo modifica o mejora, que me pase una copia, plis. ----------------------------------- shordi Jueves, 01 Octobre 2009, 21:43 Re: Reportes En HTML ----------------------------------- He añadido a [url=http://foro.gambas-es.org/viewtopic.php?f=5&t=83]Impresión HTML la impresión de Etiquetas. Las explicaciones al respecto van en un archivo LEEME ETIQUETAS incluído en el paquete. Disfrutadlo. ----------------------------------- Miguel Jueves, 14 Enero 2010, 22:02 Re: Reportes En HTML ----------------------------------- Buenas como están, una pregunta al hacer un reporte con HTML no me salen ni los acentos ni la "ñ". Puse la instrucción " " y me salen por acentos y ñ unos caracteres raros. Gracias ----------------------------------- soplo Jueves, 14 Enero 2010, 23:40 Re: Reportes En HTML ----------------------------------- Creo que te faltan algunas comitas. Te las he puesto en rojo. UTF-8 va seguido. no hay espacio en medio. "" ----------------------------------- jguardon Viernes, 15 Enero 2010, 00:02 Re: Reportes En HTML ----------------------------------- Pues no. Las comillas sobran. Estaba bien como lo puso Miguel. Esta es la etiqueta de ésta misma web: [size=18][font=Courier New][/font][/size] Pero me he dado cuenta de una cosa que no sé si tendrá importancia. Al escribir la cadena en gambas, habría que escapar las comillas dobles para poder escribirlo correctamente de esta forma: [code linenumbers=false syntax=gambas]cadena = ""[/code] :-) ----------------------------------- soplo Viernes, 15 Enero 2010, 00:49 Re: Reportes En HTML ----------------------------------- ah pues si. Es cierto. Corrijo eso en el código expuesto porque está mal. Aparte de eso html acepta tanto comillas como comitas. Probablemente es mas cómodo y evita problemas usar comita en vez de comillas y así no hay que andar poniendo los slashes [size=18] [/size] :mryellow: Por cierto, he visto que en ese código se han metido algunos espacios indebidos por ahí. Por ejemplo he corregido un que ponía lo cual haría que no terminara la celda de la tabla. He corregido varios que no se porque están allí aunque creo que se debe al método que utilice para importarlos de un pdf que jbsan había salvado de un post de mi antiguo foro. Si al pastear eso da algún problema no os desanimeis porque son pequeñas tonterías (aunque he corregido los que he visto) ----------------------------------- Miguel Viernes, 15 Enero 2010, 05:27 Re: Reportes En HTML ----------------------------------- Es : Asi imprime la ñ y los acentos. Gracias. Saludos ----------------------------------- soplo Viernes, 15 Enero 2010, 17:20 Re: Reportes En HTML ----------------------------------- Ambos casos son válidos porque ambos son utilizan el ascii extendido español. Es mejor utilizar UTF-8 por ser unicode y por tanto con mayor proyección a futuro, pero eso a muchos años vista. Lo que pasa es que UTF-8 es capaz de mostrar el alfabeto latino o el hebreo o el que sea de manera que allí donde se utiliza es buena idea tener bien puestas las locales para evitar problemas tontos porque asigna el código ascii extendido según ellas (o al menos eso creo). :mryellow: