SQL Server Reporting Services – Mehrere Datasets in einer Tabelle nutzen

16. September 2014

Nutzt man SQL Server Reporting Services für Dashboards, hat man oft die Anforderung mehrere Datasets in einer Steuerelement mit Datenbereich (Liste, Tabelle, Matrix, Diagramm, …) anzuzeigen. In Reporting Services wird aber per Default nur ein Dataset pro Datenbereich unterstützt. Es gibt trotzdem jedoch mehrere Möglichkeiten um Daten aus unterschiedlichen Datasets in einer Tabelle zusammenzufassen

Befinden sich die Datensets in einer Datenquelle, wie z. B. SQL Server, so kann man diese mit SQL Server-Bordmitteln (Unterabfragen, Joins, Stored Procedure) in ein Dataset zusammenführen. Sind die Datenquellen über verschiedene Systeme verteilt, kann man die Daten mit einer Linked-Server-Verknüpfung dennoch miteinander verknüpfen.Doch auch Reporting Services stellen einige Mittel zur Verknüpfung der Daten zur Verfügung.

Subreports

Eine Möglichkeit ist der Einsatz von Subreports bei der Verwendung von Liste, Tabelle oder Matrix. Dafür fügt man in einer Zelle des Steuerelements einen Subreport ein. In diesem Subreport kann man wiederrum alle möglichen Inhalte darstellen z.B. Tabellen, Textboxen usw. Diesen Tabellen kann man dann wiederrum die anderen Datasets als DataSource zuweisen. Der Nachteil dabei ist, dass man sich dann um Parameterübergabe usw. beim Aufruf des Subreports kümmern muss. Um nur bestimmte Informationen aus einem zweiten Dataset dazu zu mischen, viel zu viel Aufwand.

Lookup() 

Möchte man nur einen Wert aus einem anderen Dataset als dem in der Tabelle festgelegten anzeigen, kann man die Lookup Funktion http://msdn.microsoft.com/de-de/library/ee210531.aspx verwenden um Daten aus einem anderen Dataset einzubinden.

In meinem Beispiel werden in folgender Tabelle zwei Datasets benötigt, da das erste Dataset die Stammdaten und Audit-Informationen aus der Datenbank (dsDefault) holt und das zweite Dataset auf einen Analysis Services Cube (dsData) zugreift um die Kennzahlen zu selektieren.

image

Um die beiden Datasets zu verknüpfen wird das erste Dataset ganz normal in der Tabelle als Datasource hinterlegt. Bei den Zellen, die die Kennzahlen beinhalten ist dann folgende Formel hinterlegt:

   1: =Lookup

   2: (

   3:     Fields!CityCode.Value

   4:     ,Fields!City.Value

   5:     ,Fields!Count.Value

   6:     ,"dsData"

   7: )

Hinweis: Bekommt man folgenden Fehler beim Rendern des Reports liegt es daran, dass die beiden Felder nicht den selben Datentypen haben und nicht verglichen werden können.

Warning 44 [rsRuntimeErrorInExpression] The Value expression for the textrun ‘Textbox.Paragraphs[0].TextRuns[0]’ contains an error: Exception of type  'Microsoft.ReportingServices.ReportProcessing.ReportProcessingException_ComparisonError' was thrown.

 

Hier hilft eine Konvertierung der beiden Felder in den selben Datentyp und schon funktioniert es.

   1: =Lookup

   2: (

   3:     CStr(Fields!CityCode.Value)

   4:     ,CStr(Fields!City.Value)

   5:     ,Fields!FactCount.Value

   6:     ,"dsData”

   7: ")

Andere Möglichkeiten sind:

· die Verwendung von Custom Code in einen Bericht (beispiel siehe http://sqlserverbiblog.wordpress.com/2011/09/29/using-custom-code-to-synchronize-different-datasets)

· Data Processing Extension (Beispiel siehe: http://sqlmag.com/database-development/creating-custom-data-processing-extension)