Визуализация отчета SSRS с параметрами с использованием SOAP в Powershell - PullRequest
3 голосов
/ 16 ноября 2010

Я играл с этим в течение нескольких дней без удачи. По сути, я пытаюсь создать простую библиотеку для отображения отчетов SSRS с помощью Powershell. Я использую Powershell в попытке облегчить разработку позже (вместо того, чтобы кодировать приложение на C # для каждого проекта). В основном это будет использоваться для планирования различных вещей с отчетами.

У меня есть рендеринг отчетов в основном , работающий в Powershell. Единственное, что я не могу понять, это как указать параметры отчета перед вызовом метода рендеринга. Я нашел много кода, относящегося к C # и VB (который я использовал в других проектах SSRS), однако я не могу преобразовать его в Powershell.

Поскольку я довольно новичок в Powershell, я не знаю, как это сделать. Вот код, который я использовал:

$ReportExecutionURI = "http://glitas10//ReportServer//ReportExecution2005.asmx?wsdl"
$ReportPath = "/Financial/ExpenseReportStub"
$format = "PDF"

$deviceInfo = "<DeviceInfo><NoHeader>True</NoHeader></DeviceInfo>"
$extension = ""
$mimeType = ""
$encoding = ""
$warnings = $null
$streamIDs = $null

$Reports = New-WebServiceProxy -Uri $ReportExecutionURI -UseDefaultCredential

# Load the report 
$Report = $Reports.GetType().GetMethod("LoadReport").Invoke($Reports, @($ReportPath, $null))

# Render the report
$RenderOutput = $Reports.Render($format, $deviceInfo, [ref] $extension, [ref] $mimeType, [ref] $encoding, [ref] $warnings, [ref] $streamIDs)

Это прекрасно работает для отчетов, которые не требуют параметров, очевидно.

Есть идеи о том, что мне нужно сделать, чтобы создать экземпляр объекта и передать параметры?

Ответы [ 2 ]

9 голосов
/ 10 декабря 2010

Вот некоторая информация о решении, которое я в итоге использовал, на случай, если кому-то еще понадобится сделать то же самое.Это работает очень хорошо.

Первый подход, который работал, заключался в создании библиотеки DLL для использования скриптом Powershell.Это работало нормально, но это вызывает две проблемы.Во-первых, ваш скрипт имел для работы с DLL.Во-вторых, эта DLL была привязана к определенному серверу SSRS.Чтобы получить доступ к другому серверу, вам пришлось использовать несколько библиотек DLL.

В конце концов я вернулся к использованию веб-прокси.Ключевым моментом здесь является использование пространств имен, чтобы вы могли создать экземпляр объекта ParameterValue.Вот код:

# Create a proxy to the SSRS server and give it the namespace of 'RS' to use for
# instantiating objects later.  This class will also be used to create a report
# object.
$reportServerURI = "http://<SERVER>/ReportServer/ReportExecution2005.asmx?WSDL"
$RS = New-WebServiceProxy -Class 'RS' -NameSpace 'RS' -Uri $reportServerURI -UseDefaultCredential
$RS.Url = $reportServerURI

# Set up some variables to hold referenced results from Render
$deviceInfo = "<DeviceInfo><NoHeader>True</NoHeader></DeviceInfo>"
$extension = ""
$mimeType = ""
$encoding = ""
$warnings = $null
$streamIDs = $null

# Next we need to load the report. Since Powershell cannot pass a null string
# (it instead just passses ""), we have to use GetMethod / Invoke to call the
# function that returns the report object.  This will load the report in the
# report server object, as well as create a report object that can be used to
# discover information about the report.  It's not used in this code, but it can
# be used to discover information about what parameters are needed to execute
# the report.
$reportPath = "/PathTo/Report"
$Report = $RS.GetType().GetMethod("LoadReport").Invoke($RS, @($reportPath, $null))

# Report parameters are handled by creating an array of ParameterValue objects.
$parameters = @()

$parameters += New-Object RS.ParameterValue
$parameters[0].Name  = "Parameter 1"
$parameters[0].Value = "Value"

$parameters += New-Object RS.ParameterValue
$parameters[1].Name  = "Parameter 2"
$parameters[1].Value = "Value"

# Add the parameter array to the service.  Note that this returns some
# information about the report that is about to be executed.
$RS.SetExecutionParameters($parameters, "en-us") > $null

# Render the report to a byte array.  The first argument is the report format.
# The formats I've tested are: PDF, XML, CSV, WORD (.doc), EXCEL (.xls),
# IMAGE (.tif), MHTML (.mhtml).
$RenderOutput = $RS.Render('PDF',
    $deviceInfo,
    [ref] $extension,
    [ref] $mimeType,
    [ref] $encoding,
    [ref] $warnings,
    [ref] $streamIDs
)

# Convert array bytes to file and write
$Stream = New-Object System.IO.FileStream("output.pdf"), Create, Write
$Stream.Write($RenderOutput, 0, $RenderOutput.Length)
$Stream.Close()

Кажется, довольно легко, и это так.Этот метод работает исключительно хорошо и является тем методом, который я сейчас использую для отображения и отправки по электронной почте запланированных отчетов, поскольку он обеспечивает гораздо большую гибкость, чем встроенное планирование SSRS.Кроме того, это относительно быстро.Один из сценариев, которые я использую для отправки отчетов, может обрабатывать и отправлять около 20-30 отчетов в минуту.

0 голосов
/ 14 января 2013

Была такая же проблема, кроме того, хотел отправить сгенерированный файл MHT в качестве тела письма: Следующее было найдено на работу Старый CDO.Message - единственное, что я обнаружил, что позволяет отправлять файл MHTML в качестве тела письма. Ниже (рабочий) перевод программы VB Старый, но простой; -)!

################## Send MHTML email ##############################
# use antiquated CDO to send mhtml as email body

$smtpServer = "my-mail-server"
$smtpSubject = "MHT file sent as body of email"
$smtpTo = "you@work.com"
$smtpFrom = "me@home.org"
$MHTMLfile = "my-MHT-File.mht
# e.g. from an SSRS.Render


$AdoDbStream = New-Object -ComObject ADODB.Stream
$AdoDbStream.Charset = "ascii"
$AdoDbStream.Open()
$AdoDbStream.LoadFromFile($MHTMLfile)
$CdoMessage = New-Object -ComObject CDO.Message
$CdoMessage.DataSource.OpenObject($AdoDbStream,"_Stream")

$SendUsingPort = 2
$smtpPort = 25

$cfg = "http://schemas.microsoft.com/cdo/configuration/"
$CdoMessage.Configuration.Fields.Item($cfg + "sendusing") =  $SendUsingPort
$CdoMessage.Configuration.Fields.Item($cfg + "smtpserver") = $SmtpServer
$CdoMessage.Configuration.Fields.Item($cfg + "smtpserverport") = $smtpPort 

$CdoMessage.To      = $smtpTo
$CdoMessage.From    = $smtpFrom
$CdoMessage.Subject = $smtpSubject

$CdoMessage.MimeFormatted = $true
$CdoMessage.Configuration.Fields.Update()

WRITE-HOST "Sending email"
$CdoMessage.Send()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...