Samstag, 23. April 2011

Integration Services & Reporting Services gemeinsam für die Bereitstellung von Reports nutzen

Im Rahmen eines Projektes evaluiere ich gerade Möglichkeiten, um eine automatisierte Bereitstellung von Reports zu ermöglichen. Es geht dabei um 1-2 Reports mehr. :-)

Die Verwendung von RS.EXE für die Ansteuerung der Reporting Services hatte ich in diesem Kontext ja schon beschrieben. Wobei mir bei RS.EXE die Anbindung von Datenquellen für die Parametrisierung nicht so gefällt.

Daher heute ein weiterer Ansatz: Nutzung der Reporting Services aus den Integration Services heraus!

Von der Logik her unterscheidet sich der Weg zum Report gar nicht so sehr vom Skriptingansatz, da wir wieder mit den selben Objekten konfrontiert werden. Nur jetzt verwende ich mal den Webservice für die Kommunikation.

Was brauchen wir also alles?

Einen Report! Da nehme ich wieder mal meinen einfachen Report mit nur einem Parameter, um die Ansteuerung der Parameter zu testen.

image

Ein SSIS Paket, welches nur aus einem Datenflusstask besteht, welcher wiederum nur eine OLE-Quelle und ein Skriptkomponente hat, welche heute mal als Ziel herhalten muss.

image

Die Datenquelle hat ein vergleichsweises einfaches Design, aber wird ihren Job machen.

image

Die Eingabespalte für unsere Skriptkomponente ist einfach “Text”. Mehr Einstellungen braucht die Komponente auch nicht.

image

Hier der Verweis auf den Webdienst der Reporting Services. Ab 2008 können wir ja auch Webdienste in der Komponente ansteuern. Danke nochmals dafür! :-)

image

Und natürlich noch das Stück Code für die Skriptkomponente.

public override void Eingabe0_ProcessInputRow(Eingabe0Buffer Row)
{
    byte[] result = null;
    string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
    string encoding;
    string mimeType;
    string extension;
    Warning[] warnings = null;
    string[] streamIDs = null;

    ParameterValue[] parameters = new ParameterValue[1];
    parameters[0] = new ParameterValue();
    parameters[0].Name = "DemoParameter";
    parameters[0].Value = Row.Text; // Übergabe des Parameters von außen…

    ReportExecutionService rs = new ReportExecutionService();
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

    rs.LoadReport("/Vertrieb/Demo", null);
    rs.SetExecutionParameters(parameters, "de-de");

    result = rs.Render("PDF", devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

    FileStream stream = File.Create(@"c:\MyProjects\output\report_"+ Row.Text +".pdf", result.Length);
    stream.Write(result, 0, result.Length);
    stream.Close();
}

So, diese Teile alle in einem SSIS Projekt bringt dann folgenden Output:

image

Und als Beweis kurz noch der Blick in eines der Dokumente.

image

Damit bin ich jetzt schon eindeutig zufriedener, wenn es darum geht automatisiert eine größere Menge an Reports zu erzeugen. Der Ansatz scheint eine gute Grundlage zu sein.

Viel Spaß beim Nachmachen! Und nochmals FROHE OSTERN! :-)