Posts Tagged ‘Reporting Services’

SQL Server 2008 R2 Reporting Services in ASP.Net 4.0 Webseite einbinden

13. Juni 2012

Die letzten Stunden habe ich damit verbracht, auf einem SQL Server 2008 R2 in den Reporting Services einen Bericht zu erstellen,
der auf eine Datenbank zugreift,
der eine Shared DataSource dazu verwendet,
der ein Shared DataSet verwendet,
der per Parameter über das DataSet gefilter wird,
der alle fünf Minuten als SnapShot historisiert wird,
und von dem die letzten 10 SnapShots gehalten werden.

Diesen Report wollte ich in einer ASP.Net Seite auf zwei Wegen bekommen:
1.) Anzeige des Reports im ReportViewer Control
2.) Report als PDF-Datei zum Download

1.) Anzeige des Reports im ReportViewer Control

Diese Variante war relativ einfach – Control auf die Seite ziehen und die Properties für den Report und den ReportServer angeben:

<ServerReport
 ReportPath="/ReportProject1/Report2"
 ReportServerUrl="http://meinServer/reportserver" />

Der ReportViewer zeigt so konfiguriert immer die Daten des aktuellsten SnapShot an.

2.) Report als PDF-Datei zum Download

Zunächst braucht man den NameSpace Microsoft.Reporting.WebForms bzw. in der web.config den folgenden Verweis (Version 10 = SSRS 2008 R2 ):

<add assembly=“Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A“/>

Im Code sieht das dann etwa so aus:

Dim bytes As Byte()
'// Instanz des ReportViewer-Steuerelements
Using rv = New ReportViewer
'// Festlegen des Verarbeitungsmodus des ReportViewer-Steuerelements.
 rv.ProcessingMode = ProcessingMode.Remote
'// Berichtsserver festlegen
 rv.ServerReport.ReportServerUrl = New Uri("http://meinServer/reportserver")
'// Festlegen des Pfades zum Bericht
 rv.ServerReport.ReportPath = "/ReportProject1/Report1"
'// Parameter aus der am Bericht hinterlegten Parameterliste auswählen
 Dim pars = rv.ServerReport.GetParameters
 Dim par0 = pars(0)
 Dim p = New ReportParameter(name:=par0.Name, value:=par0.ValidValues(0).Value) 'rv.ServerReport.ReportParameter()
 rv.ServerReport.SetParameters(p)
'// Verarbeitet den Bericht und rendert ihn im angegebenen Format und speichert diesen in ein byteArray
 bytes = rv.ServerReport.Render(format:="PDF", deviceInfo:=Nothing, _
 mimeType:=mimeType, encoding:=encoding, fileNameExtension:=extension, _
 streams:=streamIDs, warnings:=warnings)
End Using
'// Schreibt das Resultat in ein PDF
 Using fs = IO.File.Create(IO.Path.Combine(Server.MapPath("~/."), "result.pdf"), bytes.Length)
 fs.Write(bytes, 0, bytes.Length)
 fs.Close()
 End Using

Damit man auf Daten aus einem bestimmten SnapShot zugreifen kann, habe ich den SSRS WebService / SOAP Client verwendet:

Zunächst also eine ServiceReference setzen auf :

http://meinServer:80/ReportServer/ReportService2010.asmx?wsdl

Dann die paar folgenden Zeilen nach der Parameterübergabe und vor dem Rendern des Berichts im obigen Code eingefügt:

    Dim rs2010 As New ReportingService2010.ReportingService2010SoapClient
    Dim tuh2010 As New ReportingService2010.TrustedUserHeader
    Dim itemHist2010() As ReportingService2010.ItemHistorySnapshot = Nothing
    Dim sih2010 As ReportingService2010.ServerInfoHeader = rs2010.ListItemHistory( _
        TrustedUserHeader:=tuh2010 _
        , ItemPath:=rv.ServerReport.ReportPath _
        , ItemHistory:=itemHist2010 _
        )
    '// einfach mal den 5. Snapshot herausgepickt
    Dim histId = (From o In itemHist2010 Order By o.CreationDate Select o.HistoryID)(5)

    rv.ServerReport.HistoryId = histId

Dann gab’s ein paar Fehlerchen bzgl. irgendwelcher Anmeldewurschteleien. Diese konnte ich durch folgende Maßnahmen vermeinden:

In der web.config:

<!--<security mode="None">-->
<security mode="TransportCredentialOnly">
  <!--<transport clientCredentialType="None" proxyCredentialType="None" realm="" />-->
  <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />

Und im Code wie folgt entsprechende Benutzerdaten angeben:

    Dim cred As New System.Net.NetworkCredential(userName:="ich", password:="wirdnichtverraten", domain:="meinreich")
    rs2010.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation
    rs2010.ClientCredentials.Windows.ClientCredential = cred

Damit funktionierte dann alles wie gewünscht.

Ganz brauchbar dabei fand ich die folgenden Links:

SSRS Part 5 Demo2 – Configuring a Report Snapshot

Report Server Web Service

Developer’s Guide: Tutorials (Reporting Services)

Creating the Web Service Proxy

Viewing Report History Snapshot …