动态列报表

        由于在项目中需要用到动态列,类似下图效果,其中列和行都是动态产生的.起初接到这个要求,觉得有点难度,但有问题了应该迎难而上,在仔细研究及细细摸索下,却发现也不会太难,现写下此博客,希望对有此需要的朋友起到一定的帮助.

  2014-06-01 2014-06-02 2014-06-03 2014-06-04 2014-06-05 2014-06-06 2014-06-07 2014-06-08 2014-06-09
  12:37 8.00 08:03 4.00 08:06 2.00 08:07 2.00 08:00 2.00 08:10 2.00 07:59 2.00 08:03 4.00 08:01 2.00
      12:38 5.00 12:32 8.00 12:36 8.00 12:32 8.00 12:37 8.00 08:11 3.80 12:33 5.00 08:10 10.30
                      12:48 7.00 12:31 8.00 12:43 7.00 12:35 5.00
日消费   8.00   9.00   10.00   10.00   10.00   17.00   13.80   16.00   17.30

 由于以前做过水晶报表和SSRS报表,个人认为此种情况下还是SSRS报表做起来比较方便. 但想到提出要求的数据存储在SQL2000服务器上,这里又存在一个问题,就是如何给分组编一个行号. 但办法总比问题多.努力了总会有收获.现将代码帖下,当然,如果是SQL2005或以后的版本用 row_number() over (partition by xxx order by kkkk) 就方便多得多了.以下是该项目涉及到的SQL代码.

Create table #AllData
(
RID int identity(1,1),
CDate varchar(10) not null,
ConsumeTime varchar(5) not null,
CardNo varchar(10),
Suser varchar(7),
Name varchar(20),
Dept varchar(40),
ConsumeSum money,
Balance money,
ByWho varchar(10)
)
insert into #AllData 
(CDate,ConsumeTime,CardNo,Suser,Name,Dept,ConsumeSum,Balance,ByWho)
select
convert(varchar(10),FEE.消费时间,121),
convert(varchar(5),FEE.消费时间,108),FEE.卡号,FEE.工号,SUSER.姓名,SUSER.部门,FEE.消费金额,FEE.卡上余额,FEE.经手人
FROM 收费表 FEE with (nolock),发行表 SUSER with (nolock)
WHERE FEE.卡号=SUSER.卡号 AND
FEE.工号=SUSER.工号    AND
(SUSER.工号 between @SUSER1 and @SUSER2    ) AND
(FEE.消费时间 BETWEEN @dt1  AND @dt2)    AND
FEE.消费金额<>0
ORDER BY SUSER.部门,SUSER.工号,FEE.消费时间

-- 以下这里是sql2000实现分组行号的办法,请记住
-- 
select (select count(*) from #AllData as b where a.CDate=b.CDate and a.RID>=b.RID) AS GRID, a.*
from #AllData as a

然后就是在SSRS中设计此报表,SSRS其实还有很多高级功能可以丰富报表,体高用户体验. 在这里就不在赘述,现帖出设计图案.以下箭头所指地方需要多多留意.

只要按这种形式设计相应字段栏位即可. 这里设置单笔超过10块,日消费超过12块则改变数字显示颜色.下图是效果图.

然后可以设计订阅此报表,每天定时运行发送到相应的人的邮箱中去.

 

配置图,以及发到邮箱结果.

 

posted @ 2014-06-19 22:37  朱洪亮  阅读(1343)  评论(1编辑  收藏  举报