SSRS和powershell:参数不被接受

时间:2016-03-22 14:02:35

标签: powershell reporting-services

我使用Powershell在Microsoft SQL Report Services上运行多个报告,并将结果保存到Word文档。我有一个脚本,其中包含处理与报表服务器通信的函数:

## 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()
}

然后,我有一个脚本执行包含财务季度数据的报告。这个脚本运行正常:

## 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的值是硬编码的,但是此脚本的实际版本中的参数。除了财务季度,我们还有其他三个季度报告需要通过此脚本输出。 其中两个运行良好,在第四个我似乎无法正确获得其中一个参数。该脚本的脚本是:

## 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

当我执行此脚本时,我收到此错误:

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时,不知道为什么这个参数无法输入报告?

2 个答案:

答案 0 :(得分: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
}

此外,有这么多用户定义的帮助程序函数调用导入类型调用方法并将属性设置为报表,我们无法看到,对于此特定报表,您可能会有一些难以帮助解决问题。 #39;重新收到错误。您似乎已经尝试按顺序移动线路,这听起来像是您可能会遇到特定报告如何解析您通过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

  

当您尝试运行报告时会生成此错误,其中一个或多个数据源设置为&#34;提示&#34;证书。这意味着我们不会自动使用您的Windows凭据,而是需要提供仅用于数据源的不同凭据集。

听起来您可能需要放下脚本并检查报告是否不同。

答案 1 :(得分:0)

我终于明白了:失败的提示启用了多选。当填写多选时,SSRS需要一个值列表。当只给出一个字符串时,该字符串将被忽略,并且该参数将被假定为空白。

要将列表提供给我们,我们必须这样做:

public class MainWindowViewModel : BindableBase
{
    public ICommand SelectedGenderCommand { get; }

    public ICommand OKCommand { get; }

    private MessageBoxTypes _messageBoxType;

    public MessageBoxTypes MessageBoxType
    {
        get { return _messageBoxType; }
        set { SetProperty(ref _messageBoxType, value); }
    }

    private string _title = "Prism Unity Application";

    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }

    public MainWindowViewModel()
    {
        MessageBoxType = MessageBoxTypes.SelectView;

        SelectedGenderCommand = new DelegateCommand<object>(SelectedGender);

        OKCommand = new DelegateCommand<object>(OK);
    }

    private void OK(object obj)
    {
        MessageBoxType = MessageBoxTypes.SelectView;
    }

    private void SelectedGender(object obj)
    {
        MessageBoxType = MessageBoxTypes.MessageView;
    }
}

public enum MessageBoxTypes
{
    SelectView,
    MessageView,
    ConfirmView
}

感谢这个问题找到答案: How to pass multiple value parameter to reporting services report via powershell