【问题标题】:Reporting parameter saving报告参数保存
【发布时间】:2015-04-14 10:08:35
【问题描述】:

在 SSRS 中,用户希望他的报表参数选择应该被记住。也就是说,用户第一次选择参数,下一次它应该记住参数。 有可能以任何方式实现这一目标吗?有人对此有任何想法吗?

【问题讨论】:

  • 您无法使用开箱即用的报表管理器 Web 界面执行此操作。我认为您必须创建一个自定义 Web 界面,该界面可以保持状态并将参数从那里传递给 SSRS。我建议查看 ASP.NET 的 ReportView 控件 - 这应该可以满足您的需要:msdn.microsoft.com/en-us/library/aa337090.aspx
  • 我会教您的用户有关订阅的知识。

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


【解决方案1】:

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

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

从存储用户报告参数值的表格开始。

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

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

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

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,您可以将它们的参数值保存在“销售报告”参数集中,而不必担心它们会相互干扰。此外,您可以轻松地在报表中创建两个单独的数据集,每个数据集都提取不同的参数集。例如,如果 PromoCode 实际上保存在“Marketing”参数集中,而 DepartmentId 来自 Products 参数集中。一旦你有了这个框架,你就可以在如何保存用户参数默认值方面有很大的灵活性。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      相关资源
      最近更新 更多