server report 经典

Reporting Services技巧总结

1、 报表显示行号

(1)、设置需要展示行号的单元格的表达式内容为:=RowNumber(nothing),注意:nothing表示数据集或组,这里的nothing是数据集的默认值。

(2)、设置需要展示行号的单元格的表达式内容为:=RunningValue(1,sum,nothing),注意:nothing表示数据集或组,这里的nothing是数据集的默认值。

(3)、使用报表自定义代码:

dim count as integer

function ShowNumber()

  count+=1

  return count

end function

在需要展示行号的单元格的表达式内容为:=code.showNumber()

2、 明细行交替背景色

如下方法都可以实现上图效果:

(1)、选中明细行,在属性页签中的BackGroundColor属性中设置表达式:=iif(RowNumber(nothing) mod 2 =0,"LightGrey","White")

(2)、选中明细行,在属性页签中的BackGroundColor属性中设置表达式:=iif(RunningValue(1,sum,nothing) mod 2 =0,"LightGrey","White")

 

3、无查询结果时给予友好提示

 

选中整个table,在属性页签中的norow属性中输入提示的字符串:="没有查找到符合过滤条件的记录!"。

 

2、SSRS 2008引用自定义程序集

在SSRS中处理复杂的业务逻辑,除可以使用报表自定义代码外,另外也可以引用自定义程序集来实现,自定义程序集的功能更强大,也可以用于处理更为复杂的业务逻辑,而且可以使用多种语言来编写动态链接库文件(dll),不仅仅限于VB语言。

    若要在SSRS中引用自定义程序集,首先需要准备事先编写好的DLL文件,将DLL文件拷贝到2个地方,(1)、类似:D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies文件夹。拷贝到此处主要是用于在VS设计环境中,可以调用DLL文件进行预览。(2)、类似:C:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services\ReportServer\bin文件夹。拷贝到此处主要是用于报表在服务器上展示时调用DLL文件。准备好DLL文件后,再在VS报表设计界面,依次点击菜单报表/报表属性,在报表属性窗口,点击左侧“引用”按钮,然后可在右侧维护自定义程序集。首先点击“添加”按钮,然后点击右侧的“…”按钮,浏览到前面(2)处拷贝的DLL文件,将其引用到当前报表中。操作示意图如下:

浏览到前面(2)处拷贝的DLL文件,将其引用到当前报表中。操作示意图如下: 

引用DLL文件 

程序集添加好后的截图

 将自定义程序集引用进报表后,就可以在报表上引用使用,比如在某个文本框上使用的话,只要在文本框的表达式窗口中按如下格式进行引用DLL文件的功能即可:=ClassLibraryName.ClassName.MethodName or Namespace.ClassName.MethodName。

 

3、SSRS 2008交互式排序

在日常使用报表的过程中,用户经常按需的进行报表列排序,此时若通过在SQL脚本中实现排序,将只有一个固定的排序方式,不能实现动态的实时的按需排序,在SSRS 2008中可利用“交互式排序”这个功能,快速方便的实现动态排序。

1、效果图: 

 

2、数据集SQL脚本:select logid,u_name,lg_sign from secuser

3、关键开发步骤(1)、在设计界面,数据集的数据字段拖放至表格控件中。(2)、在设计界面,选中待排序的单元格→文本框属性,在文本框属性对话框,切换至交互式排序页,勾选“对此文本框启用交互式排序”,然后选择排序内容、设置排序依据。

 

    (3)、按上述步骤,依次对各需要进行排序的列设置其交互式排序属性。

 

4、提示:(1)、支持交货式排序的报表列在展示时,列的右边有个上下箭头,用户点击这种列后,报表将进行排序。(2)、查看报表时,若想多列一起排序,可先点击第一排序列,然后按住Shift键,再点击其它排列,报表将会根据这些指定的列依次进行排序。

4、SSRS 2008明细报表

使用SSRS的明细报表,可制作分级汇总样式的报表。在明细报表中,用户单击加号或减号按钮即可展开或折叠报表的某个部分,以显示详细信息数据。

1、效果图:

 

2、数据集SQL脚本:

      select accper ,warehouse ,sum(inqty) AS inqty FROM ec_invtory GROUP BY accper,warehouse

 

3、将数据集的warehouse和inqty字段拖放到表控件中。

 

4、建立一行组,分组方式为accper。

 

 

5、选中数据行,在最左边点击右键→行可见性,设置明细行初始为隐藏,但可点击进行切换展开。

 

6、在入库数量列下方单元格维护表达式:=Sum(Fields!inqty.Value),然后设置这个单元格文本框的Toggleitem属性为:accper。这样报表展示时就可以展示各分组汇总数据,但在展开明细时,该数据又可以隐藏。

 

7、报表设计界面及预览界面如下。

 

 

 

 

5、L Server 2008数据库邮件配置及应用

数据库邮件是从SQL Server数据库引擎中发送电子邮件的企业解决方案。通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件。邮件中可以包含查询结果,还可以包含来自网络中任何资源的文件。

1、数据库邮件配置

   使用SQL Server Management Studio连接到数据库服务器后,可按下面示意图一步步配置数据库邮件。

(1)、在SQL Server Management Studio的数据库实例的管理菜单下,选中数据库邮件菜单,然后邮件选择:配置数据库邮件。

(2)、在选择配置任务页面,选择通过执行以下任务来安装数据库邮件。

 

(3)、在新建配置文件界面,首先录入配置文件名及说明信息,然后点击下图所示“添加”按钮,开始添加当前配置文件对应的SMTP账户。

(4)、按下图所示,录入SMTP账户信息,其中最重要的是服务器名称选项。若使用当前流行的邮件服务提供商的SMTP服务,则一般还需要在基本身份验证部分录入邮箱账户身份信息。

(5)、在上一步添加完账户信息并点击确定后,新增的账户信息将列示在下图的SMTP账户列表中。一个配置文件是可以和多个账户关联的,因而可以重复前面步骤添加其它SMTP账户信息。

(6)、在该步骤选择“公共”复选框及“默认配置文件”。

(7)、此步骤主要是配置数据库邮件参数,若无特殊要求,默认即可。

(8)、下图展示刚配置的信息。

(9)、系统开始根据前面的配置信息自动配置系统。如果一切ok,将会展示类似下图信息,点击关闭完成配置。

(10)、按照上述步骤,配置好数据库邮件后,可进行数据库邮件测试,以确认配置是否完全正确。在SQL Server Management Studio的数据库实例的管理菜单下,选中数据库邮件菜单,然后邮件选择:发送测试电子邮件…。

(11)、在弹出的测试邮件发送配置界面,维护好相关信息后,点击“发送测试电子邮件”功能按钮开始发生邮件。

(12)、系统对测试电子邮件进行列队以进行发送。

(13)、如果一切顺利,过一会,一般为1分钟左右,将可以在邮箱内容收到一份主题为:“数据库邮件测试”的邮件,如下图所示。

2、数据库邮件应用

   应用业务场景1:业务数据库数据达到一定数量级后,进行邮件发送提醒。

   使用SQL Server Management Studio连接到数据库服务器后,可按下面示意图一步步配置以创建一个作业,通过作业执行特定语句,进行邮件发送。

(1)、在SQL Server Management Studio的数据库实例的管理菜单下,选中SQL Server代理→作业菜单,右击作业菜单,然后点击“新建作业”。

(2)、在作业属性/常规属性页,维护好作业的名称等信息。

(3)、在作业属性/步骤属性页,维护作业步骤及作业命令。

本文示例SQL:

USE msdb

GO

DECLARE @cnt INT;

DECLARE @emailBody VARCHAR(4000);

SELECT @cnt=COUNT(*) FROM ng0002.dbo.secuser;

IF @cnt>100

BEGIN

SELECT @emailBody='数据库用户表记录数已达:'+convert(varchar,@cnt) ;

Exec dbo.sp_send_dbmail

    @profile_name='SQLMailConfig',

    @recipients='subscriber@126.com',

    @subject='用户数预警',

    @body=@emailBody

END

(4)、在作业属性/计划属性页,维护作业的执行计划。

(5)、待数据库作业成功执行后,将会收到一份类似下图的邮件:

 

应用业务场景2:将数据库查询结果以附件形式投递到指定邮箱

USE msdb

GO

Exec msdb.dbo.sp_send_dbmail

@profile_name='SQLMailConfig',

@recipients='subscriber@126.com',

@query='select logid,u_name from ng0002.dbo.secuser',

@subject='用户数预警',

@body='查询结果,详见附件',

@attach_query_result_as_file =1,--查询结果以附件形式发送

@query_attachment_filename ='查询结果.Txt'--邮件附件名称

GO

PS:

    数据库邮件发送存储(sp_send_dbmail)详细技术参数可参考以下网站:http://msdn.microsoft.com/zh-cn/library/ms190307.aspx

 

 

SSRS 2008分类汇总

 平时开发报表时,经常用到小计、总计之类分类汇总功能,在使用SSRS之前,常常使用SQL语句通过拼凑实现,不仅开发效率低,维护起来也很不方便。在SSRS 2008中,就可以通过“分组”功能,方便的实现“分类汇总”的效果。

1、效果图:

 

2、数据集SQL脚本:

SELECT  ec_billhead.transid,warehouse,qty,ec_billbody.mony

FROM ec_billbody,ec_billhead

WHERE ec_billbody.transid = ec_billhead.transid

3、关键开发步骤:

  (1)、在设计界面拖放一表格控件,然后将qty和mony两个数据字段拖放至其中。完成后界面如下: 

    (2)、单击表格控件的任意单元格,点击分组窗口的“详细信息”行,然后依次点击右侧的向下三角形/添加组/父组...,添加第一分组,最后在弹出的窗口中,选择分组依据字段:warehouse。

  (3)、经过上一步骤,系统会自动产生一个名为Group1的分组,单击该父组,然后依次点击右侧的向下三角形/添加组/子组...,添加第二分组,最后在弹出的窗口中,选择分组依据字段:transid。经过该步骤,系统又会自动产生一个名为Group2的分组。

 

 

  (4)、单击名为Group1的分组,然后依次点击右侧的向下三角形:添加总计/晚于,系统就会针对分组Group1产生了一个总计行。然后再按此步骤,给分组Group2也添加一个总计行。备注:给分组添加总计时的 早于/晚于也就是 之前/之后 的意思。 

    (5)、经过上面步骤设置后,大体设计基本完成,此时设计界面的截图如下: 

    (6)、后续美化:修改两个分组的标题行名称为合适的名称、删掉表格控件中多余的空白列、将第2分组的总计名称由“总计”改为”小计“‘、设置总计与小计行的背景色。至此,分类汇总效果的报表即开发完毕。

SSRS 2008冻结首行

SSRS报表每页展示行较多时,拖动竖向滚动条向下查看报表时,往往也需要查看报表的标题行。在SSRS 2008中可以只要设置个FixedData属性即可实现类似Excel的"冻结首行”的效果。

1、效果图:

 2、关键开发步骤。

  (1)、将数据集的字段拖放至表格控件上。

(2)、在报表分组窗口(可通过菜单:报表/分组 展示分组窗口),先选中行组下方的“详细信息”行,然后在点击列祖 右侧的向下箭头,勾选高级模式。

    (3)、点击行组下方的静态 行,然后在右侧的属性窗口设置FixedData属性为:True。

    (4)、为了达到更好的UI效果,建议设置标题行的背景色,否则查看报表时,将会看见报表数据行穿透标题行。

关于reporting serivces导出excel合并单元格的几种解决办法

在reporting services中经常会为了计算而将报表导出为,但往往会出现合并单元格的问题。下面介绍几种解决办法以供参考。

1.将表格单独放在body中。报表名称和其它所有内容放在page header和page footer中,在导出excel时加上参数SiplePageHeaders=true.这样每次导出只是按照表的格式导出数据,即不会存在合并单元格的问题了,也可将此参数添加到报表服务器的配置文件中,这样只要配置一次就可以不用再考虑合并单元格的问题。代码如下:

URL调用:

http://reporthost/reportserver/folder....&rs:Format=EXCEL&rc:SimplePageHeaders=true

在报表的最后面加上&rs:Format=EXCEL&rc:SimplePageHeaders=true

修改配置文件:

默认在

C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportServer目录下面找到文件:rsreportserver.config。找到<Render></Render>节点,在<Extension>节点后面添加如下内容或者修改Name=“Excel"的<Extension>节点为如下内容:

 

1. <Extension Name="EXCEL2" Type="Microsoft.ReportingServices.Rendering.ExcelRenderer.ExcelRenderer,Microsoft.ReportingServices.ExcelRendering"> 

2.                 <OverrideNames> 

3.                     <Name Language="en-US">EXCEL (only Data)</Name> 

4.                 </OverrideNames> 

5.                 <Configuration> 

6.                     <DeviceInfo> 

7.                         <SimplePageHeaders>true</SimplePageHeaders> 

8.                     </DeviceInfo> 

9.                 </Configuration> 

10.            </Extension> 

2.

2.用厘米或者像素替换默认单位英寸。

某些时候,你在自动对齐的时候明明已经显示为0points但还是会出现合并单元格或者隐藏的合并单元格。出现这种问题是因为默认对齐的label长可能为x.xxxxxxin,这就导致在导出为excel时将这个长度进行进位。所以最好用厘米或者像素来代替英寸。用厘米时可以精确到毫米是没有问题 的。用像素直接用整数也是不会有问题。但相对来说比较繁琐,每次都要计算label的长度进行手动调节。

3.放弃table和matrix,改用List。

如果感觉以上两个方法都行不通的话,那你只有放弃用table, matrix和tablix了。直接用textbox也是一种选择,但相应报表开发的工作量就要比较大了。

以上三种方法都可以解决合并单元格的问题。如有其它好的方法,欢迎交流。

reporting services中列的隐藏

在reporting services中当我们想隐藏一列数据的时候,往往会发现虽然数据隐藏掉,但一张报表却被一分为而。如下图所示:

 

这时,好像无论我们再怎么调,隐藏掉的列仍是显示空白。要想解决这个问题,我们得先得搞清楚几个概念:单元格,列,分组。貌似这几个概念很好理解,列就是一列数据,包含多个单元格。单元格就是表格中显示数据的一个单位而已,分组基本就是用来汇总数据。单元格隐藏应用的主要场景是在一列中如果下面几个 值和上面相同就将单元格显示为空。所以单元格隐藏后位置仍然还是存在的,要不然表格的格式看上去就不美观。列和行的隐藏主要用于不同的人打开报表时显示不同的数据,比较某个指标只有某几个国家有,则其它国家就不需要显示这几个指标。所以列和行隐藏后位置同时也要隐藏掉。分组主要是用来汇总数据,分组的隐藏 主要是应用在汇总级别上。所以隐藏后结果不需要发生变化,只要将位置和父级合并即可。因此,当遇到列隐藏后出现上图的问题,那我们就要看下是不是隐藏的方式错了。误将单元格或者分组隐藏。

对于单元格,列,分组的隐藏方法是不同的。单元格的隐藏可以直接选中单元格,在属性的visibility中设置hidden属性为true或者你 希望的表达式。我们隐藏列后出现空白的大部分原因是我们用错为这个属性。列的隐藏我们只能选中列然后右击选择column visibility,在其中设置隐藏选项。只有通过这种方式设置的隐藏才是真正的隐藏。分组的隐藏在分组窗格中通过分组属性来隐藏。

那么现在回到开始的图上,tablix行组只能通过组的方式隐藏,tablix正文部分可以通过列隐藏的方式进行隐藏,其中的每个单元格可以通过单 元格的方式将数据隐藏掉。那么为什么列的分组可以通过列隐藏的方式隐藏掉呢。很简单,列分组的方式是纵向的,所以行分组也可以通过行隐藏的方式隐藏掉,但如果行分组中的列要用列隐藏的方式隐藏,那么reporting services就不知道要如何对报表进行处理了。

以上原理大家都了解了以后,我们就可以完全fix掉这个错误。首先,判断我们是否是用了单元格隐藏的方式。选中隐藏列,看属性窗格中的visibility->hidden是否为true如果为true则先将其设为false。 

然后,右击要隐藏的列,看其列可见性选则说明其在分组中。再查看分组中的数据,如果在分组中只是用做明细数据而不做为分组的条件的话,则将其转换为静态列。这样column visibility就可用了,直接设置就可以将此列隐藏掉。

如何转换为静态列,如开始的图片中,选中左边的tablix列组,右击->insert column->outside group-left.如此直接用新添加的列展示数据即可。

SRSS控制方式

1.1.ReportingServices自动分页

在报表的页眉或者页尾添加文本框,调用全局变量=Globals!PageNumber

1.2.根据记录条数来分页

当每条记录呈现的高度不一致,我们又希望让每页呈现的记录条数一致,那么我们可以通过记录条数来分页。在通过记录条数分页时,通常是

根据记录条数来分组,然后在组的结束位置添加分页符。

在表、矩阵或者列表中添加一个组,然后在分组表达式中输入=(RowNumber("ContainerName") - 1) \ PageSize ( PageSize用每页所包含的

记录条数替代,ContainerName用包含这个组的表、矩阵或者列表的名称替代)。这个表达式是用记录的行号整除分页大小,也就是记录所在的

页码数。最后选中“在结尾处分页”,在每个组实例的结尾处放置分页符。

1.3.按组分页

插入组时,在<常规>的页签中,可以选择<在起始处分页>或者<在结尾处分页>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值