报表开发三部曲(一):SSRS报表服务器的部署
报表可以帮助企业访问、格式化数据,并把数据信息以可靠和安全的方式呈现给使用者。目前我所在的企业在办公或管理上会经常用到报表。久而久之,我在报表开发上积累了一些经验和心得。报表开发的工具有很多,目前比较实用和流行的应该是微软的SSRS。
这是我报表系列的第一篇,先介绍一下SSRS报表服务器的安装与部署。
这里介绍的是SQL SERVER 2008 R2版本的部署,首先下载SQL SERVER 2008 R2的安装包,运行安装程序。
选择安装选项卡–点击全新安装或向现有安装添加功能。
如果是第一次安装SQL SERVER 2008选择全新安装,系统已安装SQL SERVER 2008就选择向现有实例添加新功能。
选择安装 Reporting Service 和 BIDS 功能。BIDS是用于管理和开发商业智能的工具,里面包含了报表项目和报表模型的项目模板。
之后的安装步骤这里忽略,不断点击“下一步”直至安装完成即可。
安装完成后,在开始菜单找到“Reporting Service 配置管理器”。
服务账户使用内置的“NetWork Service 账户”
Web服务URL,设置虚拟目录的名称。报表的发布和部署都将使用到这个URL路径。
报表服务专用数据库有“本机模式”和“SharePoint集成”两种模式,这里我们使用默认的“本机模式”。“SharePoint集成”模式是 SSRS 与 SharePoint Server 集成的时候使用的,我将在以后的专题详细介绍。
报表管理器URL,这里可以配置报表管理器的URL。点击URL链接可以打开“报表管理器”对已发布的报表及数据源进行管理。
以下是报表管理器的界面。
SRSS报表服务器的安装与部署介绍完毕。下一次我将会介绍如何使用 SQL SERVER 集成的IDE进行报表项目的开发。
报表开发三部曲(二):使用VS进行报表开发、设计与部署
我们再进行SSRS报表开发的时候经常会用到两个工具:一个是 SQL SERVER 安装集成的 IDE — BIDS(SQL Server Business Intelligence Development Studio);另一个是报表生成器(Report Builder)。如果是比较熟悉数据库技术和VS开发环境的开发人员,建议使用的前者;如果是普通的报表使用者,建议使用后者,因为后者的UI\UE都比较接近Office系列的操作。本文主要为大家介绍前者。
打开BIDS,经常使用VS的人会倍感亲切。点击菜单栏–文件–新建–项目。然后选择报表服务器项目,为你的报表项目起一个帅气的名字吧。
新建项目以后,在“解决方案资源管理器”窗口会看到你新建的项目底下有3个文件夹,我们现在需要做的是先建立一个可以供所有报表使用的数据源。在“共享数据源”文件夹点击右键–添加新数据源。
之后弹出如下窗口,点击“编辑”按钮,选择数据服务器、数据库、登陆名和密码,点击“确定”建立数据库连接字符串。
数据源建立好以后就可以开始生成报表了。在报表文件夹点击右键–添加新报表–进入报表向导。选择刚才新建的共享数据源点击下一步。然后点击“查询生成器”对报表的DataSet进行编辑。我们可以点击上方工具条最右边的添加表按钮进行可视化编辑生成SQL SELECT语句,也可以直接写SQL语句;如果是我做的话,我一般习惯是绑定我在数据库写好的存储过程,这样做的好处就是只要我的存储过程处理好以后,报表的列、参数和行组都可以由报表向导自动生成。方法是点击“编辑为文本按钮”,命令类型选择”StoreProcedure”,在文本框中写上你的存储过程名称。
确定–下一步–选择表格或矩阵。表和矩阵的区别就是一维表与二维表的区别。下一步–把你需要展示的列添加到显示字段,在这里还可以进行分组和分页,根据个人的需要去添加字段。
点击“下一步”选择报表的样式,最后点击完成,给报表起一个名字。OK!一份报表就这样诞生了!你可以在设计窗口对报表进行编辑和修改,点击预览看到报表运行时的效果。
最后是报表的部署,鼠标移向解决方案管理器窗口,选中项目点击右键–属性。
进入项目属性页,找到TargetServerURL设置一个可用的报表服务器Web URL,这里我们设成本机的报表服务器URL,关于报表服务器URL的详细设置可以参考我的
“报表开发三部曲”的第一篇
。然后上面几个属性是数据源、数据集、报表目标文件夹的设定。Overwrite属性是部署时是否重新数据库和数据集。
确定–选择项目–点击右键–部署,等待部署成功的提示。
部署成功后便可以在报表服务器看到新部署的报表了。
使用BIDS开发报表与部署报表介绍完毕。下一次我将会介绍如何把制作好的报表嵌套的系统程序中。
报表开发三部曲(三):将rdl报表嵌套到网页
如果rdl报表已经设计好并部署到报表服务器上,我们已经可以通过报表服务器去访问报表了。不过这还是不够的,因为报表的使用者往往是一些非技术人员或维护人员,并没有服务器的访问权限。所以为了方便报表使用者浏览报表,我们开发者往往会把报表嵌套到网页中。接下来我将为大家介绍报表嵌套网页的方法。
假设在我的报表服务器中已经存在以下报表。
然后我们打开VS,在网站中新建一个aspx网页,在工具箱里找到 报表–ReportViewer,把控件拖放到页面中。
如果是10.0版本以上的ReportViewer还需要在页面上添加ScriptManager控件。
打开页面的后台代码进行编辑。假设我们要在ReportViewer嵌入
RP_STUDENT_COURSE_POINT_STA
这个报表。我的做法写一个ReportBind()的方法在PageLoad的时候执行。在这里我的报表服务器设置是通过配置文件获取的,当然你也可以直接使用字符串作为参数去设置服务器地址。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 public partial class Page_ReportView : System.Web.UI.Page 9 { 10 protected void Page_Load(object sender, EventArgs e) 11 { 12 ReportBind(); 13 } 14 15 private void ReportBind() 16 { 17 ReportViewer1.ServerReport.ReportServerUrl = new Uri(CommonDefine.getReportServerUrl());//CommonDefine.getReportServerUrl()方法通过配置文件读取报表服务器的地址 18 ReportViewer1.ServerReport.ReportPath = CommonDefine.getReportProjectName() + "RP_STUDENT_COURSE_POINT_STA";//CommonDefine.getReportProjectName()方法通过配置文件读取报表所在目录 19 ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;//设定报表的访问为远程访问 20 ReportViewer1.DataBind(); 21 } 22 }
CommonDefine类代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Web; 4 using System.Configuration; 5 6 /// <summary> 7 ///CommonDefine 的摘要说明 8 /// </summary> 9 public class CommonDefine 10 { 11 public CommonDefine() 12 { 13 // 14 //TODO: 在此处添加构造函数逻辑 15 // 16 } 17 18 /// <summary> 19 /// 取报表服务器地址 20 /// </summary> 21 /// <returns></returns> 22 public static string getReportServerUrl() 23 { 24 return ConfigurationManager.AppSettings.Get("ReportServer").ToString(); 25 26 } 27 28 /// <summary> 29 /// 取报表项目名 30 /// </summary> 31 /// <returns></returns> 32 public static string getReportProjectName() 33 { 34 return ConfigurationManager.AppSettings.Get("ReportProjectName").ToString(); 35 } 36 }
web.config文件(报表服务器地址的配置):
<appSettings> <!--报表服务器地址--> <add key="ReportServer" value="http://localhost/ReportServer/"/> <!--报表项目名称--> <add key="ReportProjectName" value="/MYTEST_REPORT_PROJECT/"/> </appSettings>
如果需要在后台为报表传递参数,可以使用如下代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 using Microsoft.Reporting.WebForms; 8 9 public partial class Page_ReportView : System.Web.UI.Page 10 { 11 protected void Page_Load(object sender, EventArgs e) 12 { 13 if (!Page.IsPostBack) 14 { 15 ReportBind(); 16 SetReprotParameters(); 17 } 18 } 19 20 private void ReportBind() 21 { 22 ReportViewer1.ServerReport.ReportServerUrl = new Uri(CommonDefine.getReportServerUrl()); //CommonDefine.getReportServerUrl()方法通过配置文件读取报表服务器的地址 23 ReportViewer1.ServerReport.ReportPath = CommonDefine.getReportProjectName() + "RP_STUDENT_COURSE_POINT_STA"; //CommonDefine.getReportProjectName()方法通过配置文件读取报表所在目录 24 ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote; //设定报表的访问为远程访问 25 //ReportViewer1.DataBind(); 26 } 27 28 private void SetReprotParameters() 29 { 30 List<ReportParameter> paramList = new List<ReportParameter>(); 31 paramList.Add(new ReportParameter("STUDENT_NO", "STD001", true)); 32 paramList.Add(new ReportParameter("STUDENT_NAME", "", true)); 33 ReportViewer1.ServerReport.SetParameters(paramList); 34 } 35 }
在浏览器中查看页面。
现在已经成功把报表嵌入到页面了。