Skip to content

Commit 5b52b13

Browse files
authored
Merge pull request microsoft#186 from jzabroski/patch-4
Added support for passing in Report Parameters
2 parents 00f5a1b + 64384cd commit 5b52b13

File tree

1 file changed

+74
-14
lines changed

1 file changed

+74
-14
lines changed

ReportingServicesTools/Functions/CatalogItems/New-RsSubscription.ps1

Lines changed: 74 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2016 Microsoft Corporation. All Rights Reserved.
1+
# Copyright (c) 2016 Microsoft Corporation. All Rights Reserved.
22
# Licensed under the MIT License (MIT)
33

44
function New-RsSubscription
@@ -162,6 +162,11 @@ function New-RsSubscription
162162
[string]
163163
$Schedule,
164164

165+
[Parameter(Mandatory=$False)]
166+
[AllowNull()]
167+
[hashtable]
168+
$Parameters,
169+
165170
[Parameter(Mandatory=$True)]
166171
[ValidateSet('Email','FileShare')]
167172
[string]
@@ -254,7 +259,7 @@ function New-RsSubscription
254259
{
255260
'Email'
256261
{
257-
$Params = @{
262+
$ExtensionParams = @{
258263
TO = $To
259264
CC = $CC
260265
BCC = $BCC
@@ -269,7 +274,7 @@ function New-RsSubscription
269274
}
270275
'FileShare'
271276
{
272-
$Params = @{
277+
$ExtensionParams = @{
273278
PATH = $FileSharePath
274279
FILENAME = $Filename
275280
RENDER_FORMAT = $RenderFormat
@@ -278,31 +283,84 @@ function New-RsSubscription
278283

279284
if ($FileShareCredentials -ne $null)
280285
{
281-
$Params.USERNAME = $FileShareCredentials.UserName
282-
$Params.PASSWORD = $FileShareCredentials.GetNetworkCredential().Password
283-
$Params.DEFAULTCREDENTIALS = $false
286+
$ExtensionParams.USERNAME = $FileShareCredentials.UserName
287+
$ExtensionParams.PASSWORD = $FileShareCredentials.GetNetworkCredential().Password
288+
$ExtensionParams.DEFAULTCREDENTIALS = $false
284289
}
285290
else
286291
{
287-
$Params.DEFAULTCREDENTIALS = $true
292+
$ExtensionParams.DEFAULTCREDENTIALS = $true
288293
}
289294
}
290295
}
291296

292-
$ParameterValues = @()
293-
$Params.GetEnumerator() | ForEach-Object {
294-
$ParameterValues = $ParameterValues + (New-Object "$Namespace.ParameterValue" -Property @{ Name = $_.Name; Value = $_.Value })
297+
$ExtensionParameterValues = @()
298+
299+
$ExtensionParams.GetEnumerator() | ForEach-Object {
300+
$ExtensionParameterValues = $ExtensionParameterValues + (New-Object "$Namespace.ParameterValue" -Property @{ Name = $_.Name; Value = $_.Value })
295301
}
296302

297-
$ExtensionSettings = New-Object "$Namespace.ExtensionSettings" -Property @{ Extension = "Report Server $DeliveryMethod"; ParameterValues = $ParameterValues }
303+
$ExtensionSettings = New-Object "$Namespace.ExtensionSettings" -Property @{ Extension = "Report Server $DeliveryMethod"; ParameterValues = $ExtensionParameterValues }
298304

299305
$MatchData = $Schedule
300-
$ReportParameters = $Null
306+
307+
# Transform $Parameters to $ParameterValues
308+
if ($Parameters -ne $null)
309+
{
310+
$parametersCopy = @{};
311+
# First, remove null-valued keys - At some point between SQL Server 2005 and 2016 (probably 2012), null-valued keys are no longer stored in the database.
312+
# null-valued keys are now represented in the SOAP API by not passing in the null-valued parameter.
313+
foreach ($key in $Parameters.Keys)
314+
{
315+
if ($Parameters[$key] -ne $null)
316+
{
317+
$parametersCopy.Add($key, $Parameters[$key]);
318+
}
319+
}
320+
321+
$Parameters = $parametersCopy;
322+
323+
# Similarly, if we pass in an empty collection, the SOAP API will also be unhappy!
324+
# Empty collections must be mapped to $null
325+
if ($Parameters.Count -ne 0)
326+
{
327+
$ParameterValues = New-Object "$Namespace.ParameterValue[]" $Parameters.Count
328+
329+
$i = 0;
330+
foreach ($key in $Parameters.Keys)
331+
{
332+
$tmpValue = $Parameters[$key]
333+
334+
# If a key's value is $null or whitespace, skip it. SSRS SOAP API does not like it;
335+
# e.g., if a report parameter named 'date' was null,
336+
# it would throw an error message "Default value or value provided for the report parameter 'date' is not a valid value."
337+
if ([string]::IsNullOrWhiteSpace($tmpValue))
338+
{
339+
continue;
340+
}
341+
else
342+
{
343+
$tmpParameter = New-Object "$Namespace.ParameterValue" -Property @{ Name = $key; Value = $tmpValue }
344+
345+
$ParameterValues[$i] = $tmpParameter
346+
$i++;
347+
}
348+
}
349+
}
350+
else
351+
{
352+
$ParameterValues = $null;
353+
}
354+
}
355+
else
356+
{
357+
$ParameterValues = $null
358+
}
301359

302360
if ($PSCmdlet.ShouldProcess($RsItem, "Creating new subscription"))
303361
{
304362
Write-Verbose "Creating Subscription..."
305-
$subscriptionId = $Proxy.CreateSubscription($RsItem, $ExtensionSettings, $Description, $EventType, $MatchData, $ReportParameters)
363+
$subscriptionId = $Proxy.CreateSubscription($RsItem, $ExtensionSettings, $Description, $EventType, $MatchData, $ParameterValues)
306364

307365
[pscustomobject]@{
308366
NewSubscriptionId = $subscriptionId
@@ -313,7 +371,9 @@ function New-RsSubscription
313371
}
314372
catch
315373
{
316-
throw (New-Object System.Exception("Exception occurred while creating subscription! $($_.Exception.Message)", $_.Exception))
374+
$ex = $_.Exception;
375+
$ErrorMessage = $ex.Message;
376+
throw (New-Object System.Exception("Exception occurred while creating subscription! ErrorMessage: [$ErrorMessage]", $Exception))
317377
}
318378
}
319379
}

0 commit comments

Comments
 (0)