SSRS и powershell: параметр не принят

Я использую Powershell для запуска нескольких отчетов по службам отчетов Microsoft SQL и для сохранения результатов в документе Word. У меня есть script с функциями, которые обрабатывают связь с сервером отчетов:

## File "qrap-functions.ps1"
function GetRSConnection($server, $instance)
{
    $User = "xxxx"
    $PWord = ConvertTo-SecureString -String "yyyy" -AsPlainText -Force
    $c = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord

    $reportServerURI = "http://" + $server + "/" + $instance + "/ReportExecution2005.asmx?WSDL"

    $RS = New-WebServiceProxy -Class 'RS' -NameSpace 'RS' -Uri $reportServerURI -Credential $c
    $RS.Url = $reportServerURI
    return $RS
}
function GetReport($RS, $reportPath)
{
    $reportPath = "/" + $reportPath
    #$reportPath
    $Report = $RS.GetType().GetMethod("LoadReport").Invoke($RS, @($reportPath, $null))      
    $parameters = @()
    $RS.SetExecutionParameters($parameters, "nl-nl") > $null
    return $report
}
function AddParameter($params, $name, $val)
{
    $par = New-Object RS.ParameterValue
    $par.Name = $name
    $par.Value = $val
    $params += $par
    return ,$params
}
function GetReportInFormat($RS, $report, $params, $format, $saveas)
{
    $deviceInfo = "<DeviceInfo><NoHeader>True</NoHeader></DeviceInfo>"
    $extension = ""
    $mimeType = ""
    $encoding = ""
    $warnings = $null
    $streamIDs = $null

    $RS.SetExecutionParameters($params, "nl-nl") > $null

    $RenderOutput = $RS.Render($format,
        $deviceInfo,
        [ref] $extension,
        [ref] $mimeType,
        [ref] $encoding,
        [ref] $warnings,
        [ref] $streamIDs
    )
    $Stream = New-Object System.IO.FileStream($saveas), Create, Write
    $Stream.Write($RenderOutput, 0, $RenderOutput.Length)
    $Stream.Close()
}

Затем у меня есть script, который выполняет отчет, содержащий финансовые квартальные данные. Этот script работает нормально:

## File "qrap-financieel.ps1"
. "./qrap-functions.ps1"

$saveas = "e:\test\financieel.doc"
$RS = GetRSConnection -server "MSZRDWH" -instance "reportserver_acc"
$report = GetReport -RS $RS -reportPath "kwartaalrapportage/kwartaalrapportage financieel"
$params = @()   
$kwartaal = "[Periode Maand].[Jaar Kwartaal].&[2015-2]"
$kptc = "[Kostenplaats].[Team code].&[2003]"

$params = AddParameter -params $params -name "PeriodeMaandJaarKwartaal" -val $kwartaal
$params = AddParameter -params $params -name "KostenplaatsTeamcode" -val $kptc

GetReportInformat -RS $RS -report $report -params $params -format "WORD" -saveas $saveas

Значения для $kwartaal и $kptc здесь жестко закодированы, но являются параметрами в реальной версии этого script. Помимо финансового квартала, мы имеем три других квартальных отчета, которые должны быть представлены этим script. Два из них работают нормально, в четвертом я не могу получить один из параметров справа. script для этого:

## File "qrap-zorglog.ps1"
. "./qrap-functions.ps1"
$RS = GetRSConnection -server "MSZRDWH" -instance "reportserver_acc"
$report = GetReport -RS $RS -reportPath "kwartaalrapportage/kwartaalrapportage zorglogistiek"

$s = "Urologie"
$saveas = "e:\test\ZL Urologie.doc"
$params = @()   
$kwartaal = "[Periode Maand].[Jaar Kwartaal].&[2015-2]" 

$params = AddParameter -params $params -name "HoofdspecialismeSpecialismeOms"                       -val "[Hoofdspecialisme].[Specialisme Oms].&[$s]"
$params = AddParameter -params $params -name "PeriodeMaandJaarKwartaal"                             -val $kwartaal
$params = AddParameter -params $params -name "WachttijdenSpecialismeSpecialisme"                    -val "[Wachttijden Specialisme].[Specialisme].&[$s]"
$params = AddParameter -params $params -name "SpecialisatieGroeperingSpecialisatieGroeperingOms"    -val "[Specialistie Groepering].[Specialistie Groepering Oms].&[$s]"    
$params = AddParameter -params $params -name "AanvragendSpecialismeSpecialismeOms"                  -val "[AanvragendSpecialisme].[Specialisme Oms].&[$s]"

GetReportInformat -RS $RS -report $report -params $params -format "WORD" -saveas $saveas

Когда я выполняю этот script, я получаю эту ошибку:

Exception calling "Render" with "7" argument(s): "System.Web.Services.Protocols.SoapException: This report requires a 
default or user-defined value for the report parameter 'HoofdspecialismeSpecialismeOms'. To run or subscribe to this 
report, you must provide a parameter value. ---> Microsoft.ReportingServices.Diagnostics.Utilities.ReportParameterValueNot
SetException: This report requires a default or user-defined value for the report parameter 
'HoofdspecialismeSpecialismeOms'. To run or subscribe to this report, you must provide a parameter value.

Я, очевидно, поставлю значение для "HoofdspecialismeSpecialismeOms"; Ранее я заметил, что эта ошибка также возникает, когда параметр не находится в ожидаемом формате. Этот формат, поскольку фильтр отчета основан на иерархии в кубе SSAS, выглядит так: [hierarchy].[sub-level].&[member]. Я гарантировал, что [Hoofdspecialisme].[Specialisme Oms].&[$s] является правильным форматом поиск в запросе, который заполняет приглашение в SSRS. Отчет выводит данные при запуске через SSRS - и принимает параметр из приглашения.

Я заметил, что этот параметр допускает множественный выбор. Тем не менее, я не верю, что это приводит к ошибке, потому что это также верно для AanvragendSpecialismeSpecialismeOms.

Любая идея, почему этот один параметр не может быть отправлен в отчет при вызове GetReportInformat?

Ответ 1

Я, наконец, понял это. В запросе на отказ был включен мультивыбор. И при заполнении мультивыбора SSRS ожидает список значений. Когда задана только одна строка, строка игнорируется и параметр считается пустым.

Чтобы подать его в список, мы должны сделать:

$multival = New-Object System.Collections.Specialized.StringCollection
$multival.Add("[Hoofdspecialisme].[Specialisme Oms].&[$s]")
[snip]
$params = AddParameter -params $params -name "HoofdspecialismeSpecialismeOms" -val $multival

Найден ответ благодаря этому вопросу: Как передать несколько параметров значения в отчет служб отчетов через powershell

Ответ 2

Вы пробовали

function AddParameter($params, $name, $val)
{
    $par = New-Object RS.ParameterValue
    $par.Name = $name
    $par.Value = $val
    $params += $par
    return ,$params
    #      ^Removing this comma?
}

Также как объявление типов данных явно для ваших параметров?

function AddParameter([Array]$params, [String]$name, [String]$val)
{
    $par = New-Object RS.ParameterValue
    $par.Name = $name
    $par.Value = $val
    $params += $par
    return ,$params
}

Кроме того, при наличии большого количества пользовательских вспомогательных функций, вызывающих импортируемые типы, которые вызывают методы и устанавливают свойства для отчета, мы не можем видеть, может быть немного сложно помочь в устранении неполадок в отношении этого конкретного отчета, получение ошибки. Похоже, вы пытались перемещать строку в том порядке, который звучит для меня, как будто у вас может возникнуть проблема с тем, как этот конкретный отчет анализирует значения, введенные вами через RS.ParameterValue, поэтому, возможно, взгляните, примет ли он строку, которую вы установите в -val для вашей пользовательской функции AddParameter.

Изменить:

Из https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e38b4a34-c780-43bb-8321-15f96d0938a9/exception-calling-render-systemwebservicesprotocolssoapexception-one-or-more-data-source?forum=sqlreportingservices

Эта ошибка возникает, когда вы пытаетесь запустить отчет, в котором один или несколько источников данных настроены на "подсказку" учетных данных. Это означает, что мы не используем ваши учетные данные Windows автоматически, но вам нужно предоставить другой набор учетных данных, которые используются только для источника данных.

Похоже, вам может потребоваться отложить в сторону script и проверить, отличается ли отчет.