Thursday, 17. february 2011 4 17 /02 /Feb. /2011 17:30

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:

von Olaf Helper - veröffentlicht in: Reporting - Community: Microsoft SQL Server
Kommentar hinzufügen - Kommentare (0)ansehen
Zurück zur Startseite

Über diesen Blog

Kategorien

Kalender

June 2012
M T W T F S S
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
<< < > >>

Syndication (RSS)

  • RSS-Feed der Artikel

Suchen

Blog erstellen

Erstellen Sie einen Blog auf OverBlog - Kontakt - Nutzungsbedingungen - Werbung - Missbrauch melden - Impressum - Artikel mit den meisten Kommentaren