Frage

Ich brauche einen wiederholbaren Prozess zu schaffen für die Bereitstellung von SQL Server Reporting Services-Berichte. Ich bin nicht für den Einsatz von Visual Studio und oder Business Development Studio, dies zu tun. Die rs.exe Methode der Scripting-Implementierungen scheint auch eher klobig. Hat jemand eine sehr elegante Art und Weise, dass sie in der Lage gewesen, auf Berichte bereitstellen. Der Schlüssel hier ist, dass ich der Prozess will vollständig automatisiert werden.

War es hilfreich?

Lösung

Wir verwenden rs.exe, sobald wir das Skript entwickeln wir es nicht nötig haben, mehr zu berühren, es funktioniert einfach.

Hier ist die Quelle (ich es von Hand leicht modifiziert, um sensible Daten zu entfernen, ohne eine Chance, es zu testen, ich hoffe, nicht Bremse etwas getan), es setzt Berichte sowie Bilder von Verzeichnisse für verschiedene Sprachen. Auch Datenquelle erstellt wird.

'=====================================================================
'  File:      PublishReports.rss
'
'  Summary: Script that can be used with RS.exe to 
'           publish the reports.
'
'  Rss file spans from beginnig of this comment to end of module
' (except of "End Module").
'=====================================================================

Dim langPaths As String() = {"en", "cs", "pl", "de"}
Dim filePath As String = Environment.CurrentDirectory

Public Sub Main()

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    'Create parent folder
    Try
        rs.CreateFolder(parentFolder, "/", Nothing)
        Console.WriteLine("Parent folder created: {0}", parentFolder)
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try

    PublishLanguagesFromFolder(filePath)

End Sub

Public Sub PublishLanguagesFromFolder(ByVal folder As String)
    Dim Lang As Integer
    Dim langPath As String

    For Lang = langPaths.GetLowerBound(0) To langPaths.GetUpperBound(0)
        langPath = langPaths(Lang)

        'Create the lang folder
        Try
            rs.CreateFolder(langPath, "/" + parentFolder, Nothing)
            Console.WriteLine("Parent lang folder created: {0}", parentFolder + "/" + langPath)
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

        'Create the shared data source
        CreateDataSource("/" + parentFolder + "/" + langPath)

        'Publish reports and images
        PublishFolderContents(folder + "\" + langPath, "/" + parentFolder + "/" + langPath)
    Next 'Lang
End Sub

Public Sub CreateDataSource(ByVal targetFolder As String)
    Dim name As String = "data source"

    'Data source definition.
    Dim definition As New DataSourceDefinition
    definition.CredentialRetrieval = CredentialRetrievalEnum.Store
    definition.ConnectString = "data source=" + dbServer + ";initial catalog=" + db
    definition.Enabled = True
    definition.EnabledSpecified = True
    definition.Extension = "SQL"
    definition.ImpersonateUser = False
    definition.ImpersonateUserSpecified = True
    'Use the default prompt string.
    definition.Prompt = Nothing
    definition.WindowsCredentials = False
    'Login information
    definition.UserName = "user"
    definition.Password = "password"

    Try
    'name, folder, overwrite, definition, properties 
        rs.CreateDataSource(name, targetFolder, True, definition, Nothing)
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try

End Sub

Public Sub PublishFolderContents(ByVal sourceFolder As String, ByVal targetFolder As String)
    Dim di As New DirectoryInfo(sourceFolder)
    Dim fis As FileInfo() = di.GetFiles()
    Dim fi As FileInfo

    Dim fileName As String

    For Each fi In fis
        fileName = fi.Name
        Select Case fileName.Substring(fileName.Length - 4).ToUpper
            Case ".RDL"
                PublishReport(sourceFolder, fileName, targetFolder)
            Case ".JPG", ".JPEG"
                PublishResource(sourceFolder, fileName, "image/jpeg", targetFolder)
            Case ".GIF", ".PNG", ".BMP"
                PublishResource(sourceFolder, fileName, "image/" + fileName.Substring(fileName.Length - 3).ToLower, targetFolder)
        End Select
    Next fi
End Sub

Public Sub PublishReport(ByVal sourceFolder As String, ByVal reportName As String, ByVal targetFolder As String)
    Dim definition As [Byte]() = Nothing
    Dim warnings As Warning() = Nothing

    Try
        Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + reportName)
        definition = New [Byte](stream.Length) {}
        stream.Read(definition, 0, CInt(stream.Length))
        stream.Close()
    Catch e As IOException
        Console.WriteLine(e.Message)
    End Try

    Try
   'name, folder, overwrite, definition, properties 
        warnings = rs.CreateReport(reportName.Substring(0, reportName.Length - 4), targetFolder, True, definition, Nothing)

        If Not (warnings Is Nothing) Then
            Dim warning As Warning
            For Each warning In warnings
                Console.WriteLine(warning.Message)
            Next warning
        Else
            Console.WriteLine("Report: {0} published successfully with no warnings", targetFolder + "/" + reportName)
        End If
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try
End Sub

Public Sub PublishResource(ByVal sourceFolder As String, ByVal resourceName As String, ByVal resourceMIME As String, ByVal targetFolder As String)
    Dim definition As [Byte]() = Nothing
    Dim warnings As Warning() = Nothing

    Try
        Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + resourceName)
        definition = New [Byte](stream.Length) {}
        stream.Read(definition, 0, CInt(stream.Length))
        stream.Close()
    Catch e As IOException
        Console.WriteLine(e.Message)
    End Try

    Try
    'name, folder, overwrite, definition, MIME, properties 
        rs.CreateResource(resourceName, targetFolder, True, definition, resourceMIME, Nothing)
        Console.WriteLine("Resource: {0} with MIME {1} created successfully", targetFolder + "/" + resourceName, resourceMIME)
    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try
End Sub

Hier ist der Ansatz der rs.exe zu nennen:

SET ReportServer=%1
SET DBServer=%2
SET DBName=%3
SET ReportFolder=%4

rs -i PublishReports.rss -s %ReportServer% -v dbServer="%DBServer%" -v db="%DBName%" -v parentFolder="%ReportFolder%" >PublishReports.log 2>&1

pause

Andere Tipps

habe ich das Skript @ David geliefert, aber ich hatte einige Code hinzufügen ( ich bin diese Eingabe als Antwort auf, wie dies für einen Kommentar zu lang sein würde.

Das Problem ist: Wenn es bereits eine „gemeinsame Datenquelle“ an einen Bericht in der Berichtsdefinition, das ist nie die gleiche Datenquelle wie die, die in dem Skript erstellt wird.

Dies wird auch aus der Warnung durch den „Create“ -Verfahren emittiert:

  

Der Datensatz ‚‘ bezieht sich auf die freigegebene Datenquelle ‚‘, das nicht auf dem Berichtsserver veröffentlicht wird.

So hat die Datenquelle explizit danach eingestellt werden. Ich habe folgende Code Änderungen vorgenommen:

Ich habe eine globale Variable:

Dim dataSourceRefs(0) As DataSource

Am Ende der Create Methode, diese Variable gefüllt wird:

Dim dsr As New DataSourceReference
dsr.Reference = "/" + parentFolder + "/" + db
Dim ds As New DataSource
ds.Item = CType(dsr, DataSourceDefinitionOrReference)
ds.Name = db
dataSourceRefs(0) = ds

Und in der PublishReport Methode, wird die Datenquelle explizit festgelegt (nach Create genannt wurde):

rs.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

Beachten Sie, dass dieser letzte Anruf nur 2005 RS ist oder höher. Wenn Sie Ihre Berichte auf einen RS 2000-Server laden möchten, müssen Sie Set verwenden, Bericht Datasources anstatt:

rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

Nun, nicht wirklich elegant. Wir haben unser eigenes Tool, das den reportingservices2005 Web-Dienst verwendet. Wir fanden dies der zuverlässigste Weg, um zu sein, was wir wollen.

Es ist nicht wirklich so schwierig und man läßt es erweitern, um andere Dinge zu tun, wie Erstellung von Datenquellen und Ordnern nach Bedarf.

Ich empfehle RSScripter . Wie in der Übersicht festgestellt:

  

Reporting Services Autor ist ein .NET   Windows Forms-Anwendung, die ermöglicht,   Scripting und Übertragung aller   Microsoft SQL Server Reporting   Dienstkatalog Artikel zur Hilfe bei der   Übertragen sie von einem Server auf   Ein weiterer. Es kann auch verwendet werden, um leicht   Elemente auf Masse von einer Bericht   Dienstleistungen Ordner in einen anderen auf dem gleichen   Server. Je nach scripting   Optionen gewählt, Reporting Service   Scripter kann auch alle Kataloge übertragen   Elementeigenschaften wie Beschreibungen,   Geschichte Optionen, Ausführungsoptionen   (Einschließlich Bericht spezifische und gemeinsame   Zeitplan), Abonnements (normal und   data driven) und Server-Seite Bericht   Parameter.

Ich weiß, Sie sagen, dass Sie nicht für das Business Development Studio sind, dies zu tun, aber ich habe die integrierten Tools als sehr zuverlässig und einfach zu bedienen.

gefunden

Haben Sie sich in jede Continuous Integration-Lösungen wie CruiseControl.NET? Wenn Sie in der Lage, Berichte zu implementieren mit rs.exe dann können Sie Setup ein automatisierter Prozess in CruiseControl- erstellen und bereitstellen Ihre Berichte über einen Timer oder immer dann, wenn ein Bericht geändert wird.

In unserer Umwelt entwickeln wir in VS mit Versionskontrolle dann DEV SSRS bereitstellen. Sobald der Bericht bestätigt wird, verwenden wir ReportSync Programm Berichten von ReportServer DEV bereitstellen ReportServer PROD. Die rs.exe Skripte hat noch ihren Platz, aber ich habe ReportSync eine viel einfachere und agile Art und Weise zu fördern, einen Bericht festgestellt.

ReportSync:

ReportSync ist ein Open-Source-Programm kostenlos herunterzuladen und zu verwenden. Es funktioniert gut für Berichte in loser Schüttung Herunterladen, und es kann sogar einen Bericht von einem Server auf einem anderen Server schieben.


Wie kommt man das Programm herunterladen?

Wie man einen Bericht implementieren?

  1. Führen Sie die ausführbare Datei und die Schnittstelle wird gestartet.
  2. Mit den SOURCE und DESTINATION Dialogen ein single report, multiple reports oder eine entire folder of reports wählen. Sie können Sie sich jeden Zielordner mögen. (TIPP:. Sie können auch den gleichen Server Ziel, wenn Sie wollen, einen Bericht über den gleichen Server duplizieren)
  3. Nachdem Sie Ihre Auswahl drücken Sie die Sync button
  4. Gehen Sie auf dem Zielserver, und bestätigen die Wirkung Änderung durch die Überprüfung der von Datum geändert hat.

Dieses Tool ist sehr bequem, aber ich habe einige Macken bemerkt. Zum Beispiel when I want to update just one report that already exists in the destination, hier ist das, was ich [Source:Report> Target:Folder> Sync] Auswählen-- haben. ACHTUNG: Man könnte denken, Sie den Zielserver Bericht auswählen würden, sie zu aktualisieren, aber ich habe versucht, diese und der Bericht nicht aktualisiert.


Was kann ReportSync tun?

  • Es gibt auch eine Export-Funktion, die für einfach Dumping all RDL-Dateien in einen Ordner für mich Zugang wunderbar funktioniert. Dies ist hilfreich für den Fall, müssen Sie den Server migrieren, fügen Sie die Dateien auf eine VS-Lösung Projekt, oder irgendetwas anderes tun, werden alle Dateien.

  • In meinen Tests dieses Programm nicht wandern andere content-- Abonnements, freigegebene Datenquellen gemeinsam genutzten Datensätzen. Es ist nur anwendbar auf die Berichtsdateien.

Ich weiß, dass dieser Beitrag ist alt, aber ich kam über ihn, wenn rs.exe Skripte Forschung, so dachte ich, ich hätte gerne eine Antwort auf diese Frage geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top