在SharePoint环境中,使用SQL Reporting Services报告时,可能会遇到一些需要自定义的场合。本文将介绍一些实用的技巧,这些技巧可以帮助更好地在SharePoint Server 2007和SQL Reporting Services 2005(集成模式)中展示报告。
这些技巧包括接受URL参数来传递报告参数、将报告本身作为URL参数传递、使用默认的master页面以及在新窗口中打开钻取报告等。这些功能并非SharePoint原生报告查看器页面RSViewerPage.aspx所提供的,因此需要进行一些自定义。
可能会需要创建一个包含参数的报告链接,这个链接可以放在快速启动导航中,或者作为文档的一部分。如果没有这些技巧,可能需要为每个报告构建一个特定的页面,并添加一系列的URL字符串过滤Web部件,然后将它们连接到报告。
要实现这些功能,首先需要确保Reporting Services已经正确安装并与SharePoint站点集成。Reporting Services需要处于集成模式。
这是一个SharePoint解决方案包的安装。以下是命令行示例:
stsadm -o addSolution -filename DataQ.SharePoint.RSViewer.wsp
stsadm -o deploySolution -name DataQ.SharePoint.RSViewer.wsp -immediate -allowgacdeployment
stsadm -o execadmsvcjobs
stsadm -o activatefeature -name DataQ.RS -url http://yoursite
请将yoursite
替换为站点地址。可以在../DeploymentFiles/
文件夹中找到WSP包,或者通过中央管理->操作上传解决方案。安装完成后,将在站点集合级别获得一个名为DataQ: Reporting Services Viewer Page的新功能。
该包安装了一个报告查看器页面:~site/_layouts/DataQ.RS/RSViewer.aspx
。这个页面对站点集合中的所有网站都是可用的。
可以通过报告项目的下拉菜单(编辑控制按钮或RCB)访问这个页面。创建包含参数的报告链接的好处是可以使用以下语法:
http://yoursite/_layouts/DataQ.RS/RSViewer.aspx?report=/reports/YourReport.rdl&p_Parameter=10
规则如下:
- 必须通过report
参数指定报告。它应该是报告的绝对路径。
- 必须通过URL参数传递每个报告参数,该参数名称前缀为p_
。添加了这个p_
前缀是因为需要某种方式来指示正在处理报告参数。稍后会在代码注释中看到这一点。
RSViewer.aspx实际上是一个使用default.master的SharePoint应用程序页面,并植入了sqlviewer Web部件作为用户控件。原生的Reporting Services查看器页面并不真正使用母版页。是的,可以将Web部件作为用户控件使用。
报告可以通过URL参数作为RDL的相对路径传递,或者通过ListID和ItemID参数对传递。以下是代码序列:
if (!Page.IsPostBack)
{
SPWeb web = SPContext.Current.Web;
SPList list;
SPListItem report = null;
if (Request["ItemId"] != null && Request["ListId"] != null)
{
list = web.Lists[new Guid(Request["ListId"].ToString())];
if (list != null)
{
report = list.Items.GetItemById(Convert.ToInt32(Request["ItemId"]));
}
}
else if (Request["report"] != null)
{
report = web.GetListItem(Request["report"].ToString());
}
if (report != null)
{
// set the window title
LiteralPageTitle.Text = report.Title;
// set the title in the page
LabelPageTitleInTitleArea.Text = report.Title;
// set the path to the report
m_sqlRsWebPart.ReportPath = SPContext.Current.Site.MakeFullUrl(report.File.ServerRelativeUrl);
ReportParameterDefaultCollection parameters = new ReportParameterDefaultCollection();
parameters = m_sqlRsWebPart.OverrideParameters;
foreach (string urlParam in Request.QueryString.AllKeys)
{
// we have to prefix report params with something so we know they are report parameters, and they are destined to be passed to the report
if (urlParam != null && urlParam.StartsWith("p_"))
{
string paramName = urlParam.Substring(2);
string paramValue = Request[urlParam].ToString();
Microsoft.Reporting.WebForms.ReportParameter p = new Microsoft.Reporting.WebForms.ReportParameter(paramName, paramValue);
parameters.Add(p);
}
}
}
}
首先重要的是正确设置m_sqlRsWebPart.ReportPath以指向报告文档。其次是覆盖m_sqlRsWebPart.OverrideParameters集合,以防通过URL传递了任何参数。选择通过在URL参数前加上p_来识别哪个URL参数是报告参数。另一种方法是查询Reporting Services Web服务以获取此报告的可用参数,并查看它们是否出现在URL中。在这里没有这样做。想保持简单。