Push Reports to Server
The VB script below is designed to push SQL Reporting Services reports from local directory and put them all into a RS folder This script works in conjunction with GetReportsFromServer, which can be found here. This script was designed to work for getting Team Foundation Server Reports from the server and pushing to another server, but can be adapated for any set of reporting services reports.
This script is executed by modifying it so that gMovingCollection variable is the name of the project collection that you are delivering, then running the command while in the parent direcotry of the folder created from GetReportsFromServer
rs -i PushReportsToServer.rss -s https://<tfsServer>/reportserver
for example if the path used in GetReportsFromServer was in the folder C:\TFS_DefaultColleciton, then while in the C:\ directory execute:
rs -i PushReportsToServer.rss -s https://contoso/reportserver
The code in this script is given here and can be found in the attached file.
'=============================================================================
' File: GetReportsFromServer.rss
'
' Summary: Dowloads all reports from a TFS Reports Server to a specified directory
'
'
'---------------------------------------------------------------------
'
' Copyright (C) Microsoft Corporation. All rights reserved.
'
' This source code is intended only as a supplement to Microsoft
' Development Tools and/or on-line documentation. See these other
' materials for detailed information regarding Microsoft code samples.
'
' THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
' KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
' IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
' PARTICULAR PURPOSE.
'=============================================================================
'
' 1.0 Documentation
'
' Read the following in order to familiarize yourself with the sample script.
'
' 1.1 Overview
'
' This sample script uses a script file (.rss) and the script environment to run
' Web service operations on a specified report server. This script copies all of
' the RDL files from a local folder to the server and is designed to be used
' with GetReportsFromServer.rss
'
' To correcly run this script you will need to modify the global variable:
' "gMovingCollection"
'
'
' 1.2 Sample Command Lines
'
'
' 1.2.1 Use the script to publish the sample reports to an AdventureWorks Sample Reports folder.
'
' rs -i PushReportsToServer.rss -s https://myserver/reportserver
'
''''' Modify gMovingCollection to be the collection name you want to move.
Dim gMovingCollection As String = "DefaultCollection"
''''' Only change the variable gHDLocation, if your Reports are stored in a different directory then
''''' .\TFS_gMovingCollection
Dim gHDLocation As String = ".\TFS_"+gMovingCollection
''''' Only change the variable gReportsLocation, if some reason your reports are stored in a direcotry other thean
''''' "/TFSReports" (i.e., never change this).
Dim gReportsLocation As String = "/TFSReports"
'This function recursively navigates through the local hard drive uploading files and creating folders
'in the process
public Sub OnNodeArrival(myParentServerPath As String, myServerFolder As String, myHDFolder As String)
'Create the parent folder on Reporting Server
Try
rs.CreateFolder(myServerFolder, myParentServerPath, Nothing)
Console.WriteLine("Folder {0} created successfully", myServerFolder)
Catch e As Exception
Console.WriteLine("Failed to Create Folder")
Console.WriteLine(e.Message)
End Try
'' We need to handle the possible base cases "C:\" and "/" differntly because the end in a slash
Dim parentHDPath As String
Dim parentRepPath As String
If (myHDFolder = "C:\")
parentHDPath = myHDFolder
Else
parentHDPath = myHDFolder+"\"
End If
If (myParentServerPath = "/")
parentRepPath = myParentServerPath
Else
parentRepPath = myParentServerPath +"/"
End If
' Retrieve a list of all items from the local and upload them.
Dim returnValues As String()
Dim fileWithPath As String
Dim file As String
'Publish reports in myHDFolder
returnValues = Directory.GetFiles(myHDFolder)
For Each fileWithPath in returnValues
If (Path.GetExtension(fileWithPath) = ".rdl")
file = Path.GetFileNameWithoutExtension(fileWithPath)
PublishReport(fileWithPath, parentRepPath+myServerFolder, file)
End If
Next
''Recursively navigate through all sub directories
Dim subFolderWithPath As String
Dim subFolder As String
returnValues = Directory.GetDirectories(myHDFolder)
For Each subFolderWithPath in returnValues
'the below line is nescssary because subFolderWithPath contains "C:\blah-blah\...\reportfolder"
'and we just need "reportfolder"
subFolder = subFolderWithPath.Replace(parentHDPath, "")
OnNodeArrival(parentRepPath+myServerFolder, subFolder, subFolderWithPath)
Next
End Sub
'This function actually publishes the report
Public Sub PublishReport(filePath As String, reportPath As String, ByVal reportName As String)
Dim definition As [Byte]() = Nothing
Dim warnings As Warning() = Nothing
Dim combinedString As String
If (reportPath="/") Then
combinedString = reportPath+reportName
Else
combinedString = reportPath+"/"+reportName
End If
Try
Dim stream As FileStream = File.OpenRead(filePath)
definition = New [Byte](stream.Length-1) {}
stream.Read(definition, 0, CInt(stream.Length))
stream.Close()
Catch e As IOException
Console.WriteLine(e.Message)
End Try
Try
warnings = rs.CreateReport(reportName, reportPath, False, definition, Nothing)
If Not (warnings Is Nothing) Then
'We ignore the warnings where the DataSources are not hooked up because
'we fix this up after the report is uploaded
Dim warning As Warning
For Each warning In warnings
If (warning.Code <> "rsDataSourceReferenceNotPublished") Then
Console.WriteLine("--Warning For :" + combinedString)
Console.WriteLine("Warning Code:" + warning.Code)
Console.WriteLine(warning.Message)
Console.WriteLine("")
End If
Next warning
Else
'Console.WriteLine("Report: {0} published successfully with no warnings", reportName)
End If
Catch e As Exception
Console.WriteLine("--Error For :" + combinedString)
Console.WriteLine(e.Message)
Console.WriteLine("")
End Try
'''''
'Modify the data source of uploaded reports
'''''
'In the TFS suplied reports, only two datasources are used:
' 1)"TFSOlapReportDS" and 2) "TfsReportDS". These values are located at respectively,
' 1) "/Tfs2010OlapReportDS" and 2) "/Tfs2010ReportDS".
'
'If your custom reports have other datasources that need to be changed, you
'can add these datasources here or you can modifiy them by manual after upload
'by navigating to their report at the Report Manager URL (https://myserver/reports)
'and viewing thier datasources under the properties tab.
Dim dataSources() As DataSource
dataSources = rs.GetItemDataSources(combinedString)
Dim oldDS as New DataSource()
Dim count As Integer
count = 0
For Each oldDS In dataSources
If (oldDS.Name = "TfsOlapReportDS")
Dim referenceDS As New DataSourceReference()
referenceDS.Reference = "/Tfs2010OlapReportDS"
oldDS.Item = referenceDS
Else If (oldDS.Name = "TfsReportDS")
Dim referenceDS As New DataSourceReference()
referenceDS.Reference = "/Tfs2010ReportDS"
oldDS.Item = referenceDS
End If
dataSources(count) = oldDS
count = count + 1
Next oldDS
Try
rs.SetItemDataSources(combinedString, dataSources)
Catch e As SoapException
Console.WriteLine("Failed to Write Reference for :" + combinedString)
Console.WriteLine(e.Detail.InnerXml.ToString())
End Try
'''''
'Modify the paramaters of uploaded reports
'''''
'In the TFS suplied reports, only one paramater is modified "ExplicitProject"
'For the ExcplicitProject paramater, the default value is set to empty (i.e., "")
'and PromptUser is set to False.
'
'If your custom reports have other paramaters that need to be changed, you
'can add these paramaters here or you can modifiy them by manual after upload
'by navigating to their report at the Report Manager URL (https://myserver/reports)
'and viewing thier parameters under the properties tab.
Dim forRendering As Boolean = False
Dim historyID As String = Nothing
Dim values As ParameterValue() = Nothing
Dim credentials As DataSourceCredentials() = Nothing
Dim parameters As ReportParameter() = Nothing
parameters = rs.GetReportParameters(combinedString, historyID, forRendering, values, credentials )
Dim par as New ReportParameter()
count = 0
For Each par In parameters
If (par.Name = "ExplicitProject")
Dim defVals(0) As String
Dim emptyString As String = ""
defVals(0) = emptyString
par.DefaultValues = defVals
par.PromptUser = False
End If
parameters(count) = par
count = count + 1
Next par
Try
rs.SetReportParameters(combinedString, parameters)
Catch e As SoapException
Console.WriteLine("Failed to Write Parameters for :" + combinedString)
Console.WriteLine(e.Detail.InnerXml.ToString())
End Try
End Sub
Public Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Console.WriteLine("Starting")
OnNodeArrival(gReportsLocation, gMovingCollection, gHDLocation )
Console.WriteLine("Files from " + gHDLocation + " were published in " + gReportsLocation+"/"+gMovingCollection)
End Sub