Imprimir objetos de negocio
Para imprimir tenemos varias alternativas, así que como introducción voy a comentarlas todas:
- Impresión matricial (o para ticket): consiste en usar la API de Windows para enviar líneas de texto directamente a la impresora. En .NET debe haber alguna clase en la jerarquía para conseguir esto, así que quien se anime, a buscarlas.
- Impresión matricial según plantilla XML (también válida para ticket): es un refinamiento de la anterior, en el XML definimos qué poner en cada línea (qué campos, qué etiquetas, con qué longitud...) y una clase propia se encargaría de ir procesando el XML e ir generando las líneas concretas con datos reales procedentes de un objeto de negocio, de un XML, etc.
- Impresión de calidad en HTML. Posiblemente usando XSLT sobre un XML, todas tecnologías conocidas.
- Impresión usando Word. Muy útil para documentos de tamaño fijo (como contratos).
- Impresión usando Excel. Muy útil para formularios prediseñados como una orden de trabajo. Ofrece una paginación muy difícil, para mostrar cabeceras y pies en todas las páginas del documento.
- Impresión mediante sistema de informes (como Crystal Reports). Este es el más potente, ya que incluye la posibilidad de agrupaciones y fórmulas en el propio informe, cosa que ninguno de los anteriores incluye, y una paginación muy sencilla por secciones. Pero tradicionalmente ha estado diseñado para conexión directa a la base de datos. Como no queremos que sea así, las nuevas versiones incluyen la posibilidad de conectarse a objetos de negocio, tal como explica el enlace de este post, y como explica también el Walkthroughs de Crystal para VS2005, a partir de la página 354 (a un nivel muy básico, con ejemplo de cómo crear los objetos de negocio, cómo diseñar el informe y cómo pasar después los datos reales).
La alternativa a Crystal es ActiveReports.NET 2.0 SP2, que permite algo similar a esto: enlazar un informe a cualquier colección de objetos que implemente IList. Tenemos que valorar qué funcionalidad ofrece el Crystal Reports que viene con VS2005, si nos es suficiente o necesitamos más, y si necesitamos más, si está mejor en Crystal o en ActiveReports.
Otra cuestión a considerar es el editor de informes para el usuario. Ambos lo incluyen (aunque no creo que venga en la edición de Crystal de VS2005), así que habrá que probar si son viables, fáciles de usar y demás.
Y por último, respuesta a eventos del informe: capturar cuando el usuario haga clic (o doble clic) en un dato del informe, para mostrarle el origen de datos real (por ejemplo, abrir el albarán, o la ficha de la pieza) o la lista de elementos que sumados producen ese valor (esto puede ser complejo, primero vamos a centrarnos en lo del evento y más adelante veremos cómo justificar un total en un informe de la forma más genérica posible).

3 Comments:
No has pensado la utilización de informes del Access o del SQL. Tiene varias ventajas, van integrados en la base de datos, por lo que no son necesarias más librerías ni programas externos para la impresión. Además los datos los cogen directamente desde la base de datos, por lo que te despreocupas de tener que estar rellenando el informe y pasándole la colección de datos. Por el contrario, la desventaja (sólo en un principio ya que no los he estudiado en profundidad), son informes independientes, por lo que no se le pueden pasar parámetros especiales en la llamada.
Bueno, no recuerdo porqué cuando escribí esto no hablé de SSRS: SQL Server Reporting Services. Es uno de los sistemas que cada vez me convencen más, está muy bien integrado con Visual Studio y permite incluir controles adicionales (como para códigos de barras: http://www.componentsource.com/products/516571/16932/index-es.html). Lo único es que -creo que- los informes deben ir en la base de datos, dificultando un poco la actualización de los clientes, pero es algo que debemos probar mejor.
La impresión de listados también es interesante, en VB6 lo hacíamos directamente usando el Janus GridEX pero en .net no hay un automatismo para hacerlo, así que aquí va un artículo con código para imprimir un listado mostrado en un DataGridView: http://www.codeproject.com/csharp/datagridviewprinter.asp, creo que usando Crystal. Tiene la ventaja de que se imprime de forma genérica, es decir, no hay que tener el Crystal preparado sino que se compone dinámicamente.
Publicar un comentario
<< Home