2016-03-22 12 views
10

Uso Powershell per eseguire diversi report su Microsoft SQL Report Services e per salvare i risultati in un documento Word. Ho uno script con le funzioni che gestiscono le comunicazioni con il server di report:SSRS e PowerShell: Parametro non accettato

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

allora, ho uno script che esegue un report contenente i dati trimestrali finanziari. Questo script funziona benissimo:

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

I valori per $kwartaal e $kptc sono hard-coded qui, ma sono parametri nella versione attuale di questo script. Oltre al trimestre finanziario, abbiamo altri tre rapporti trimestrali che devono essere pubblicati da questo script. Due di questi funzionano bene, nel quarto non riesco a ottenere uno dei parametri corretti. Lo script per quello è:

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

Quando eseguo questo script, ottengo questo errore:

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. 

FACCIO chiaramente fornire un valore per 'HoofdspecialismeSpecialismeOms'; In precedenza ho notato che questo errore viene generato anche quando il parametro non è nel formato previsto. Questo formato, dal momento che il filtro del report si basa su una gerarchia in un cubo SSAS, ha il seguente aspetto: [hierarchy].[sub-level].&[member]. Ho assicurato che [Hoofdspecialisme].[Specialisme Oms].&[$s] sia il formato corretto da verificandolo nella query che popola il prompt in SSRS. Il report mostra i dati quando viene eseguito tramite SSRS e prende un parametro dal prompt.

Ho notato che questo parametro consente la selezione multipla. Tuttavia, non credo che ciò porti all'errore, perché ciò vale anche per AanvragendSpecialismeSpecialismeOms.

Qualche idea sul perché questo parametro non viene inserito nel rapporto quando si chiama GetReportInformat?

+0

Non ho lavorato molto con Powershell, ma avete provato senza gli spazi aggiuntivi tra i parametri? È spazio delimitato. –

+0

@HannoverFist Ho appena provato a eseguire lo script senza gli spazi e le schede aggiuntivi tra i parametri '-name' e' -val', ma senza fortuna. Ho ancora lo stesso errore. Lo spostamento di 'HoofdspecialismeSpecialismeOms' nell'ordine dei parametri non cambia nulla. – steenbergh

+0

@Matt Hai ragione su '$ q'. Nel mio script, questo è un parametro. Write-Host mi dice che questo viene risolto esattamente come voglio. Ho modificato la domanda per correggere questo valore. Lo script ha una definizione per '$ s', tuttavia, questo è" Urologie ". – steenbergh

risposta

0

Finalmente ho capito: il prompt di errore aveva una selezione multipla abilitata. E quando si riempie una selezione multipla, SSRS si aspetta un elenco di valori.Quando viene fornita una sola stringa, la stringa viene ignorata e il parametro viene assunto in bianco.

di dargli da mangiare una lista, dobbiamo fare:

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

trovato la risposta grazie a questa domanda: How to pass multiple value parameter to reporting services report via powershell

2

Hai provato

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

Così come dichiarare i tipi di dati in modo esplicito per i parametri?

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

Inoltre, con tante funzioni di aiuto definite dall'utente chiamando tipi importati che chiamano i metodi e impostare le proprietà di un rapporto che non possiamo vedere, si può ottenere un po 'difficile per aiutare a risolvere in modo approfondito per questa specifica segnala che stai ricevendo un errore. Sembra che tu abbia provato a spostare la linea nell'ordine che suona come se tu potessi avere un problema con il modo in cui quel report specifico analizza i valori che inserisci attraverso RS.ParameterValue, quindi dai un'occhiata se accetta la stringa che hai impostato -val per la funzione definita dall'utente AddParameter.

Edit:

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

Suona come potrebbe essere necessario mettere da parte la sceneggiatura e verificare se il rapporto è diverso.

+0

La virgola in "AddParameters" è molto necessaria. Senza di esso, l'elenco dei parametri viene convertito solo nel suo primo elemento e su un secondo passaggio l'operatore '+ =' fallisce perché non è valido per un oggetto 'RS.Parameter'. Inoltre, l'origine dati per la query che utilizza (e riempie) 'HoofdspecialismeSpecialismeOms' è configurata come le altre fonti utilizzate su questo report e su altri nel batch. Le credenziali vengono fornite al server di report nella funzione 'GetRSConnection'. – steenbergh

Problemi correlati