通过SQL Reporting Services以PDF格式发送带有多个附件报告的电子邮件

时间:2011-07-30 04:49:12

标签: sql-server sql-server-2008 reporting-services

我正在使用SQL 2008 Reporting Services。我从应用程序设置参数后在浏览器中打开报告。我从代码创建报告订阅,代码发送电子邮件以及PDF格式的附件。

但我想从代码创建多个报告的订阅,一封电子邮件应该发送给客户端以及多个PDF附件。 (注意:无需针对每个订阅发送电子邮件) 我试过自己,但没有找到任何解决方案。您能否指导我如何通过一封邮件发送包含多个PDF附件报告数据的电子邮件。

或实现此目标的任何其他方式,可以在一封电子邮件中以PDF格式发送多个报告?

下面给出了我用于创建订阅的代码。它会发送电子邮件和附件。但正如我上面提到的那样,我希望在一封电子邮件中有多个附件。

RSServiceReference05.ReportingService2005SoapClient rs = new RSServiceReference05.ReportingService2005SoapClient();

rs.ClientCredentials.Windows.AllowedImpersonationLevel = new System.Security.Principal.TokenImpersonationLevel();            

string batchID = string.Empty;
RSServiceReference05.ServerInfoHeader infoHeader = rs.CreateBatch(out batchID);

RSServiceReference05.BatchHeader bh = new RSServiceReference05.BatchHeader()
            {
                BatchID = batchID,
                AnyAttr = infoHeader.AnyAttr
            };                    

string desc = "Report is attached.";
string eventType = "TimedSubscription";
DateTime dt = DateTime.Now;
string scheduleXml = "<ScheduleDefinition xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><StartDateTime xmlns=\"http://schemas.microsoft.com/sqlserver/2006/03/15/reporting/reportingservices\">" + dt.AddMinutes(3).ToString("dd/MMM/yyyy HH:mm:ss")+"+05:00</StartDateTime></ScheduleDefinition>";


RSServiceReference05.ParameterValue[] extensionParams = new RSServiceReference05.ParameterValue[7];
extensionParams[0] = new RSServiceReference05.ParameterValue();
extensionParams[0].Name = "TO";            
extensionParams[0].Value = txtEmailTo.Text;
extensionParams[1] = new RSServiceReference05.ParameterValue();
extensionParams[1].Name = "IncludeReport";
extensionParams[1].Value = "True";
extensionParams[2] = new RSServiceReference05.ParameterValue();
extensionParams[2].Name = "RenderFormat";
extensionParams[2].Value = "PDF";
extensionParams[3] = new RSServiceReference05.ParameterValue();
extensionParams[3].Name = "Subject";           
extensionParams[3].Value = txtSubject.Text;
extensionParams[4] = new RSServiceReference05.ParameterValue();
extensionParams[4].Name = "Comment";            
extensionParams[4].Value = txtMessage.Text;
extensionParams[5] = new RSServiceReference05.ParameterValue();
extensionParams[5].Name = "IncludeLink";
extensionParams[5].Value = "False";
extensionParams[6] = new RSServiceReference05.ParameterValue();
extensionParams[6].Name = "Priority";
extensionParams[6].Value = "NORMAL";


string matchData = scheduleXml;

RSServiceReference05.ExtensionSettings extSettings = new RSServiceReference05.ExtensionSettings();            

extSettings.ParameterValues = extensionParams;
extSettings.Extension = "Report Server Email";
    string sub = "";
RSServiceReference05.ServerInfoHeader SubID = 
rs.CreateSubscription(bh, "/MyReports/MyTestReport", extSettings, desc, eventType, matchData, parameters, out sub);
RSServiceReference05.ServerInfoHeader EventID = rs.FireEvent(bh, "TimedSubscription", sub);
       rs.ExecuteBatch(bh);

2 个答案:

答案 0 :(得分:1)

  1. 首先创建一个主报告 - 这将是报告中的 您通过电子邮件发送给用户的订阅。
  2. 正常在报表服务器上创建所有必需的报表。
  3. 在主报告中添加一个Tablix
  4. 根据需要使用每个报告的标题填充每个文本框, 例如MyTestReport1,MyTestReport2等..
  5. 对于主报表上的每个报表标题,右键单击“选择” 文本框属性 - 操作 - 转到URL。直接输入URL 报告存储在报表服务器上的位置(或者您可以使用 表达框如果你想要比打开更复杂的东西 报告)。
  6. enter image description here

    现在,当您的订阅运行并且您的主报告通过电子邮件发送给用户时,他们可以选择他们想要的报告以及打开时所需的任何格式(例如PDF,Excel,CSV)。

    另外,您可以将超链接配置为提示用户在点击时保存附件,方法是将以下内容附加到您的网址:

    for PDF

    &rs:Format=PDF
    

    或Excel

    &rs:Format=Excel
    

    我认为这里的替代方案是你想要实现的并且效果很好。

答案 1 :(得分:0)

SSRS报告订阅只能为每封电子邮件配置一个附件。

在我过去的生活中,我在SQL 2005环境中开发了执行SSRS报告,我们的团队有一个用VB.NET编写的报告生成实用程序应用程序,它与Web服务一起工作。报告生成实用程序将由SQL代理作业或SSIS包执行,并使用命令行开关来生成当时需要生成的特定报告。

应用程序首先执行任何特殊数据处理,然后它会向Web服务发送参数。 Web服务使用SSRS API将参数发送到报告,生成必要的报告文件,并将其保存到服务器。生成所有报告文件后,应用程序会将包含所有报告文件的电子邮件作为附件发送到业务组。

这种方法的缺点是,您需要在支持报告生成实用程序时创建维护开销,以及为动态运行它创建的元数据(业务组电子邮件地址,报告ID,参数等)。我们的回报是值得的,因为这种方法允许任何依赖于其他企业系统的报告只能在数据准备好时执行。