2016-03-22 11 views
10

Używam Powershell do uruchamiania kilku raportów o usługach Microsoft SQL Report Services i zapisywania wyników w dokumencie Word. Mam skrypt z funkcjami, które obsługują komunikację z serwerem raportu:SSRS i powershell: Parametr nie zaakceptowany

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

Następnie Mam skrypt, który wykonuje raport zawierający dane finansowe kwartalnych. Ten skrypt działa poprawnie:

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

Wartości $kwartaal i $kptc są zakodowane tutaj, ale są parametry w aktualnej wersji tego skryptu. Oprócz kwartału finansowego dysponujemy trzema innymi raportami kwartalnymi, które muszą być wyprowadzane przez ten skrypt. Dwa z nich działają dobrze, w czwartym nie mogę uzyskać jednego z parametrów poprawnie. Skrypt dla że jeden jest:

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

Kiedy wykonać ten skrypt, dostaję ten błąd:

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. 

wyraźnie podasz wartość „HoofdspecialismeSpecialismeOms”; Wcześniej zauważyłem, że ten błąd jest również zgłaszany, gdy parametr nie jest w oczekiwanym formacie. Ten format, ponieważ filtr raportu opiera się na hierarchii w kostce SSAS, wygląda następująco: [hierarchy].[sub-level].&[member]. Upewniłem się, że [Hoofdspecialisme].[Specialisme Oms].&[$s] jest prawidłowym formatem przez szukając go w zapytaniu, które wypełnia monit w SSRS. Raport wyświetla dane po uruchomieniu przez SSRS - i biorąc parametr z monitu.

Zauważyłem, że ten parametr umożliwia wielokrotny wybór. Jednak nie uważam, że prowadzi to do błędu, ponieważ jest to również prawdą w przypadku AanvragendSpecialismeSpecialismeOms.

Każdy pomysł, dlaczego ten jeden parametr nie zostanie wprowadzony do raportu po wywołaniu GetReportInformat?

+0

Nie pracuję dużo z PowerShell ale próbowałeś bez spacji między parametrami? Jest on ograniczony przestrzenią. –

+0

@HannoverFist Właśnie próbowałem uruchomić skrypt bez dodatkowych spacji i kart między parametrami "-name" i "-val", ale bez powodzenia. Wciąż dostaję ten sam błąd. Przenoszenie 'HoofdspecialismeSpecialismeOms' w kolejności parametrów nic nie zmienia. – steenbergh

+0

@Matt Masz rację co do '$ q'. W moim skrypcie jest to parametr. Write-Host mówi mi, że to rozwiązuje się dokładnie tak, jak tego chcę. Zmodyfikowałem pytanie, by naprawić tę wartość. Skrypt ma definicję '$ s', ale jest to" Urologie ". – steenbergh

Odpowiedz

0

W końcu to rozgryzłem: W odpowiedzi na monit o niepowodzenie włączono opcję wielokrotnego wyboru. A podczas wypełniania wielokrotnego wyboru, SSRS oczekuje listy wartości.Gdy podany jest tylko jeden ciąg, łańcuch jest ignorowany, a parametr przyjmuje się jako pusty.

doprowadzania go do listy, musimy zrobić:

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

znaleźć odpowiedź na to pytanie dzięki: How to pass multiple value parameter to reporting services report via powershell

2

Czy próbowałeś

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

Jak również deklarowania typów danych bezpośrednio do swoich parametrów?

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

Również z tylu funkcje pomocnicze definiowane przez użytkownika nazywając importowane typy, które wywołują metody i ustawić właściwości raportu nie możemy zobaczyć, to może być trochę trudne do rozwiązywania pogłębione na ten specyficzny zgłoś, że pojawia się błąd. Wygląda na to, że próbowałeś przesuwać linię w kolejności, która brzmi dla mnie tak, jakbyś miał problem z tym, jak ten raport analizuje wartości, które wprowadzasz przez RS.ParameterValue, więc może przyjrzyj się, czy akceptuje ciąg ustawiony w -val dla Twojej zdefiniowanej przez użytkownika funkcji AddParameter.

Edit:

Od 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.

Brzmi jak może trzeba odłożyć scenariusz i sprawdzić, czy raport jest inny.

+0

Przecinek w 'AddParameters' jest bardzo potrzebny. Bez niego lista parametrów jest konwertowana na pierwszy tylko element, a w drugim przebiegu operator '+ =' nie działa, ponieważ nie jest prawidłowy dla obiektu 'RS.Parameter'. Źródło danych dla zapytania wykorzystującego (i wypełniającego) 'HoofdspecialismeSpecialismeOms' jest skonfigurowane tak samo, jak inne źródła używane zarówno w tym raporcie, jak i innych w partii. Poświadczenia są dostarczane do serwera raportów w funkcji 'GetRSConnection'. – steenbergh

Powiązane problemy