Supongo que a todos los desarrolladores de WinForms se les ocurrió la idea de que los elementos de control de formulario estándar parecen demasiado unitarios y que sería bueno aportar un diseño más interesante a la aplicación. Entonces, especialmente para los casos en los que necesitamos un diseño especial, Microsoft creó una biblioteca especial: WPF (Windows Presentation Foundation).
Si está creando un software de contabilidad de ventas, debe de generar documentos contables primarios, como facturas y recibos. Estos documentos deben reflejar los datos de la base de datos. La mejor solución sería utilizar un generador de informes para crear una plantilla de documento y completarla con datos. Puede utilizar las bibliotecas del generador de informes para integrar informes en una aplicación WPF. Así, para cualquier evento, puede generar y visualizar un informe, así como exportarlo y enviarlo a imprimir.
Tiene que crear una plantilla en el diseñador de informes antes de generar el informe. En este artículo usaremos el generador de informes FastReport .NET.
En el recibo de venta se mostrará información sobre el vendedor, el comprador y los bienes vendidos. Algunos países normalmente indican por separado la tasa impositiva y calculan el impuesto adeudado, así como el monto final después de impuestos.
Por lo tanto, en nuestro ejemplo, consideraremos este tipo de recibo de venta.
Dado que los datos se tomarán de la base de datos, primero debemos crear una conexión con la fuente de datos. En este ejemplo, usaremos la base de datos demo nwind.xml de la distribución FastReport .NET. Necesitaremos estas tablas: Orders, Order Details, Customer, Employee. Nuestra tarea es crear la siguiente plantilla:
Para mostrar datos de cada tabla para un pedido específico, todas deben estar conectados. Para hacerlo, FastReport .NET proporciona un mecanismo para vincular tablas por clave. La tabla Orders está vinculada a las tablas Customers y Employees, la tabla Order Details está vinculada a las de Orders y Products.
Esto significa que para un registro de pedido específico, los datos correspondientes se seleccionarán de estas tablas por indentificador. Por lo tanto, podemos obtener el nombre del comprador de la tabla Customers para un registro de pedidos específico:
La banda de datos tiene una banda detallada con sus bandas de cabeza y pie de página. Para la banda de datos detallada, se especifica la fuente Order Details. Esta tabla también tiene enlaces:
Como probablemente esperaba, está vinculado a la tabla Pedidos, así como a la tabla Producto, de la que puede obtener los nombres de los productos.
Ahora, cuando está claro que la información principal se toma de la tabla Orders y la información detallada del producto proviene de la tabla Order Details, podemos considerar los totales.
El primero es Line Total (multiplicación de la cantidad de mercancías por el precio) se calcula simplemente multiplicando los campos: [[Order Details.UnitPrice] * [Order Details.Quantity]]. Este total se calcula para cada artículo.
A continuación, debe resumir todos los totales en esta columna y mostrarlos en el campo Sub Еotal. Para hacer esto, cree un nuevo total en la ventana Datos:
Démosle el nombre SubTotal y establezcamos las propiedades en la ventana que aparece:
Como puede ver, usamos la función Sum para totalizar. Para la expresión de datos usamos una combinación de multiplicar los mismos campos que en Line Total. Así obtenemos la suma de todos los totales de todos los productos.
El campo Tax Rate indica el porcentaje de la base imponible que debe pagarse en impuestos. En nuestro caso, esta cifra es del 5 %.
Para el campo Tax Due, debe calcular el monto adeudado por impuestos. La fórmula es simple: total*tasa de interés:
[[SubTotal] * 0.05]
Y, finalmente, Total Due. Consiste en la suma de Sub Total e impuesto:
[[SubTotal] + [SubTotal] * 0.05]
Esto completa la creación del recibo de venta. Necesita guardar la plantilla de informe en su aplicación. Por ejemplo, cree la carpeta App_Data y guarde la plantilla de informe y la base de datos nwind.xml en ella.
Ahora pasemos a la aplicación.
En la aplicacion
Para mostrar el informe en la aplicación, debemos agregar el componente ScrollViewer al formulario para poder desplazar el informe. Agregue otro componente, ListBox, dentro. Se utilizará para mostrar el informe en formato XML. Agregue tres botones al formulario de solicitud: mostrar informe, exportar informe a PDF, imprimir informe.
Agregue un evento de clic para cada uno de los botones. Entonces, el informe muestra:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private void Button_Click(object sender, RoutedEventArgs e) { var report = new Report(); report.Load("C:/Users/User/source/repos/WPFInvoice/WPFInvoice/App_Data/invoice.frx"); var data = new DataSet(); data.ReadXml("C:/Users/User/source/repos/WPFInvoice/WPFInvoice/App_Data/nwind.xml"); report.RegisterData(data); report.Prepare(); var export = new XAMLExport(); export.HasMultipleFiles = true; using (var ms = new MemoryStream()) { export.Export(report, ms); lb.Items.Add(new Frame() { Content = XamlReader.Load(ms) }); } } |
Aquí creamos un objeto de informe, cargamos la plantilla de informe que creamos anteriormente en él. A continuación, cree una fuente de datos y regístrela en el informe. Los formularios de las aplicaciones WPF se crean utilizando el lenguaje XMAL. Por lo tanto, el informe debe mostrarse en este formato. Para ello, realizamos la exportación a XMAL.
El código del botón para exportar el informe a PDF:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private void PDFExport_Click(object sender, RoutedEventArgs e) { var report = new Report(); report.Load("C:/Users/User/source/repos/WPFInvoice/WPFInvoice/App_Data/invoice.frx"); var data = new DataSet(); data.ReadXml("C:/Users/User/source/repos/WPFInvoice/WPFInvoice/App_Data/nwind.xml"); report.RegisterData(data); report.Prepare(); var export = new PDFExport(); export.HasMultipleFiles = true; using (var fs = new FileStream("C:/Users/User/source/repos/WPFInvoice/WPFInvoice/App_Data/report.pdf", FileMode.Create)) { export.Export(report, fs); } } |
La idea aquí es la misma que con la visualización del informe, pero guardamos el resultado obtenido de la exportación en una carpeta y no lo agregamos al formulario.
El código del botón para imprimir el informe:
1 2 3 4 5 6 7 8 |
private void Print_Click(object sender, RoutedEventArgs e) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { printDialog.PrintVisual(lb, "Print the report"); } } |
Antes de imprimir el informe, primero debe mostrarlo con el botón. Al hacer clic en él, llamará al cuadro de diálogo de impresión e imprimirá el contenido del componente ListBox.
Ahora ejecute la aplicación y haga clic en el botón Show:
¡Ahora no solo puede ver el recibo creado, sino también guardarlo en formato PDF e imprimirlo! Puede exportarlo a otros formatos de archivo disponibles en FastReport: HTML, BMP, PNG, JPEG, GIF, TIFF, EMF, PDF, XLSX, DOCX, PPTX, ODS, ODT, RTF, Text, XPS, XML, XAML, PS, PPML, LaTeX, Json, Dbf, Csv, XLS (Biff8), SVG, ZPL.