2016-03-22 8 views
10

Ich verwende Powershell, um mehrere Berichte über Microsoft SQL Report Services auszuführen und die Ergebnisse in einem Word-Dokument zu speichern. Ich habe ein Skript, mit Funktionen, die die Kommunikation mit dem Report Server behandeln:SSRS und Powershell: Parameter nicht akzeptiert

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

Dann habe ich ein Skript, das einen Bericht mit der finanziellen Quartalsdaten ausführt. Dieses Skript läuft gut:

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

Die Werte für $kwartaal und $kptc sind hartcodierte hier, aber sind Parameter in der aktuellen Version dieses Skripts. Neben dem vierteljährlichen Finanzbericht haben wir drei weitere Quartalsberichte, die von diesem Skript ausgegeben werden müssen. Zwei von diesen laufen gut, in der vierten kann ich nicht scheinen, einen der Parameter richtig zu bekommen. Das Skript für diese eine ist:

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

Wenn ich dieses Skript ausführen, bekomme ich diesen Fehler:

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. 

I DO eindeutig einen Wert für 'HoofdspecialismeSpecialismeOms' liefern; Ich habe vorher bemerkt, dass dieser Fehler auch ausgelöst wird, wenn der Parameter nicht im erwarteten Format ist. Dieses Format, da der Berichtsfilter auf einer Hierarchie in einem SSAS-Cube basiert, sieht folgendermaßen aus: [hierarchy].[sub-level].&[member]. Ich habe sichergestellt, dass [Hoofdspecialisme].[Specialisme Oms].&[$s] ist das richtige Format von nachschlagen in der Abfrage, die die Eingabeaufforderung in SSRS füllt. Der Bericht zeigt Daten an, wenn er über SSRS ausgeführt wird - und er nimmt einen Parameter von der Eingabeaufforderung.

Ich habe festgestellt, dass dieser Parameter Mehrfachauswahl ermöglicht. Ich glaube jedoch nicht, dass dies zu dem Fehler führt, da dies auch für AanvragendSpecialismeSpecialismeOms gilt.

Eine Idee, warum dieser eine Parameter nicht in den Bericht eingegeben werden kann, wenn er GetReportInformat aufruft?

+0

ich mit Powershell nicht gearbeitet haben viel, aber haben Sie versucht, ohne die zusätzlichen Räume zwischen den Parametern? Es ist durch Leerzeichen begrenzt. –

+0

@HannoverFist Ich habe gerade versucht, das Skript ohne die zusätzlichen Leerzeichen und Tabulatoren zwischen den Parametern '-name' und' -val' auszuführen, aber kein Glück. Ich bekomme immer noch den gleichen Fehler. Das Verschieben von 'HoofdspecialismeSpecialismeOms' in der Reihenfolge der Parameter ändert auch nichts. – steenbergh

+0

@Matt Sie haben Recht mit '$ q'. In meinem Skript ist das ein Parameter. Write-Host sagt mir, dass dies genau so gelöst wird, wie ich es möchte. Ich habe die Frage bearbeitet, um diesen Wert zu beheben. Das Skript hat eine Definition für "$ s", dies ist jedoch "Urologie". – steenbergh

Antwort

0

Ich habe es endlich herausgefunden: Die fehlgeschlagene Eingabeaufforderung hatte eine Mehrfachauswahl aktiviert. Und beim Ausfüllen eines Multiselects erwartet SSRS eine Liste von Werten.Wenn nur eine Zeichenfolge angegeben wird, wird die Zeichenfolge ignoriert und der Parameter wird als leer angenommen.

es eine Liste zu ernähren, tun wir müssen:

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

die Antwort dank dieser Frage gefunden: How to pass multiple value parameter to reporting services report via powershell

2

Haben Sie

versucht, die Datentypen explizit für Ihre Parameter
function AddParameter($params, $name, $val) 
{ 
    $par = New-Object RS.ParameterValue 
    $par.Name = $name 
    $par.Value = $val 
    $params += $par 
    return ,$params 
    #  ^Removing this comma? 
} 

Neben erklären?

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

Auch mit so vielen benutzerdefinierte Hilfefunktionen importierte Arten aufrufen, die einem Bericht Methoden und legen Sie die Eigenschaften nennen wir nicht sehen können, kann es ein wenig schwierig bekommen für diese spezielle in-Tiefe zu helfen, zu beheben Melden Sie einen Fehler an. Es sieht so aus, als hätten Sie versucht, die Zeile in der Reihenfolge zu verschieben, die für mich klingt, als hätten Sie ein Problem damit, wie dieser bestimmte Bericht die eingegebenen Werte durch RS.ParameterValue analysiert. Sehen Sie sich an, ob er die angegebene Zeichenfolge akzeptiert -val für Ihre benutzerdefinierte Funktion AddParameter.

Edit:

Von 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

This error is generated when you are attempting to run a report in which one or more of the data sources are set to "prompt" credentials. This means we do not use your Windows credentials automatically, but rather you need to supply a different set of credentials which are used only for the data source.

Klingt wie Sie beiseite das Skript setzen müssen könnte und prüfen, ob der Bericht unterscheidet.

+0

Das Komma in 'AddParameters' ist sehr notwendig. Ohne sie wird die Liste der Parameter nur in ihr erstes Element konvertiert und bei einem zweiten Durchlauf schlägt der Operator "+ =" fehl, da er für ein Objekt "RS.Parameter" nicht gültig ist. Außerdem ist die Datenquelle für die Abfrage, die Ho'dspecialismeSpecialismeOms verwendet (und füllt), genauso konfiguriert wie andere Quellen, die sowohl für diesen Bericht als auch für andere im Stapel verwendet werden. Anmeldeinformationen werden dem Report Server in der Funktion 'GetRSConnection' zur Verfügung gestellt. – steenbergh

Verwandte Themen