在 SSRS 中,用户希望他的报表参数选择应该被记住。这是用户第一次选择参数,下次它应该以某种方式记住参数。 是否有可能以任何方式实现这一目标?有人对此有什么想法吗?
"我的报告"功能允许用户在服务器上构建和保存自己的报告。它还允许他们创建具有参数默认值的链接报表,以他们想要的方式进行设置。这是唯一可能得到你想要的内置功能。不过,老实说,这是非常有限的。
另一方面,您可以构建自己的用户参数存储功能。这是一个基本的例子。
从用于存储用户报表参数值的表开始。
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'
如您所见,您提供了UserName
和ParameterSet
值。与调用保存过程时使用的相同。但是,在这里,您还提供了一个简单的字符串,该字符串是一个简单的逗号分隔的列名列表。透视查询使用这些列名,以确保结果集包含按这些名称排列的列。您应该知道这些列可以并且将包含空值,尤其是在用户首次访问报表时。您还应该知道,所有值都nvarchar(max)
。如果需要分析或转换任何值,或者在值为 null 时提供自己的默认值,则需要执行一些额外的工作。
在名为UserReportParameters
的嵌入式数据集中,我调用该过程,在本地存储值,然后根据需要进行转换和 null 交换。
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
实际上保存在"营销"参数集中,而DepartmentId
来自Products
参数集。拥有此框架后,在如何保存用户参数默认值方面具有很大的灵活性。
允许报表更改数据通常被认为是不好的做法。当涉及到领域数据时,我同意这种传统智慧。但是,此参数保存功能实际上更像是 SSRS 功能的扩展,类似于报表执行日志记录。我不认为这违反了这一原则。
可伸缩性 - 这对于相对较少的用户的少量报表非常有用。在大型企业环境中很容易出现性能问题。(这就是为什么我在一开始就称这是一个"基本的例子"。您可以通过重新设计价值存储机制来解决此问题。例如,为每个参数集使用预定义的表,而不是将它们全部转储到单个表中,这样就可以避免透视。我会把这个决定和工作留给你。
试试这个。有点长,我在这里附上文档链接。 报表参数保存解决方案