标签:
如果我们安装了sqlserver2008 R2,将会自动安装一个报表开发工具
不要以为此报表开发工具只适合于sqlserver2008,其实在sqlserver2012中也是支持的,事实上我现在项目中就是使用的sqlserver2012。
使用此工具进行报表开发,将会十分快速而且方便。这里我通过一个综合实例来演示它的使用技巧,可以毫不夸张的说,如果你能使用此工具把这个Demo做出来,那么工作中遇到的80%报表,你都能够使用此工具进行开发了。
先来看下我们要实现的效果:
报表中使用到的表及字段:
- <span style="font-family:宋体;">
-
-
-
好了,现在正式开始
从效果图上面可以看出,此报表,我们使用到了两张表来展示,而且这里是使用到了两个数据集,但是他们的查询条件是一致的。
我们先来看上面那张表的展示
我们来看SQL:
- declare @begin_date datetime
- declare @end_date datetime
- select @begin_date = getdate()
-
- declare @BusinessunitId uniqueidentifier
- DECLARE @TeamId uniqueidentifier
- DECLARE @StarDate datetime
- DECLARE @EndDate datetime
- SET @StarDate = convert(datetime,‘2015-01-15 00:00:00‘,20)
- SET @EndDate = convert(datetime,‘2015-01-25 23:59:59‘,20)
- DECLARE @sHMS nvarchar(10)
- DECLARE @eHMS nvarchar(10)
- SET @sHMS=‘00:00:00‘;
- SET @eHMS=‘23:59:59‘;
- DECLARE @ZoneNO varchar(30)
-
- DECLARE @strSDate nvarchar(50),@strEDate nvarchar(50)
- DECLARE @StartDateTime datetime,@EndDateTime datetime
- SET @strSDate=CONVERT(varchar, @StarDate, 23)+‘ ‘+@sHMS
- SET @strEDate=CONVERT(varchar, @EndDate, 23)+‘ ‘+@eHMS
- SET @StartDateTime=convert(datetime,@strSDate,20)
- SET @EndDateTime=convert(datetime,@strEDate,20)
- select
- 1 WaterMeterCount,
- w.hx_fpayamount,
- w.hx_fprepayment,
- w.hx_fpreproxypayment,
- c.hx_fname
- from
- hx_t_waterusedamount w
- INNER JOIN hx_t_teamattribution n
- ON w.OwningTeam=n.hx_fteamid
- AND isnull(w.hx_fzone,‘‘) = isnull(isnull(@ZoneNO,w.hx_fzone),‘‘)
- AND isnull(w.OwningTeam,‘00000000-0000-0000-0000-000000000000‘) = isnull(isnull(@TeamId,w.OwningTeam),‘00000000-0000-0000-0000-000000000000‘)
- AND w.hx_fpayamount>0
- AND w.hx_frecorddate BETWEEN @StartDateTime AND @EndDateTime
- AND isnull(n.hx_flevyinstituteid,‘00000000-0000-0000-0000-000000000000‘) = isnull(isnull(@BusinessunitId,n.hx_flevyinstituteid),
- ‘00000000-0000-0000-0000-000000000000‘)
- LEFT JOIN hx_t_waterproperty p
- on w.hx_FWaterPropertyID=p.hx_t_WaterPropertyId
- LEFT JOIN hx_t_watercategory c
- on p.hx_FWaterCategoryID=c.hx_t_WaterCategoryId
-
- select @end_date = getdate()
- select datediff(ms,@begin_date,@end_date) as ‘用时/毫秒‘
执行结果如下:
可以看出这是十分常见的纵表变横表了,如果使用纯sql来实现转换效果的话,就有得写一连串复杂的sql语句了,但是通过使用此报表开发工具,我们可以轻而易举的将其纵向显示结果变为横向显示结果。
操作步骤如下:
1、打开此报表开发工具,文件——新建——项目
2、右键单击右侧解决方案中的报表目录,然后一直下一步,
但是考虑到矩阵的界面配置甚为反锁,这里我们先选择表格吧,然后一直点击下一步,直到完成
1、把界面上面的表格删掉,然后从左侧工具栏拖入一个矩阵,
选中“数据”单元格,右键——插入行——组内部——下方,添加4行,然后右键——插入列——组外部(因为要统计合计)
列这个地方,选择hx_fname这个字段,从sql中可以看到hx_fname这个字段是我们需要转换为横表展示的字段,然后数据这里,选中要聚合的字段。
右侧报表数据,
这里自动生成了许多参数,这些参数是因为我们刚才添加的SQL语句里面用到了,注意看名称,和我们刚才声明的SQL语句是一样的。
选中属性,右键单击,可以查看参数的配置信息
这些东西大家多去点一下,自然就熟悉了,涉及的东西太多了,我一下子也说不完。
这里有两个参数是有级联关系的,我就先说下
我们来看下这两个参数的配置,这两个参数都是以下拉框的形式显示的,而且值都是取自数据库中。
先看参数:BusinessunitId
这个数据集哪里来的?我们可以自己添加
再来看下参数:TeamId
右键单击空白处——创建占位符
批量修改可以直接通过这里进行修改,
否则,只能一个文本框一个文本框属性进行修改了。#代表千分位显示,后面的数字代码保留小数位数,0代表整数
数量/水量:#,0
单价:0.00
金额:#,0.00
报表中下面那个程序集的操作类似,这里就不多说了,东西太多了。
SQL如下:
- DECLARE @strSDate nvarchar(50),@strEDate nvarchar(50)
- DECLARE @StartDateTime datetime,@EndDateTime datetime
- SET @strSDate=CONVERT(varchar, @StarDate, 23)+‘ ‘+@sHMS
- SET @strEDate=CONVERT(varchar, @EndDate, 23)+‘ ‘+@eHMS
- SET @StartDateTime=convert(datetime,@strSDate,20)
- SET @EndDateTime=convert(datetime,@strEDate,20)
- if object_id(‘tempdb..#t_estimateamountreason‘) is not null drop table #t_estimateamountreason
-
- select * into #t_estimateamountreason from
- (select distinct t1.Label,t2.Value from MetadataSchema.LocalizedLabel t1
- inner join MetadataSchema.AttributePicklistValue t2
- on t1.ObjectId=t2.AttributePicklistValueId inner join MetadataSchema.OptionSet t3 on t2.OptionSetId=t3.OptionSetId
- where t3.Name=‘hx_estimateamountreason_values‘ and t1.ObjectColumnName=‘DisplayName‘ and t1.LanguageId=2052) t
-
- select
- 1 MeterCounts,
- isnull(e.Label,‘其它‘) ReasonName
- from hx_t_waterusedamount w
- INNER JOIN hx_t_teamattribution n
- ON w.OwningTeam=n.hx_fteamid
- AND isnull(w.hx_fzone,‘‘) = isnull(isnull(@ZoneNO,w.hx_fzone),‘‘)
- AND isnull(w.OwningTeam,‘00000000-0000-0000-0000-000000000000‘) = isnull(isnull(@TeamId,w.OwningTeam),‘00000000-0000-0000-0000-000000000000‘)
- AND w.hx_fpayamount=0
- AND w.hx_frecorddate BETWEEN @StartDateTime AND @EndDateTime
- AND isnull(n.hx_flevyinstituteid,‘00000000-0000-0000-0000-000000000000‘) = isnull(isnull(@BusinessunitId,n.hx_flevyinstituteid),
- ‘00000000-0000-0000-0000-000000000000‘)
- LEFT JOIN #t_estimateamountreason e
- ON e.Value=w.hx_festimateamountreason
-
- UNION ALL
- select 1 MeterCounts,e.Label ReasonName from #t_estimateamountreason e
-
- if object_id(‘tempdb..#t_estimateamountreason‘) is not null drop table #t_estimateamountreason
ReportingServies——SQLServer报表开发综合实例
标签:
原文地址:http://www.cnblogs.com/jiekzou/p/4395768.html