引言
今天一位朋友问到这样一样问题:SSRS报表如何统计报表的访问次数。愣过之后,细想一下,从开发的角度来审视这个问题。无非就是需要一个地方能够存储表示当前报表的变量和已访次数。每次用户访问的时候给这个变量的次数加1.从报表的生命周期来看,数据集是一个可以下手的地方。另外对SSRS自身数据库熟悉的同学,肯定不难想到报表的执行日志。
值得注意的是,以下两种方式,在刷新报表的时候,将是两次访问。对这个有要求的同学,那就需要另辟蹊径喽。
存储过程实现
step1、创建访问次数统计表
create table rs_access_times
(
id int identity(1,1) primary key, --主键
rt_name nvarchar(200) not null, --报表名称
access_times int default(0) --访问次数
)
go
step2、创建次数累加存储过程
create proc up_total_access_times
(
@rt_name nvarchar(200) --报表名称
)
as
begin
--第一次访问,初始化一条记录
if not exists(select * from rs_access_times where rt_name = @rt_name)
begin
insert into rs_access_times(rt_name,access_times) values(@rt_name,0)
end
--更新次数
update rs_access_times set access_times = access_times + 1 where rt_name = @rt_name
--返回最新次数
select access_times from rs_access_times where rt_name = @rt_name
end
go
step3、创建访问次数数据集
step4、呈现访问次数
添加页脚-右键“插入文本框”-添加“占位符”-表达式 =访问次数
每刷新一次,次数+1。
数据库的信息大家也可以看下
执行日志实现
通过执行日志实现,其实就省去了我们的步骤1和2.但是有几个问题大家要注意下:
1、我需要能够访问报表服务的数据库权限
2、需要在报表中添加报表数据库的链接
3、我们需要先认识一下执行日志表结构
Catalog 目录表 ItemID字段为主键GUID, Name字段为名称,用来存储报表文件夹、数据源、数据集、报表等的名称。
ExecutionLogStorage 执行日志表 ReportID字段为Catalog表ItemID表外键(逻辑),每刷新一次,生成一条新数据。
4、注意,在设计阶段预览报表是不会在这个数据库生成数据的,要发布之后看效果
清楚以上信息,我们就可以实现功能了,思路就是关联两个表,统计执行次数。(其他字段暂可不必了解)
step1、创建报表数据库链接
相信大家都会,在此不复述。
step2、创建访问次数数据集
select count(*)
from ExecutionLogStorage els
join Catalog c on els.ReportID = c.ItemID
where c.Name = @rt_name
其他配置,参见第一种方式即可。