在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中。在这里没有这样做。想保持简单。