Het downloaden van klingeltöne, Download von klingeltöne, Het downloaden van klingeltöne, Descargar tonos, Téléchargez des sonneries, scarica suonerie, Beltonen downloaden, Nedlasting av ringetoner, Download ringtones

MonoReporter – Reportes en Mono

Ya escribí un post sobre este tema. Desde ahí hasta hace un mes aproximadamente, MonoReporter quedó olvidado, ya que en realidad no lo necesitaba con tanta urgencia… pero ahora sí. Es lo que sigue por hacer en Zaspe#: la generación de reportes.

Mi idea era hacer algo que no sólo me sirva a mí, sino que lo pueda usar otra persona también. Cuando le comenté la idea a Nacho, sobre un lenguaje basado en XML para describir el reporte, me propuso leer un SVG, hecho con Inkscape por ejemplo… así me ahorraría un futuro diseñador de reportes. Eso es lo que he hecho.

MonoReporter entonces lee de un SVG hecho con Inkscape (lo aclaro porque sobre este software hice las pruebas), y lo transforma a instrucciones para dibujar con Cairo y GtkPrint (el nuevo sistema de impresión de Gtk+). Es posible, por ejemplo, exportar directamente a PDF, o mostrar el diálogo de impresión, tanto en GNU/Linux como Windows (previa instalación de los runtimes de gtk-sharp que se pueden encontrar en la web de zaspe#). A esto lo realiza en forma nativa.


Para leer el XML (SVG), simplemente uso las clases en el namespace System.Xml. No utilizo ninguna librería externa. He probado una, SvgNet, un proyecto poco activo (último release en el 2003). Y me he dado cuenta de que tenía que adaptarlo mucho… así que opté por crear mis propias clases de lectura del SVG, que terminó siendo un trabajo bastante sencillo en realidad.

Debido a algunas limitaciones que tengo en Windows (como los bindings de Cairo sólo disponibles para el profile 1.0), el diseño en general de las clases no es el mejor, o por lo menos el que me hubiese gustado.

Este es un ejemplo de uso de MonoReporter con C# (en realidad, se puede utilizar con cualquier lenguaje de .NET):

using System.Data;
using MonoReporter;

...

Report report = new Report("PruebaMonoReporter", "test.svg");
report.Data["titulo"] = "Listado de personas";

DataTable personsTable = new DataTable();

DataColumn[] columns = new DataColumn[4];
columns[0] = new DataColumn("nombre");
columns[1] = new DataColumn("apellido");
columns[2] = new DataColumn("dni");
columns[3] = new DataColumn("direccion");
personsTable.Columns.AddRange(columns);

DataRow d1 = personsTable.NewRow();
d1["nombre"] = "Milton";
d1["apellido"] = "Pividori";
d1["dni"] = "99999999";
d1["direccion"] = "dirección";
personsTable.Rows.Add(d1);

d1 = personsTable.NewRow();
d1["nombre"] = "Pepe";
d1["apellido"] = "Biondi";
d1["dni"] = "11111111";
d1["direccion"] = "alguna dirección";
personsTable.Rows.Add(d1);

d1 = personsTable.NewRow();
d1["nombre"] = "Juan";
d1["apellido"] = "Sanchez";
d1["dni"] = "33333333";
d1["direccion"] = "otra dirección";
personsTable.Rows.Add(d1);

report.DataTables["personas"] = personsTable;

report.Run(myWindow);

DataTable es una clase del namespace System.Data.

Report es una clase de MonoReporter, la principal. En las primeras lineas se crea un nuevo reporte con un título dado, y un archivo SVG de donde leer el diseño del reporte. La propiedad Data devuelve un Hashtable, en el que podemos setear el texto que queramos al elemento SVG indicado por la clave. En este caso, se está diciendo que al momento de generar el reporte, al elemento con id (lo cambiamos desde Inkscape) “titulo” le asigne el valor “Listado de personas”.

Una vez creado el DataTable, le indicamos la fuente de datos para la “tabla” llamada “personas”. Una “tabla” es un concepto inventado, que se forma creando varios elementos de texto en Inkscape, tantos como columnas haya, y dándole a cada uno el nombre de la columna (que definimos en el DataTable). Luego se los agrupa, y a esa agrupación se le coloca un nombre. El nombre en este caso es “personas”.

De esta forma cuando MonoReporter encuentra un layer con sólo nodos “text”, sabe que se trata de una tabla. Este es el archivo PDF final que genera el código de arriba.

Quedan muchas (muchísimas) cosas por hacer, a tal punto de que ni siquiera es usable: por el momento se pueden generar reportes de una sola página :) Algunas cosas que faltan por hacer:

  • Soporte para reportes largos (de más de una página).
  • Soporte para más elementos gráficos de SVG (por ahora reconoce rectángulos, líneas y texto).
  • Mayor nivel de personalización: por ejemplo, el espacio entre filas no se puede cambiar.
  • Soporte para la inclusión de imágenes.
  • Etc etc etc…

Algunas limitaciones:

  • A los textos sólo se los puede redimensionar aumentando su tamaño de fuente, o sea, sin utilizar las flechas.
  • Raramente, algunos colores son bien leidos, pero otros no, como el verde.
  • Y muchas más…

El código fuente se encuentra aquí, en el mismo repositorio que Zaspe#. Está bajo la GPLv3.

Si alguien tiene algún comentario, alguna mejora o sugerencia para encarar esto mejor… bienvenido sea!

Google
 

  • Jorge Londoño

    Cordial Saludo,

    Muy interesante el proyecto, lo he bajado e incorporado a un Software de Punto de Venta que estoy desarrollando con Monodevelop 0.16, aunque el proyecto compila bien, no muestra el cuadro de diálogo para imprimir o ver la presentación preliminar, revisando el código he encontrado que en la clase Report, método DrawPage, en la sección donde pinta las tablas, en esta línea:

    if (!this.dataTables.ContainsKey(aTable.Id))
    continue;

    Al parecer no encuentra el layer “Personas”, sin embargo en el archivo svg se encuentra definido.

    Me podrias ayudar??

    Estoy interesado en ayudar a desarrollar esta herramienta, teniendo en cuenta que en Mono no existe un reporteador.

  • http://www.miltonpividori.com.ar miltondp

    Qué tal Jorge? Me alegra mucho que esto le sirva a alguien. Contesto a tu primer pregunta: para hacer que se muestre el diálogo de impresión (o que directamente imprima o muestre el preview), al crear el objeto Report, escribis:

    report.Action = Gtk.PrintOperationAction.PrintDialog;
    

    Fijate que en la enumeración Gtk.PrintOperationAction tenés varias opciones más, como imprimir directamente por ejemplo.

    Estuve probando la versión trunk de MonoReporter, y no funciona. Esto es así porque la última vez que estuve trabajando en MonoReporter comencé una serie de reformas para poder setear, por ejemplo, el Report Header, Page Header, Page Footer, Report Footer y Detail. Estas secciones son comunes en algunos generadores de reportes que he probado. En fin, estas reformas no terminaron, y no van a terminar hasta, por lo menos, fines de Diciembre. Perdón, pero estoy muy ocupado en esta época del año.

    Lo que podés hacer es bajarte revisiones anteriores a la HEAD en Subversion. Algunas funcionarán como vos querés. Aunque tené en cuenta que esto está muy verde aún.

    Cuando vuelva al trabajo, me voy a contactar con vos para ver si seguís interesado. A mi me interesaría muchísimo que se incorpore gente para ayudar en el desarrollo. Solo quiero que tengas en cuenta dos cosas: MonoReporter es GPL (no LGPL). O sea que si linkeas tu programa con él, tu programa debe ser GPL también. Lo que tengo pensado hacer, si esto llega a buen puerto, es ofrecer una segunda licencia paga, aunque no investigué mucho sobre el tema.

  • Andres

    Que dificil que es encontrar un sistema de reportes para mono…

    Tengo que hacer un reporte bastante simple, aunque con varias secciones, los datos se extraen todos de objetos, no de una base de datos. Crees que Monoreporter está lo suficientemente maduro para que lo utilize? me recomendás usar el trunk o algún branch en especial?

    Nunca trabaje en un sistema open source, pero si pensás continuar desarrollándolo en equipo me gustaría participar.
    Saludos.

  • http://www.miltonpividori.com.ar miltondp

    La verdad que me encantaría tener más tiempo para poder dedicarle a este proyecto. Pero últimamente no lo he tenido.

    Hace poco un compañero me pasó un ejemplo que utilizaba iTextSharp, y la verdad que parece que está bueno. Si bien no está centrado en generar reportes (o sea, no tiene las facilidades), se pueden realizar algunos con él. En la lista de Mono-Hispano he leído mails de personas que testifican esto. Esta es una razón también por la que he dejado un poco de lado este trabajo, pero sin olvidarlo.

    De todas formas, MonoReporter ha avanzado un poco más de lo que se comenta en este post. Ahora es posible, por ejemplo, generar reportes de más de una página (o sea, se pueden colocar muchos datos). Pero no lo he probado lo suficiente como para decirte si no presentará errores importantes. Si el problema es realmente simple, donde tengas que listar cosas por ejemplo, creo que podrías utilizarlo.

    Lo que te recomiendo es que te bajes la versión desde aquí. Simplemente abrilo con MonoDevelop y ejecutá la solución. Se ejecutará el proyecto “Test”. Se abrirá una ventana muy simple con un botón “Imprimir”. Al presionarlo, inserta unos datos desde el código fuente (no lee bases de datos, como decís vos), y leyendo e interpretando el archivo “test.svg”, genera el reporte con los datos pasados.

    Examiná el archivo svg con Inkscape, y fijate las propiedades de los objetos, más la información que hay en este post para entender cómo funciona.

    Lo que podemos hacer, si te interesa, es mantenernos en contacto por correo electrónico. Si te parece que MonoReporter puede funcionar para vos, o si hay que agregar cambios en los que estás dispuesto a trabajar (yo podría ayudar, pero depende, estoy muy ocupado estos días) te puedo explicar un poco cómo está diseñado, y cómo funciona con SVG.

    Disculpame, pero por ahora es lo que te puedo ofrecer.

    Saludos!