SSRS中PDF /印刷报告的目录

时间:2016-08-03 16:16:37

标签: .net dll reporting-services .net-assembly tableofcontents

这就是我所知道的:

  1. 我知道文档地图和书签可以在屏幕上使用,但不能用于pdf。
  2. SSRS没有开箱即用的功能,可以生成带有页码的打印目录到PDF格式。
  3. 我知道可以通过将文档映射导出到Word来生成TOC。这种方法对我的情况不起作用。
  4. 全局变量可以存储页码,但它们不能在报表正文中使用,只能在页眉和页脚中使用。
  5. 我能找到的最接近的东西是创建外部程序集或dll以使其工作的参考。此链接Eric Charran's blog表示可以完成,但不会发布任何代码。如果有人可以给我这个方法的代码,我可能会跛行去复制一个.net程序集,但是我从来没有创建过一个并且对VB知识非常有限而且没有C#知识。我只是从SSRS中引用了一个dll。

    根据搜索此解决方案的人数,任何编写此外部程序集的人都会帮助很多人!我知道我会非常感激。

    提前感谢您的关注。

1 个答案:

答案 0 :(得分:1)

这是我在同事和同事的帮助下所能做到的。效果很好。

  1. 创建主报告,每个部分在TOC
  2. 中列出1个子报告
  3. 创建此表以保存dll所需的数据。

    CREATE TABLE [dbo].[tbl_TOC](
    [RID] [int] IDENTITY(1,1) NOT NULL,
    [TOCExecutionID] [varchar](50) NULL,
    [AssessmentID] [int] NULL,
    [ReportName] [varchar](50) NULL,
    [GlobalsTotalPages] [int] NULL,
    [LoadDate] [datetime] NULL DEFAULT (getdate())
    ) ON [PRIMARY]
    
  4. 创建此存储过程以添加必要的数据。我们从运行报告的界面发送了一个唯一的ID。我们还使用了我们报告中唯一的另一个参数(AssessmentID)。

    create proc rpt_dsTOC
    @TOCExecutionID varchar(50)
    as
    if OBJECT_ID('tempdb..#temp') is not null drop table #temp
    create table #temp (
        ord int NOT NULL,
        ReportName varchar(50) NULL,
        PageCnt int NULL,
        PageNo int null )
    
    ;with ctePageCount as (
    select distinct t.ReportName
        , t.GlobalsTotalPages PageCnt
        , t.TOCExecutionID
        , t.AssessmentID
    from        tbl_TOC t
    where        TOCExecutionID=@TOCExecutionID
    )
    insert into #temp
    select case when ReportName like 'Plan%' then 1  --List all of the          names of the subreports here
            when ReportName like 'Busin%' then 2
            when ReportName like 'Threa%' then 3
            when ReportName like '%Manag%' then 4
            when ReportName like '%Monit%' then 5
            when ReportName like 'Pande%' then 6
            when ReportName like 'Emerg%' then 7
            when ReportName like 'Key%' then 8
            when Reportname like 'Netw%' then 9
            else 10 end ord
        , ReportName
        , PageCnt
        , 0 PageNo
    from ctePageCount
    
    --This section calculates the pagenumber by using the total number of pages in each section
    
    declare @run int = 3
    declare @ord int, @ReportName varchar(50), @PageCnt int, @PageNo int
    declare     c cursor for
        select    ord
        , ReportName
        , PageCnt
        , PageNo
    from #temp
    order by ord;
    open c
        fetch next from c into @ord, @ReportName, @PageCnt, @PageNo
        update #temp set PageNo=@run
        set @run = @run + @PageCnt--5
    while @@FETCH_STATUS = 0 --EOF
    begin
        fetch next from c into @ord, @ReportName, @PageCnt, @PageNo
        if @PageNo=0
        set @PageNo = @run
        update #temp set PageNo=@PageNo where ord=@ord 
        set @run = @PageNo + @PageCnt
    end
    close c
    deallocate c
    select * from #temp order by ord
    
  5. 该存储过程成为主报告中TOC的数据集。

  6. 放置一个引用数据集的目录表。
  7. 创建dll ReportTOC.ClassTOC:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace ReportTOC
    {
    public class ClassTOC
    
    {
        public static string logReportAttributes(string TOCExecutionID, int AssessmentID, string ReportName, int GlobalsTotalPages)
        {
            string retValue = String.Empty;
            try
            {
               // long TOCExecutionID = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmss"));
                using (var conn = new SqlConnection("Server=10.2.36.11;Database=InternalApps;User Id=webclient;Password=webclient;MultipleActiveResultSets=true"))
                using (var command = new SqlCommand("usp_LogReportAttributes", conn) { CommandType = CommandType.StoredProcedure })
                {
                    conn.Open();
                    command.Parameters.AddWithValue("@TOCExecutionID", TOCExecutionID);
                    command.Parameters.AddWithValue("@AssessmentID", AssessmentID);
                    command.Parameters.AddWithValue("@ReportName", ReportName);
                    command.Parameters.AddWithValue("@GlobalsTotalPages", GlobalsTotalPages);
                    command.ExecuteNonQuery();
                }
                retValue = "Sent Successfully";
            }
            catch (Exception ex)
            {
                retValue = string.Format("{0} \n\r {1}", ex.Message != null ? ex.Message : "", ex.InnerException != null ? ex.InnerException.Message : "");
            }
            return retValue;
        }
    }
    }
    
  8. 我们使用的是.NET Framework 3.5

  9. 在每个子报告中: 设置对程序集的引用: ReportTOC,版本1.0.0.0,Culture = Neutral,PublicKeyToken = null
  10. 在此处将dll保存在本地(开发人员)计算机上: C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ PrivateAssemblies
  11. 在此处将dll保存在您的报表服务器上: C:\ Program Files \ Microsoft SQL Server \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ bin \ ReportTOC.dll