Pertanyaan Pelaporan Layanan Pelaporan


Saya perlu membuat proses yang dapat diulang untuk menyebarkan laporan SQL Server Reporting Services. Saya tidak mendukung penggunaan Visual Studio dan atau Pengembangan Bisnis Studio untuk melakukan ini. Metode rs.exe dari penyebaran skrip juga tampak agak kikuk. Adakah yang punya cara yang sangat elegan sehingga mereka dapat menerapkan laporan. Kuncinya di sini adalah bahwa saya ingin prosesnya sepenuhnya otomatis.


32
2017-09-17 23:35


asal


Jawaban:


Kami menggunakan rs.exe, setelah kami mengembangkan skrip kami tidak perlu menyentuh lagi, itu hanya berfungsi.

Inilah sumbernya (saya sedikit memodifikasi dengan tangan untuk menghapus data sensitif tanpa kesempatan untuk mengujinya, berharap saya tidak mengerem apa pun), ia menyebarkan laporan dan gambar terkait dari subdirektori untuk berbagai bahasa. Sumber data juga dibuat.

'=====================================================================
'  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

Ini adalah batch untuk memanggil rs.exe:

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

32
2017-09-18 09:04



Saya menggunakan skrip @David disediakan tetapi saya harus menambahkan beberapa kode (saya mengetik ini sebagai jawaban, karena ini akan terlalu lama untuk komentar.

Masalahnya adalah: jika sudah ada "sumber data bersama" yang dilampirkan pada laporan dalam definisi laporan, ini tidak pernah sumber data yang sama dengan yang dibuat dalam skrip.

Ini juga menjadi jelas dari peringatan yang dipancarkan oleh metode "CreateReport":

Kumpulan data '' mengacu pada sumber data bersama '', yang tidak dipublikasikan di server laporan.

Jadi sumber data harus diatur secara eksplisit sesudahnya. Saya telah membuat perubahan kode berikut:

Saya menambahkan variabel global:

Dim dataSourceRefs(0) As DataSource

Pada akhir metode CreateDataSource, variabel itu akan diisi:

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

Dan dalam metode PublishReport, sumber data tersebut secara eksplisit diatur (setelah CreateReport telah dipanggil):

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

Perhatikan bahwa panggilan terakhir ini hanya RS 2005 atau lebih tinggi. Jika Anda ingin memuat laporan Anda ke server RS ​​2000, Anda harus menggunakan SetMelaporkanSumber data sebagai gantinya:

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

8
2018-05-03 15:39



Yah tidak benar-benar elegan. Kami membuat alat kami sendiri yang menggunakan layanan layanan reporting20052005. Kami menemukan ini sebagai cara yang paling dapat diandalkan untuk mendapatkan apa yang kami inginkan.

Tidak sesulit itu dan memungkinkan Anda memperluasnya untuk melakukan hal-hal lain seperti membuat sumber data dan folder sesuai kebutuhan.


1
2017-09-17 23:41



Saya sangat menyarankan RSScripter. Sebagaimana tercantum dalam ikhtisar:

Reporting Services Scripter adalah .NET   Aplikasi Windows Forms yang memungkinkan   scripting dan transfer semua   Pelaporan Microsoft SQL Server   Katalog layanan barang untuk membantu   mentransfernya dari satu server ke   lain. Ini juga dapat digunakan dengan mudah   memindahkan item ke massa dari satu Pelaporan   Folder layanan yang lain pada yang sama   server Tergantung pada scripting   opsi yang dipilih, Layanan Pelaporan   Scripter juga dapat mentransfer semua katalog   properti item seperti Deskripsi,   Opsi riwayat, Pilihan eksekusi   (termasuk laporan khusus dan dibagikan   jadwal), Langganan (normal dan   data driven) dan laporan sisi server   parameter.


1
2018-04-16 07:12



Saya tahu Anda mengatakan bahwa Anda tidak mendukung Business Development Studio untuk melakukan hal ini, tetapi saya telah menemukan alat bawaan yang sangat andal dan mudah digunakan.


0
2017-09-17 23:38



Sudahkah Anda mencari solusi Integrasi Kontinyu seperti CruiseControl.NET? Jika Anda dapat menyebarkan Laporan menggunakan rs.exe maka Anda dapat mengatur proses otomatis di CruiseControl untuk membangun dan menyebarkan Laporan Anda pada pewaktu atau kapan pun laporan diubah.


0
2017-09-18 00:18