Myślę, że każdy deweloper WinForms zauważył, że standardowe kontrolki formularza wyglądają zbyt jednolite i że byłoby lepiej wprowadzić ciekawszy projekt do aplikacji. A szczególnie w takich przypadkach, gdy potrzebujemy specjalnego projektu. O tych celów Microsoft stworzył specjalną bibliotekę – WPF (Windows Presentation Foundation).
Jeśli tworzysz oprogramowania księgowo – sprzedażowo, to na pewno jest tam możliwość wygenerowania podstawowych dokumentów księgowych, takich jak faktury i pokwitowania. Dokumenty te powinny odzwierciedlać dane z bazy danych. Najlepszym rozwiązaniem byłoby użycie generatora raportów do utworzenia szablonu dokumentu i wypełnienia go danymi.
Możesz użyć bibliotek generatora raportów aby zintegrować raporty z aplikacją WPF. Dzięki temu dla każdego zdarzenia można wygenerować i wyświetlić raport, a także wyeksportować go i wydrukować.
Przed utworzeniem szablonu w projektancie raportu należy utworzyć szablon w projektancie raportów.
W tym artykule opiszemy przykład tworzenia dokumentu z zastosowaniem generatora raportów FastReport.NET.
W dokumencie sprzedaży zostaną wyświetlone informacje o sprzedającym, kupującym i sprzedanym towarze. Niektóre kraje stosują zasadę wskazywania stawki podatku, kwotę obliczonego należnego podatku, a także ostateczną kwotę po opodatkowaniu.
Dlatego w naszym przykładzie rozważymy taki dokument sprzedaży.
Ponieważ dane zostaną pobrane z bazy danych, najpierw musimy utworzyć połączenie ze źródłem danych. W tym przykładzie użyjemy bazy danych nwind.xml demo z dystrybucji FastReport.NET. Będziemy potrzebować następujących tabel: Zamówienia, Szczegóły zamówienia, Klient, Pracownik. Naszym zadaniem jest stworzenie następującego szablonu:
Aby wyświetlić dane z każdej tabeli dla określonego zamówienia, wszystkie one muszą być połączone. W tym celu FastReport.NET zapewnia mechanizm łączenia tabel za pomocą kluczy. Tabela Zamówienia jest połączona z tabelami Klienci i Pracownicy, tabela Szczegóły zamówienia jest połączona z zamówieniami i produktami.
Oznacza to, że dla określonego rekordu zamówienia odpowiednie dane zostaną wybrane z tych tabel według klucza. W ten sposób możemy uzyskać nazwę kupującego z tabeli Klienci dla konkretnego rekordu zamówień:
Pasek Data ma szczegółowy zespół z paskami nagłówka i stopki. Dla wybranego paska Danych zdefiniowane jest źródło szczegółów zamówienia. Ta tabela zawiera również linki:
Zgodnie z oczekiwaniami są one połączone z tabelą Zamówienia, a także z tabelą Produkt, z której można uzyskać nazwy produktów.
Teraz, gdy już wiemy, że główne informacje są pobierane z tabeli Zamówienia, a szczegółowe informacje o produkcie pochodzą z tabeli Szczegóły zamówienia, możemy wziąć pod uwagę sumy.
Pierwsza to Suma wierszy — mnożenie ilości towarów przez cenę jest obliczane przez zwykłe pomnożenie pól: [Szczegóły zamówienia.Cena jednostkowa] * [Szczegóły zamówienia.Ilość]]. Suma ta jest obliczana dla każdego towaru.
Następnie należy podsumować wszystkie sumy w tej kolumnie i wyświetlić je w polu Suma podrzędna. Aby to zrobić, utwórz nową sumę w oknie Dane:
Nadajmy jej nazwę Sumy Częściowej i ustawmy właściwości w nowym oknie:
Jak widać, do wykonania obliczenia użyliśmy funkcji suma. W przypadku wyrażenia danych użyliśmy kombinacji mnożenia tych samych pól, co w polu Suma wierszy. W ten sposób otrzymujemy sumę wszystkich sum dla wszystkich produktów.
Pole Stawka podatku wskazuje procent podstawy opodatkowania, która musi zostać zapłacona. W naszym przypadku liczba ta wynosi 5%.
W polu Należne podatki należy obliczyć kwotę należną z tytułu podatku. Wzór jest prosty: całkowita * stopa procentowa:
[[Suma częściowa] * 0,05]
I wreszcie, całkowita należna kwota. Składa się z sumy częściowej i podatku:
[[Suma częściowa] + [Suma częściowa] * 0,05]
Spowoduje to zakończenie tworzenia dokumentu sprzdaży. Należy zapisać szablon raportu w aplikacji. Na przykład utwórz App_Data folder i zapisz w nim szablon raportu i bazę danych.xml.
Teraz przejdźmy do aplikacji.
W aplikacji
Aby wyświetlić raport w aplikacji, musimy dodać składnik ScrollViewer do formularza, aby móc przewijać raport. Dodaj inny składnik – ListBox – wewnątrz. Będzie on używany do wyświetlania raportu w formacie Xaml. Dodaj trzy przyciski do formularza aplikacji: wyświetl raport, eksportuj raport do pliku PDF, wydrukuj raport.
Dodaj zdarzenie kliknięcia dla każdego z przycisków. Wyświetl raport:
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) }); } } |
W tym miejscu tworzymy obiekt raportu, wczytaj szablon raportu, który wcześniej utworzyliśmy. Następnie utwórz źródło danych i zarejestruj go w raporcie.
Formularze w aplikacjach WPF są tworzone przy użyciu języka XMAL. W związku z tym raport musi być wyświetlany w tym formacie. Aby to zrobić, wykonaliśmy eksport do XMAL.
Kod przycisku do wyeksportowania raportu do formatu 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); } } |
Zamysł jest taki sam jak w przypadku wyświetlania raportu, ale zapisujemy wynik uzyskany z eksportu w folderze i nie dodajemy go do formularza.
Kod przycisku do wydrukowania raportu:
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"); } } |
Przed wydrukowaniem raportu należy go najpierw wyświetlić za pomocą przycisku. Klikając na niego, wywołasz okno dialogowe drukowania i wydrukujesz zawartość komponentu ListBox.
Teraz uruchom aplikację i kliknij przycisk Pokaż:
Teraz możesz nie tylko wyświetlić utworzony dokument sprzedaży, ale także zapisać go w formacie PDF i wydrukować! Możesz wyeksportować go do innych formatów plików dostępnych w 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.