上报参数保存

Reporting parameter saving

在 SSRS 中,用户希望他的报告参数 selection 应该是 remembered.That 是第一次用户将 select 参数并且不知何故下次它应该记住参数。 有可能以任何方式实现这一目标吗?有人对此有任何想法吗?

“我的报告”功能允许用户在服务器上构建和保存自己的报告。它还允许他们创建链接的报告,这些报告的参数默认值设置为他们想要的方式。这是唯一可以满足您需求的内置功能。不过,老实说,它非常有限。

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

从 table 开始存储您的用户报告参数值。

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

由于您正在寻找一种方法来存储用户的参数值,我假设您在报告服务上使用了某种身份验证,例如 Windows 身份验证。我们将存储该身份验证服务提供的 UserName 以及任意命名的 ParameterSet。此 ParameterSet 值可以是报告的 url 或报告的其他一些唯一标识符,或者可能是一组报告的逻辑名称,这些报告都使用 "Sales Reports" 等通用参数。

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

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

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

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

请注意 table 将所有内容存储为 nvarchar。我在这里很懒,让隐式转换发生。如果要以特定格式存储 datetime 等值,则需要在将它们插入 table 变量时进行转换。此处及以下使用的 @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,您可以将它们的参数值都保存在 'Sales Reports' 参数集中,而不必担心它们会相互干扰.此外,您可以轻松地在报告中创建两个独立的数据集,每个数据集提取不同的参数集。例如,如果 PromoCode 实际上保存在 'Marketing' 参数集中,而 DepartmentId 来自 Products 参数集。有了这个框架后,您就可以非常灵活地保存用户参数默认值。

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

可扩展性 -- 这对于相对较少用户的少量报告非常有用。在大型企业环境中很容易出现性能问题。 (这就是为什么我在开始时将其称为 "rudimentary example"。)您可以通过重新设计值存储机制来解决这个问题。例如,为每个参数集使用预定义的 tables 而不是将它们全部转储到单个 table 中,这样您就可以避免旋转。我会把这个决定留给你。

试试这个。有点长,我就把文档link附在这里。 Report Parameter Saving Solution