Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Übersicht über alle Berichte ... als SSRS Bericht

17. Februar 2011 , Geschrieben von Olaf Helper Veröffentlicht in #Reporting

Auf Websites sieht man häufiger Übersichtsseiten (Index) mit Links zu allen vorhandenen Seiten. Das ist sehr praktisch, man kann auf der Seite selbst nach Begriffen suchen und schnell auf Seiten navigieren, ohne sich lange durch diverse Menüs hangeln zu müssen.

 

Für eine umfangreiche Report Sammlung im Microsoft SQL Server Reporting Services wäre so was auch nicht verkehrt, also gehen wir das mal an.

 

Alle hierfür benötigten Daten sind in der ReportServer Datenbank in der Tabelle dbo.Catalog vorhanden.
Das Feld „
Type“ kennzeichnet die Objektart, hierbei sind 1 = Folder und 2 = Report für die Übersicht von Interesse, 4 = verlinkte Reports lassen wir mal aus. Über die „ItemId“ und „ParentId“ wird die hierarchische Struktur abgebildet. Hier bietet sich einem zur Abfrage natürlich eine rekursive CTE (Common Table Expression) an. Es wird zunächst das Root Element selektiert (ParentID IS NULL) und dann alle Children über einen JOIN mittels ItemId = ParentID auf CTE selbst.

 In der Übersicht soll dann auch eine Jump-to Action möglich sein, um zum Report springen zu können. Dafür kann man die Daten aus dem Feld „Path“ verwendet werden, es enthält die relative Pfadangabe des Elementes. Bei der Selektion wird der „Path“ bereits so modifiziert, um die Daten für einen HyperLink im Report verwenden zu können. Es muss dabei nur ein paar Kleinigkeiten beachtet werden, so müssen (gemäß Url Regel) die Slash’s durch %2f und Leerzeichen durch ein Pluszeichen ersetzt werden. Zudem müssen Berichte über „/Reports.aspx“ und Ordner entsprechend über „/Folder.aspx“ aufgerufen werden.  
 Schlussendlich, um es halbwegs gemäß der Hierarchie sortieren zu können, muss der Pfad des übergeordneten Elementes als primäre Sortierung verwendet werden; dank CTE kann das aber problemlos mitselektiert werden. 
   
 So sieht nun die Selektion der benötigten Daten als CTE aus: 
   
 -- Selektion aller vorhandenen Folder und Reports 
 -- über eine rekursive CTE  
   
 DECLARE @url varchar(100); 
 -- Url vom ReportManager; muss entsprechend angepasst werden 
 SET @url = 'http://MyServer/Reports_MyInstanz/Pages/§§§ReportOrFolder§§§.aspx?ItemPath='; 
   
 ;WITH RPT AS 
 ( -- Root Pfad 
  SELECT RT.ItemID 
  ,RT.Path 
  ,RT.ModifiedDate 
  ,0 AS [Level] 
  ,CAST(N'Stamm' AS nvarchar(425)) AS ReportName 
  ,CAST(N'Stamm' AS nvarchar(425)) AS ParentFolder 
  ,RT.Path AS ParentPath 
  ,REPLACE(REPLACE(RT.Path, '/', '%2f'),' ', '+') AS ReportLink 
   ,RT.Type AS ObjType 
  FROM dbo.Catalog AS RT 
  WHERE RT.ParentID IS NULL 
  AND RT.Type = 1 -- Nur den Root Folder 
  UNION ALL 
  SELECT CHILD.ItemID 
  ,CHILD.Path 
  ,CHILD.ModifiedDate 
  ,RPT.[Level] + 1 AS [Level] 
  ,CHILD.Name AS ReportName 
  ,CASE WHEN CHILD.Type = 1 THEN CHILD.Name ELSE RPT.ReportName END AS ParentFolder 
  ,CASE WHEN CHILD.Type = 1 THEN CHILD.Path ELSE RPT.ParentPath END AS ParentPath 
  ,REPLACE(REPLACE(CHILD.Path, '/', '%2f'),' ', '+') AS ReportLink 
   ,CHILD.Type AS ObjType  
  FROM dbo.Catalog AS CHILD 
  INNER JOIN  
  RPT ON CHILD.ParentID = RPT.ItemID 
  WHERE CHILD.Type = 2 -- Alle Reports und nur nicht-leere Folders 
  OR (CHILD.Type = 1 
  AND EXISTS (SELECT 1 FROM dbo.Catalog AS SUB 
  WHERE SUB.Type IN (1, 2) 
  AND SUB.ParentID = CHILD.ItemID)) 
 ) 
 SELECT RPT.Path 
  ,RPT.ReportName 
  ,CASE WHEN RPT.ObjType = 1 THEN REPLACE(@url, '§§§ReportOrFolder§§§', 'Folder') 
  ELSE REPLACE(@url, '§§§ReportOrFolder§§§', 'Report') 
  END 
  + RPT.ReportLink 
  + CASE WHEN RPT.ObjType = 1 THEN '&ViewMode=List' ELSE '' END 
  AS Link 
  ,RPT.ObjType 
  ,RPT.ModifiedDate 
  ,RPT.Level 
  ,RPT.ParentFolder 
  ,RPT.ParentPath 
 FROM RPT 
 ORDER BY RPT.ParentPath 
  ,RPT.Path 
  ,RPT.ReportName; 

 

 

Der Report für die Übersicht habe ich zunächst recht einfach als eine Tabelle mit 2 Zeilen, eine für Ordner und eine für Berichte, gestaltet. Die Zeilen werden dann je nach „ObjType“ sichtbar geschaltet.

Eine optische „Hierarchie-Tiefe“ der Elemente wird über die Padding - Left Eigenschaft der Textbox erreicht; hier wird über einen Ausdruck der Wert des CTE Feldes „Levels“ gesetzt und so das Feld nach rechts verrückt.

Als „Action“ wird dann „Gehe zu Url“ verwendet, das an die Daten der Selektion-Feldes „Link“ gebunden wird.

 

ReportLinkAction.jpg

 

Und das Ergebnis sieht dann so wie unten aus. Zugegeben, man kann das optisch noch attraktiver gestalten, da kann jeder seiner Kreativität freien Lauf lassen. Wenn die Reportnamen nicht zu lang und die Strukturebene nicht zu tief ist, könnte man den Bericht auch in 2 Spalten gliedern, um Platz zu sparen.

 

ReportOverview 

 

Der Report kann als „ReportOverview.rdl“ Datei fürs BIDS 2008 bzw. Report Builder 2.0 von meinem SkyDrive herunter geladen werden:

Diesen Post teilen

Repost 0

Kommentiere diesen Post