SSRS 中 PDF/打印报告的目录

2023-11-29

这是我所知道的:

  1. 我知道文档图和书签可以在屏幕上使用,但不能在 pdf 中使用。
  2. SSRS 不具备将带页码的打印目录生成 pdf 的开箱即用功能。
  3. 我知道可以通过将文档结构图导出到Word来生成TOC。这种方法不适用于我的情况。
  4. 全局变量可以存储页码,但不能在报表正文中使用,只能在页眉和页脚中使用。

我能找到的最接近的东西是创建外部程序集或 dll 使其工作的参考。这个链接埃里克·查兰的博客说可以做到,但没有发布任何代码。如果有人能给我该方法的代码,我也许能够一瘸一拐地复制 .net 程序集,但我从未创建过该方法,而且我对 VB 的了解非常有限,而且没有 C# 知识。我只引用过 SSRS 中的 dll。

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

预先感谢您的关注。


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

  1. 创建主报告,其中目录中列出的每个部分有 1 个子报告
  2. 创建此表来保存 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]
    
  3. 创建此存储过程以添加必要的数据。我们从运行报告的界面发送了一个唯一的 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
    
  4. 该存储过程成为主报告中目录的数据集。

  5. 放置引用数据集的目录表。
  6. 创建 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;
        }
    }
    }
    
  7. 我们使用.NET Framework 3.5

  8. 在每个子报告中: 设置对程序集的引用: ReportTOC,版本 1.0.0.0,文化=中性,PublicKeyToken=null
  9. 将 dll 保存在本地(开发人员)计算机上: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies
  10. 将 dll 保存在您的报表服务器上: C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\bin\ReportTOC.dll
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSRS 中 PDF/打印报告的目录 的相关文章

随机推荐

  • 如何在无需用户交互且仅通过客户端 ID 和密码的情况下验证我的 Quickbook Intuit api 访问?

    我正在开发一个项目 其中后台 crons 创建发票 我想将它们添加到我在后端创建的 Quickbook 帐户中 所以问题是我想仅使用客户端 ID 和秘密参与来访问 api 如何在无需用户交互且仅通过客户端 ID 和密码的情况下验证我的 Qu
  • 有没有办法在使用 ES6 简写方法表示法的方法中使用词法 `this` ?

    关于SO的第一个问题 我希望我没有重复任何内容 我看过other 问题并认为我的不同足以值得询问 基本上 有没有办法让this它位于使用速记符号编写的方法的方法主体中 或者是词法的 或者是绑定到特定值的 这样做的动机来自于我在实现时想要使用
  • 如何指定 JSON 对象应采用哪一个 oneOf 项?

    使用Python和jsonschema我正在尝试验证分配ObjA or ObjB等等beta test json alpha beta ObjA 在我的架构中 testschema json beta is oneOf多个项目 每个项目定义
  • Selenium-IDE:如何验证/断言页面刷新

    我的页面上有一个链接 单击该链接会刷新此页面 如何使用 Selenium IDE 验证页面是否确实已刷新 重新加载 我通过断言页面上最初存在的元素在刷新后不存在于页面上来解决这个问题 然后等到页面完全刷新 并断言该元素再次存在 刷新并等待
  • React router dom 中的链接不会加载页面,仅 url 浏览器导航会更改

    React router dom v5 和 React 16 我的加载应用程序组件包含 ReactDOM render
  • 如何通过 Android 应用程序编辑日历事件

    我如何通过 Android 应用程序编辑日历中的日历事件 任何人都知道如何在日历应用程序中打开议程活动 从日历中读取数据后 试试这个 将单次事件添加到日历 要将条目添加到特定日历 我们需要使用 ContentValues 配置要插入的日历条
  • unicodecsv 读取器从 unicode 字符串无法正常工作?

    我在将 unicode CSV 字符串读入 python unicodescv 时遇到问题 gt gt gt import unicodecsv StringIO gt gt gt f StringIO StringIO u gt gt g
  • 在sqlite3数据库中插入1000000行

    我想向数据库中插入 10 00 000 行 但是插入的时间太长了 例如现在我正在尝试 2055 行 需要 3 分钟才能将这些数据上传到数据库中 对于 2055 个条目来说 这个时间太多了 以下是我将数据插入数据库的方法 public voi
  • numpy var() 和 pandas var() 之间的区别

    最近遇到的一件事让我注意到numpy var and pandas DataFrame var or pandas Series var 给出不同的值 我想知道它们之间有什么区别吗 这是我的数据集 Country GDP Area Cont
  • 使用 Kafka Streams DSL 进行两步窗口聚合

    假设我有一个流 stream 1 每秒由 1 个数据点组成 我想计算一个派生流 stream 5 其中包含使用 5 秒的跳跃窗口和另一个流 stream 10 的总和它基于包含使用 10 秒跳跃窗口的总和的 stream 5 需要分别对每个
  • 在 Rails 4 中,Model.scoped 已被弃用,但 Model.all 无法替代它

    启动 轨道 4 Model scoped现已弃用 DEPRECATION WARNING Model scoped is deprecated Please use Model all instead 但是 有一个区别Model scope
  • 在表中添加和删除数据 - React

    我正在 React 中按表格制作一个简单的姓名和电子邮件列表 我想从服务器获取数据 然后动态添加或删除人员 这是我使用 React 的第一步 所以我遇到了一个问题 import React Component from react impo
  • Angular 2 - 获取日期

    我在模板中显示日期 p Datum p b data wageStatement date 这是它的渲染方式 2017 03 08T13 00 03 114Z 但我只想以这种格式显示日期 2017 03 08 Use DatePipe p
  • Java 泛型:通配符 与类型参数?

    我正在刷新有关 Java 泛型的知识 因此 我转向 Oracle 提供的优秀教程 并开始为我的同事准备一个演示文稿 我在中看到了有关通配符的部分tutorial说的是 考虑以下方法 printList public static void
  • MySQL错误150,无法创建表

    我在创建表格时遇到问题 我不明白出了什么问题 phpMyAdmin 在主键声明旁边设置错误指示器 我不明白为什么这是错误的 该表是一个子表 它与另一个表具有一对多的标识关系 CREATE TABLE IF NOT EXISTS ruilen
  • 您能解释一下 STA 和 MTA 吗?

    您能用自己的话解释一下STA和MTA吗 另外 什么是公寓线程 它们仅与 COM 相关吗 如果是这样 为什么 COM 线程模型称为 单元 模型 其中初始化的 COM 对象的执行上下文与单个线程 单线程单元 或多个线程 多线程单元 相关联 在此
  • 如何在 Fortran 中计算大整数?

    我需要生成一些大整数 请参见下面的示例 Input Result 40 165580141 80 37889062373143906 120 8670007398507948658051921 160 1983924214061919432
  • Spark 作业执行时间随着非常宽的数据集和列数呈指数增长[重复]

    这个问题已经存在了 我在 Spark 中创建了一个固定宽度的文件导入解析器 并对各种数据集执行了一些执行测试 它在最多 1000 列的情况下工作正常 但是 随着列数和固定宽度长度的增加 Spark 作业性能迅速下降 在20k列和固定宽度长度
  • 使用 JavaScript 访问变量对象的属性

    我有一个 js 对象 如下所示 var object divisions ocd division country us name United States 我想访问嵌套对象下列出的属性 ocd division country us 又
  • SSRS 中 PDF/打印报告的目录

    这是我所知道的 我知道文档图和书签可以在屏幕上使用 但不能在 pdf 中使用 SSRS 不具备将带页码的打印目录生成 pdf 的开箱即用功能 我知道可以通过将文档结构图导出到Word来生成TOC 这种方法不适用于我的情况 全局变量可以存储页