报告参数保存

时间:2015-04-14 10:08:36

标签: reporting-services ssrs-2008-r2 ssrs-2012

在SSRS中,用户希望记住他的报告参数选择。这是第一次用户将选择参数,并且下次以某种方式它应该记住参数。 是否有可能以任何方式实现这一目标?有没有人想过这个?

2 个答案:

答案 0 :(得分:0)

“我的报告”功能允许用户在服务器上构建和保存自己的报告。它还允许他们创建链接报告,其参数默认设置按照他们想要的方式设置。这是唯一可以为您提供所需内置功能的内置功能。不过,说实话,这是相当有限的。

另一方面,您可以构建自己的用户参数存储功能。这是一个基本的例子。

从表开始,以存储用户报告参数值。

create table UserReportParameters (
    UserName nvarchar(50),
    ParameterSet nvarchar(50),
    ParameterName nvarchar(50),
    ParameterValue nvarchar(max)
)

由于您正在寻找存储用户参数值的方法,因此我假设您在报告服务上使用某种身份验证,例如Windows身份验证。我们将存储该身份验证服务提供的UserName以及任意命名的ParameterSet。此ParameterSet值可以是报告的URL或报告的其他唯一标识符,也可以是一组报告的逻辑名称,这些报告都使用常见参数,例如&#34;销售报告&#34;。< / p>

我们需要一种方法来保存这些参数值。一个简单的存储过程就可以解决问题。

create proc SaveUserReportParameter (
    @UserName nvarchar(50),
    @ParameterSet nvarchar(50),
    @ParameterName nvarchar(50),
    @ParameterValue nvarchar(max)
)
as
    delete UserReportParameters where UserName = @UserName and ParameterSet = @ParameterSet and ParameterName = @ParameterName
    insert UserReportParameters select @UserName, @ParameterSet, @ParameterName, @ParameterValue

现在,在您的报告的主数据集查询或存储过程中(您可以确保每个报告执行时代码运行一次),您只需要调用该存储过程来存储每个值。

exec SaveUserReportParameter @UserName, 'Sales Reports', 'StartDate', @StartDate
exec SaveUserReportParameter @UserName, 'Sales Reports', 'EndDate', @EndDate
exec SaveUserReportParameter @UserName, 'Sales Reports', 'DepartmentId', @DepartmentId
exec SaveUserReportParameter @UserName, 'Sales Reports', 'PromoCode', @PromoCode

请注意,该表将所有内容存储为nvarchar。我在这里懒惰,让隐性转换发生。如果要以特定格式存储datetime等值,则在将它们插入表变量时需要转换它们。此处和下方使用的@UserName报表参数应为内部参数,其默认值为=User!UserId

现在我们要存储参数,让我们开始使用它们。我们需要另一个存储过程。这个有点大。

create proc GetUserReportParameters (
    @UserName nvarchar(50),
    @ParameterSet nvarchar(50),
    @Columns nvarchar(max)
) as

    declare @sql nvarchar(max)

    set @sql = '
    select * from
    (
        select
            p.ParameterName,
            p.ParameterValue
        from
            (select @UserName UserName, @ParameterSet ParameterSet) stub
            left join UserReportParameters p on p.UserName = stub.UserName and p.ParameterSet = stub.ParameterSet
    ) v
    pivot (
        min(ParameterValue)
        for ParameterName in (' + @Columns + ')
    ) as pvt'

    exec sp_executesql @sql, N'@UserName nvarchar(50), @ParameterSet nvarchar(50)', @UserName, @ParameterSet

然后称之为

exec GetUserReportParameters @UserName, 'Sales Reports', 'StartDate,EndDate,DepartmentId,PromoCode'

如您所见,您提供了UserNameParameterSet值。与调用保存过程时使用的相同。但是,在这里,您还提供了一个字符串,它是一个简单的逗号分隔的列名列表。这些列名称由数据透视查询使用,以确保您的结果集包含这些名称的列。您应该知道这些列可以并且将包含空值,尤其是在用户首次访问报表时。您还应该知道所有值都是nvarchar(max)。如果您需要解析或转换任何值或在值为null时提供自己的默认值,则需要做一些额外的工作。

在名为UserReportParameters的嵌入式数据集中,我调用过程,在本地存储值,然后根据需要进行转换和空值交换。

declare @Parameters table (
    StartDate datetime,
    EndDate datetime,
    DepartmentId int,
    PromoCode nvarchar(50)
)

insert @Parameters
exec GetUserReportParameters @UserName, 'Sales Reports', 'StartDate,EndDate,DepartmentId,PromoCode'

select 
    isnull(cast(StartDate as datetime), dateadd(day,datediff(day,0,getdate()),0)) StartDate,
    isnull(cast(EndDate as datetime), dateadd(day,datediff(day,0,getdate()),0)) EndDate,
    isnull(cast(DepartmentId as int),15) DepartmentId,
    isnull(PromoCode,'FAKESALE') PromoCode
from @Parameters

现在,每次运行报告(更具体地说,每次执行包含对保存过程的调用的数据集)时,都会保存您选择保存的参数。当您离开并返回报告页面时,参数将填充您选择的最后一个值。请注意,您不必保存每个参数值。只是你想为每个用户保存的那些。您也不必使用在给定ParameterSet中保存的每个参数值。如果您有两个销售报告,一个使用PromoCode,另一个使用ProductCategory,则可以将其参数值保存在&#39;销售报告&#39;参数集无需担心它们会相互干扰。此外,您可以在报表中轻松创建两个单独的数据集,每个数据集都会提取不同的参数集。例如,如果PromoCode实际上保存在&#39;营销&#39;参数集和DepartmentId来自Products参数集。拥有此框架后,您可以在保存用户参数默认值方面具有很大的灵活性。

通常认为允许报告更改数据是不好的做法。在域数据方面,我同意这种传统观点。但是,此参数保存功能实际上更像是SSRS功能的扩展,类似于报告执行日志记录。我不相信它违反了原则。

可扩展性 - 这对于少数用户的少量报告非常有用。在较大的企业环境中很容易出现性能问题。 (这就是为什么我在开始时称之为&#34;基本的例子&#34;)你可以通过重新设计价值存储机制来解决这个问题。例如,为每个参数集使用预定义的表,而不是将它们全部转储到单个表中,这样就可以避免转动。我会离开这个决定并为你工作。

答案 1 :(得分:0)

试试这个。这有点长,我会在这里附上文档链接。 Report Parameter Saving Solution