Dynamische Spalten mit Reporting Services

3. September 2010

Einen Report – basierend auf einer MDX-Abfrage – mit dynamischen Spalten anzulegen ist relativ gängig. Doch auch einen Report, dessen DataSet die Daten per SQL aus einer Datenbank liest, ist in einigen Schritte möglich. Hier wird am Beispiel von Reporting Services 2005 erklärt, wie man dynamische Spalten in einem Bericht implementieren kann. Dieses Vorgehen gilt analog für Reporting Services 2008 (R2).

Zuerst wird eine Stored Procedure angelegt, die ein dynamisches Result-Set zurückliefert:

   1: create procedure [dbo].[sp_get_dynamic_columns]

   2: (

   3:     @columns int

   4: )

   5: as

   6: begin

   7:   -- Abhängig vom Parameter @columns wird eine andere Anzahl Spalten zurückgeliefert.

   8:   if @columns = 3

   9:     select '3 Wertespalten' as Bezeichnung, 1 as Wert1, 2 as Wert2, 3 as Wert3;  

  10:   if @columns = 2

  11:     select '2 Wertespalten' as Bezeichnung, 1 as Wert1, 2 as Wert2;

  12:   if @columns < 2

  13:     select '1 Wertespalte' as Bezeichnung, 1 as Wert1;

  14: end

Hinweis: Anhand des ersten Statements, welches ein ResultSet zurückliefert(hier das Select nach ”if @columns = 3”), ermittelt sich Reporting Services die Metadaten für das DataSet. Hier ist darauf zu achten, dass das erste Statement die maximale Anzahl Spalten zurückliefert. Alternativ kann man das Statement auch mit dynamischem SQL erzeugen.

Im nächsten Schritt wird im Data-Bereich des zu erstellenden Reports ein DataSet angelegt. Hier wird als Command type „Stored Procedure“ ausgewählt und die erstellte Stored Procedure angeben.

clip_image002

Dann die Abfrage ausführen. Wichtig hierbei ist, die Abfrage so auszuführen, dass sie die maximale Anzahl Spalten zurückliefert die im Report möglich sein sollen. In diesem Beispiel sind es 3 Spalten.

clip_image004

Als Ergebnis werden die 3 dynamischen Spalten zurückgeliefert.

clip_image006

Hinweis: Beim aktualisieren des DataSets werden die Metadaten des Result-Set wieder ausgelesen und die DataSet Felder im Report entsprechend aktualisiert. Das ist wichtig, wenn Spalten hinzukommen sollen oder entfernt werden.

Im Layout-Bereich des Reports wird eine Tabelle angelegt, die alle Spalten des DataSets enthält. Für die dynamischen Spalten wird noch eine Expression für die Eigenschaft Visibility Hidden definiert, da die Spalten ausgeblendet werden sollen, wenn diese keinen Wert besitzen:

   1: =isnothing(sum(Fields!Wert2.Value))

Ein Preview auf den Report zeigt, dass die Spalten nun dynamisch ein-/ausgeblendet werden, je nach Auswahl des Parameter-Wert.

clip_image008

clip_image010