上报参数保存
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'
如您所见,您提供了 UserName
和 ParameterSet
值。与调用保存过程时使用的相同。不过,在这里,您还提供了一个字符串,它是一个简单的以逗号分隔的列名列表。数据透视查询使用这些列名称来确保您的结果集包含这些名称的列。您应该知道这些列可以并且将包含空值,尤其是当用户首次访问报表时。您还应该知道所有值都是 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
在 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'
如您所见,您提供了 UserName
和 ParameterSet
值。与调用保存过程时使用的相同。不过,在这里,您还提供了一个字符串,它是一个简单的以逗号分隔的列名列表。数据透视查询使用这些列名称来确保您的结果集包含这些名称的列。您应该知道这些列可以并且将包含空值,尤其是当用户首次访问报表时。您还应该知道所有值都是 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