Język programowania VisualBasic.NET jest przez wielu postrzegany jako język dla początkujących. Ale to oczywiście nie jest prawdą. Przyzwyczailiśmy się, że Visual Basic.NET jest najczęściej używany w aplikacjach desktopowych. Jednak język ten pozwala na znacznie więcej - na przykład na tworzenie aplikacji internetowych w oparciu o framework ASP.NET.
ASP.NET obsługuje wzorzec programistyczny MVC (Model-View-Controller), który znacznie upraszcza skalowanie i testowanie aplikacji w porównaniu ze zwykłym ASP.NET. Wzorzec ten ma różne odmiany, ale główna idea pozostaje taka sama - rozgraniczenie obszarów odpowiedzialności między logiką biznesową a prezentacją. Wszystkie nowoczesne frameworki internetowe są zbudowane na tej strukturze. Dzięki temu, używając VisualBasic.NET, można łatwo tworzyć aplikacje webowe typu frontend w Angular lub dowolnym innym frameworku.
Wróćmy jednak do tematu tego artykułu - generowania raportów. Programy generujące raporty mocno wkroczyły w nasze życie na początku lat "2000", a teraz tylko nieliczni mają odwagę stworzyć raport od "zera". Powinien to być naprawdę unikalny raport, który wykracza poza możliwości jakiegokolwiek generatora. Brzmi to ironicznie, ale takie przypadki się zdarzają. Specyficzna logika generowania raportu może naprawdę stać się przeszkodą w korzystaniu z generatorów raportów. Być może jednak po prostu nie znasz wszystkich ich możliwości. Na przykład, niewiele osób zna i wykorzystuje możliwość tworzenia szablonu raportu z kodu aplikacji użytkownika w generatorze raportów FastReport.NET. Ten sposób tworzenia raportu daje Ci unikalną możliwość kontrolowania struktury szablonu i procesu generowania bezpośrednio w kodzie programu. To właśnie tam możesz zaimplementować swoją "inteligentną" logikę.
Tak, ten sposób generowania raportów wymaga dobrej znajomości produktu, a mianowicie struktury raportu, obiektów i ich właściwości. Dlatego programista powinien posiadać odpowiednie kwalifikacje.
Skończmy z tymi wywodami i zacznijmy tworzyć program demonstracyjny, który generuje raport z kodu aplikacji internetowej ASP.NET MVC w języku VisualBasic.
Przede wszystkim należy utworzyć odpowiedni projekt.
VisualStudio starannie stworzy dla Ciebie gotową aplikację demonstracyjną z gotową strukturą. Wszystko, co musisz zrobić, to podłączyć biblioteki FastRport.NET i dodać swój kod do tworzenia raportu.
Dodajmy biblioteki do referencji (References) projektu: FastReport.dll, FastReport.Web.dll. Biblioteki te znajdują się w katalogu głównym zainstalowanego programu FastReport.NET.
Do zaprogramowania głównej logiki użyjmy gotowego kontrolera - HomeController:
‘Linking of necessary libraries Imports System.Drawing Imports FastReport Imports FastReport.Data Imports FastReport.Utils Imports FastReport.Web ‘altering the Index Function Index() As ActionResult Dim AppFolder As String Dim report As New WebReport() 'create instance of class Report Dim ds As New DataSet() 'create dataset object AppFolder = "C:\Users\FR\source\repos\WebAppVB\WebAppVB\App_Data" 'load data ds.ReadXml(AppFolder + "\nwind.xml") report.RegisterData(ds) report.Report.GetDataSource("Products").Enabled = True 'create report page Dim page As New ReportPage() report.Report.Pages.Add(page) 'add created page to report page collection page.CreateUniqueName() 'with generated name 'create group header band Dim group As New GroupHeaderBand() page.Bands.Add(group) 'add the band to band collection group.CreateUniqueName() 'with generated name group.Height = Units.Centimeters * 1 group.Condition = "[Products.ProductName].Substring(0,1)" 'set the group condition group.SortOrder = FastReport.SortOrder.Ascending 'and set sort order 'create text object Dim groupTxt As New TextObject() groupTxt.Parent = group 'set the object on whitch the text will be shown groupTxt.CreateUniqueName() groupTxt.Bounds = New RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 1) 'set the text object bounds groupTxt.Text = "[[Products.ProductName].Substring(0,1)]" 'set the text value groupTxt.Font = New Font("Arial", 14, FontStyle.Bold) 'set the font style groupTxt.VertAlign = VertAlign.Center ' set the text align groupTxt.Fill = New LinearGradientFill(Color.LightGoldenrodYellow, Color.Gold, 90, 0.5F, 1) 'set the text object fill 'create data band Dim data As New DataBand() group.Data = data 'set the group data data.CreateUniqueName() data.DataSource = report.Report.GetDataSource("Products") 'set data band source data.Height = Units.Centimeters * 0.5F 'set data band height 'create one more text object Dim productText As New TextObject() productText.Parent = data 'add the text object to data band productText.CreateUniqueName() productText.Bounds = New RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 0.5F) 'set the text object bounds productText.Text = "[Products.ProductName]" 'set the text value 'create group footer band group.GroupFooter = New GroupFooterBand() group.GroupFooter.CreateUniqueName() group.GroupFooter.Height = Units.Centimeters * 1 'set the group footer height 'create total object Dim groupTotal As New Total() groupTotal.Name = "TotalRows" 'set total object name groupTotal.TotalType = TotalType.Count 'set total type groupTotal.Evaluator = data 'set the band for which the total will be calculated groupTotal.PrintOn = group.GroupFooter 'set the total place report.Report.Dictionary.Totals.Add(groupTotal) 'add the total object to totals collection 'create text object Dim totalText As New TextObject() totalText.Parent = group.GroupFooter 'set the object on whitch the text will be shown totalText.CreateUniqueName() totalText.Bounds = New RectangleF(0, 0, Units.Centimeters * 10, Units.Centimeters * 0.5F) 'set the text object bounds totalText.Text = "Rows: [TotalRows]" 'set the text value totalText.HorzAlign = HorzAlign.Right 'set the text align totalText.Border.Lines = BorderLines.Top 'set the border lines type ViewBag.WebReport = report Return View() End Function
Z komentarzy do kodu jasno wynika, że tworzymy obiekty raportów, a także budujemy wyraźną hierarchię i zależności. Na przykład wszystkie wstęgi muszą być dodane do strony, a pola tekstowe są umieszczane na wstęgach lub wewnątrz innych obiektów, takich jak na przykład tabele czy macierze. Ważne jest nie tylko zbudowanie zależności, ale także prawidłowe ustawienie właściwości obiektów - ich rozmiaru, położenia względem obiektu nadrzędnego itd. Wszystkie te szczegóły składają się na raport. Dlatego ta metoda wymaga dobrej znajomości produktu FastReport.NET.
Każda metoda sieciowa w naszej aplikacji demonstracyjnej ma już swój widok. W folderze Views znajdź plik Index.vbhtml. Wklej poniższy wiersz kodu w dogodnym miejscu:
@ViewBag.WebReport.GetHtml()
Tutaj realizujemy metodę konwersji raportu internetowego do formatu HTML. Oczywiście oprócz języka html będzie on zawierał style, skrypty, obrazki - ogólnie wszystko, co jest potrzebne do wyświetlenia raportu na stronie WWW.
W folderze Views znajduje się plik konfiguracyjny dla aplikacji frontendowej Web.config. Dodajmy do niego nowe przestrzenie nazw:
<namespaces> <add namespace="FastReport" /> <add namespace="FastReport.Web" /> </namespaces>
W tym samym folderze znajduje się kolejny plik, który należy edytować - Views/Home/Shared/_Layout.vbhtml. Dodajmy do niego użycie skryptów i stylów z bibliotek FastReport:
W korzeniu projektu znajduje się kolejny plik Web.config. Należy go dodać po sekcji </system.web>:
<system.webServer> <handlers> <add name="FastReportHandler" path="FastReport.Export.axd" verb="*" type="FastReport.Web.Handlers.WebExport"/> </handlers> </system.webServer>
Nasza aplikacja jest gotowa do uruchomienia. Upewnijmy się, że działa.
To wszystko: stworzyliśmy pełnowartościowy raport bezpośrednio w kodzie programu. Wygląda on jak raport utworzony przez specjalnego projektanta wizualnego. Ale oczywiście jest to trudniejsze do wykonania w kodzie. Dlatego zalecamy stosowanie tej metody tylko w szczególnych przypadkach, gdy nie jest możliwe zaimplementowanie złożonej logiki wewnątrz raportu.