Samstag, Februar 23, 2008

Sql Server Reporting Service Multivalue und die Integration in SharePoint

Am Wochende habe ich mich intensiv mit dem Sql Server Reporting Service beschäftigt, ich muss sagen, dass ich mir mal endlich richtig Zeit genommen habe und auch einige Tricky-Sachen gelöst habe. (Natürlich durch googlen) Letztendlich wollte ich dem Kunden ermöglichen in unserer Datenbank nach Einlieferungsnummern zu suchen, um so simple Fragen „Was ist mit meinen Daten passiert?“ selbst zu lösen. Der erste Schritt war das überfliegen eines Tutorials zu dem Thema. Das Beste was ich kenne, sind diese: Beginning SQL Server 2005 Reporting Services Part 1 - Building and deploying basic reports , Beginning SQL Server 2005 Reporting Services Part 2 , Beginning SQL Server 2005 Reporting Services Part 3 - The Chart Control und Beginning SQL Server Reporting Services Part 4 alle Artikel sind von Steve Joubert . Ich kann jedem diese Artikel nur Empfehlen.

Nun aber zu den eigentlichen Problemstellungen. Ich bin nun nicht gerade der beste zum Schreiben von Sql Statements, einige meiner Kollegen werden noch mit erschrecken zurückdenken. … Immer wenn ich an eine Prozedur in der DB ran wollte, weil es mir zu langsam ging, haben die Kollegen das Priorisiert gemacht, quasi gleich, denn immer nachdem ich an der DB war musste alles aufgeräumt werden … Die Statements gingen recht leicht, hätte ich gar nicht gedacht, ich hatte mir allerdings die Woche auch einige Tricks für die Erstellung und das zusammen setzen von komplexen Statements von einem Kollegen geholt. Für die Reporting Services sind die Datenquellen das wichtigste bei der Realisierung. Gerade bei der Realisierung von Online-Statements sollte man auf schnelle Ausfrührung und möglichst limitierte Daten achten. Gerade bei großen Ergebnismengen ist die Aufbereitung problematisch und zeitintensiv.

Für die Darstellung habe ich anschließend ein Drill Down Report gewählt, der über 4 Ebene/Gruppen geht, so wird die Anzeige kompakt und doch informativ.

Die Anforderung das MultiValue-Feld zu realisieren, war zunächst extrem schwierig umzusetzen. Den besten Tipp habe ich auf dem Blog RDA Corp – BI and Sql Server gefunden. Man benötigt für die Verwendung des Parameters die Prozedur um die Werte zurück zubekommen.

Parameter Expression: Join(Parameters!Param.Value, ",")

Statement:
[tableSynonym].[KeyColumn] IN
(
SELECT [columniID]
FROM [schema].[table] tb, [dbo].[Split](@ItemList, ',') tmp
WHERE patindex('%' + tmp.Item + '%', tb.[KeyColumn]) > 0
)

Prozedur: ( RDA Corp – BI and Sql Server )
CREATE FUNCTION [dbo].[Split]
(
@ItemList NVARCHAR(8000 ),
@delimiter CHAR(1 )
)
RETURNS @IDTable TABLE (Item VARCHAR(200 ))
AS
BEGIN
DECLARE @tempItemList NVARCHAR(8000 )
SET @tempItemList = @ItemList
 
DECLARE @i INT
DECLARE @Item NVARCHAR(8000 )
SET @tempItemList = REPLACE (@tempItemList, @delimiter + ' ', @delimiter )
SET @i = CHARINDEX(@delimiter, @tempItemList )
WHILE (LEN(@tempItemList) > 0 )
BEGIN
IF @i = 0
SET @Item = @tempItemList
ELSE
SET @Item = LEFT(@tempItemList, @i - 1 )
INSERT INTO @IDTable(Item) VALUES(@Item )
IF @i = 0
SET @tempItemList = ''
ELSE
SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i )
SET @i = CHARINDEX(@delimiter, @tempItemList )
END
RETURN
END

Nach dem der Report so richtig gut funktionierte, war es Zeit die Integration in den Sharepoint durchzuführen. Es gibt von MS ein Report Service WebPart für Sharepoint, außerdem hat man die Möglichkeit mit dem .NET FX2 das ReportViewer Webpart zu nutzen. Ich hatte zu erst versucht das fertige WebPart zu nutzen, bin dabei allerdings gescheitert, außerdem habe ich damit nicht die Möglichkeit kleinere Modifikationen durchzuführen. Also einen kleinen Wrapper für erstellt, der Connections-Akzeptiert, Parameter von einer anderen Quelle empfangen kann und über ein Parameter-Mapping verfügt. Man kann im Viewer-Control sehr schön die Ansichten modifizieren, so sind bei uns die Parameter nicht vorhanden, da diese durch ein anderes WebPart geliefert werden. Bisschen Probleme hat mir die Anzeige gemacht, da die Scrollbalken immer störten, leider konnte ich nicht einfach die gesamte Seitenhöhe verwenden, hier kann evtl. ein JavaScript helfen, aber es gibt wichtigeres.

Nach dem auch der Schritt erledigt war, hat ein Kollege sich den Report noch mal vorgenommen und versucht die Abfragen zu optimieren (ohne den Plan zu nutzen). Außerdem wurde das zugehörige DataWarehouse angepasst, um Datenstrukturen bereite optimiert vorzuhalten.

Man muss einfach sagen, dass die Reportings Services so viele extrem schöne Feature mitliefern, dass man diese einfach viel mehr nutzen sollte. Die Exportformate sehen sehr schick aus, richtig Klasse finde ich die Excel-Version des Reports. Man sollte bei der exzessiven Nutzung aber unbedingt die Serverresourcen im Auge behalten. Reporting kann sehr Rechenintensiv sein! Sorry, dass ich kein Bild vom Report einfüge, aber leider sind sehr viele vertrauliche Daten enthalten.

Hier noch eine weitere Webseite http://www.gotreportviewer.com/ mit vielen Tipps und Tutorials.

Keine Kommentare: