Der lokale ReportViewer und die Verwendung von Parametern
Mit Visual Studio 2005 sowie Web Developer Express Studio wird das ReportViewer-Control mitgeliefert. Dieses Steuerelement kann in .NET-Anwendungen verwendet werden und unterstützt die Darstellung von Berichten, die in Report Definition Language definiert werden. Außerdem kann der ReportViewer Daten filtern, sortieren, gruppieren oder aggregieren. Die Datenpräsentation kann in Listen, Tabellen, Diagrammen und Matrizen erfolgen. Sogar das Conditional Formatting ist möglich. Besonders hilfreich ist die Möglichkeit, Berichte in verschiedene Formate wie PDF oder Excel zu exportieren.
Ein in eine ASP.NET-Anwendung integrierter Bericht könnte so aussehen:
Die Daten für diese Berichte können von jeder Datenquelle kommen. Die Anwendung in der der ReportViewer eingebettet wird ist für die Bereitstellung der Daten zuständig. Daten müssen dem ReportViewer nur in der Form von ADO.NET DataTables oder einer Sammlung von Business Objekten übergeben werden.
Hat man auf seinem Server neben dem IIS, ASP.NET auch den ReportServer (eine Erweiterung des SQL-Server 2005) installiert, kann man Remote-Berichte in dieses Steuerelement einbetten, die dann vom ReportServer bereitgestellt und generiert werden. Als Zugabe gibt es einen Wizard, der die Erstellung von Berichten unterstützt und weitere Export-Formate wie TIFF, CSV usw.
Als Alternative bietet sich das Einbetten lokaler Berichte an. Dazu übergibt man dem in der eigenen Anwendung eingebetteten ReportViewer einen lokal abgelegten Bericht. Lokale Berichte tragen die Dateiendung RDLC (Report Definition Language Client-Side).
Besonders hilfreich ist die Verwendung von Parametern, um Daten in einem Bericht eingrenzen zu können. Bei der Verwendung von Remote-Berichten kann man Parameter direkt bei der Erstellung des Berichts definieren. Beim Aufruf wird dann eine Parameter-Maske eingeblendet, die eine Veränderung der Parameter ermöglicht.
Bei der Verwendung lokaler Berichte gibt es diese Parameter-Maske leider nicht. Auch wenn man direkt im Bericht Parameter definiert hat, wird diese Maske nicht eingeblendet. Es macht also keinen Sinn bei lokalen Berichten Parameter zu definieren. Vielmehr ist es hier dann die Aufgabe der Anwendung, die die Daten bereitstellt, eine Filtermöglichkeit bereitzustellen.
In folgende Schritten kann man einen lokalen Bericht in einem ASP.NET-Projekt hinzufügen:
- Ein Datasets im Verzeichnis App_Code erstellen.
Im Dataset einen TableAdapter hinzufügen, der die gewünschten Daten bereitstellt. In der Abfrage können auch Parameter definiert werden. - Einen Report erstellen im Verzeichnis App-Data.
In Visual Studio kann der Report per Drag and Drop zusammengeklickt werden, wobei das vorher erstellte Dataset in der Toolbox angezeigt wird. - In einer ASP.NET-Seite den ReportViewer hinzufügen und den erstellten Bericht übergeben. Danach muss noch die ObjectDataSource konfiguriert werden, die erstellt wird sobald ein Bericht im ReportViewer ausgewählt wird oder Rebind gewählt wird.
- Falls Parameter im Bericht verwendet werden sollen, muss das gewünschte Steuerelement (z.B. eine Textbox oder eine ComboBox) zu der ASP.NET-Seite hinzugefügt werden. In dem Page_Load-Ereignis wird dann folgender Code definiert:
[VB]
‘ set default value for the data source
ObjectDataSource1.SelectParameters.Item(“month”).DefaultValue = cboMonth.SelectedValue
‘ show / hide report viewer
Dim dv As New Data.DataView
dv = ObjectDataSource1.Select()
If dv.Table.Rows.Count > 0 Then
ReportViewer1.Visible = True
Else
ReportViewer1.Visible = False
End If
‘ Live-Filter
If chkFilter.Checked = True Then
ObjectDataSource1.FilterExpression = String.Format(“(month = ‘{0}’)”, cboYear.SelectedValue)
Else
ObjectDataSource1.FilterExpression = “”
End If
ReportViewer1.LocalReport.Refresh()
[/VB]
Bei der Verwendung von Parametern bei der Datenabfrage im Dataset wird in der ObjectDataSource (die Datenquelle für den ReportViewer) ein Default-Parameter definiert, der dann an die Select-Anweisung der Abfrage im Dataset übergeben wird.
Möchte man von einem Steuerelement Daten übergeben, kann auch auf diesem Weg erfolgen.
Mit Hilfe des DataView-Elements wird überprüft, ob die ObjectDataSource überhaupt Daten zurückgibt, wobei dann je nach Ergebnis der ReportViewer angezeigt wird oder nicht.
Im Beispielcode wurde eine ComboBox für die Auswahl des Monats (cboMonth) verwendet.
Möchte man sozusagen live Daten Filtern, kann dies über die FilterExpression in der ObjectDataSource erfolgen. Dazu werden zunächst alle Daten im Dataset geladen und später in der ObjectDataSource vor der Ãœbergabe an den ReportViewer gefiltert. bei dieser Methode müssen keine Parameter in der Select-Anweisung definiert werden. Allerdings wird die Abfragedauer höher sein, da immer alle Daten aus der Datenbank geholt werden.
Im Beispielcode wurde eine ComboBox für die Auswahl des Jahrs (cboYear) verwendet.