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/打印报告的目录 的相关文章

  • 给 MVVM 中的 View 一些命令

    假设我有一些用户控制权 用户控件有一些子窗口 用户控制用户想要关闭某种类型的子窗口 用户控制代码后面有一个方法 public void CloseChildWindows ChildWindowType type 但我无法调用此方法 因为我
  • SSRS报告不显示数据

    我刚刚创建了 SQL Server 2005 SSRS 报告 数据未显示在预览窗格中 数据集是根据字符串参数从存储过程正确填充的 我可以在数据窗格中执行它 在预览窗格中运行报表时 会显示正确的行数 但单元格的内容不包含任何数据 源数据集基于
  • 捕获非特定异常(例如 System.Exception)是一种不好的做法吗?为什么?

    我目前正在进行代码审查 下面的代码让我跳了起来 我发现这段代码存在多个问题 你是否同意我的观点 如果是这样 我该如何向我的同事解释这是错误的 顽固型 捕获一般异常 Exception ex 使用 if ex 是某物 而不是另一个 catch
  • 打印 WPF 位图图像

    打印位图图像的最佳方法是什么 我有 System Drawing 背景 所以我正在考虑将其转换为位图 然后打印它 但我认为可能有更好的方法 Thanks 根据 Drew 的回答 最好测量并安排传递给 PrintVisual 方法的容器 这将
  • 部署.Net应用程序

    我在部署 net windows 应用程序时确实有某些疑问 部署机器是否需要安装 Net框架 如果不是这样 我的应用程序安装程序 exe 是否包含编译器或类库与设置集成 另外 我可以将我的 net 应用程序部署在除windows 是否支持s
  • .NET:为什么不检查枚举的范围/值?

    这一直困扰着我 也许对 NET 内部结构有一定了解的人可以向我解释一下 假设我定义一个枚举如下 public enum Foo Eenie 1 Meenie 2 Miney 3 Moe 4 现在 还假设我的代码中的某处有以下代码 int b
  • 使用 ServiceStack JsonSerializer 反序列化包含 Dictionary 属性的类型

    下面的代码片段显示了我可以实现此目的的两种方法 第一个是使用MsgPack https github com msgpack msgpack cli第二个测试是使用ServiceStack 的 JSONSerializer https gi
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • Interlocked.CompareExchange 可以抛出 NullReferenceException 吗?

    From https msdn microsoft com en us library bb297966 v vs 110 aspx https msdn microsoft com en us library bb297966 v vs
  • 通过名称获取枚举成员的值?

    假设我有一个变量 其值 例如 listMovie 是一个名称enum member public enum Movies regMovie 1 listMovie 2 member whose value I want 在此示例中 我想获取
  • 为什么 localInit Func 在 Parallel.ForEach 中每个线程被调用多次

    我正在编写一些代码来处理大量数据 我认为让 Parallel ForEach 为它创建的每个线程创建一个文件会很有用 这样输出就不需要同步 至少对我而言 它看起来像这样 Parallel ForEach vals new ParallelO
  • 多线程:您在什么时候创建了太多线程?

    我正在开发一个多线程应用程序 该应用程序最初是单线程 后来扩展到多线程以实现性能提升 我有一个主线程 它将工作分成更小的块 并将其卸载到处理这些块的工作线程 此部分使用信号量进行控制 以在任何时间仅允许 X 个工作线程 工作线程生成数据块
  • 未找到源,但无法搜索部分或全部事件日志

    我收到以下异常 我已在注册表编辑中的事件日志上授予对 Asp net 帐户的完全控制权 SecurityException 未找到源 但部分或全部事件 无法搜索日志 无法访问的日志 安全 System Diagnostics EventLo
  • 托管线程多久切换一次操作系统线程?

    据我所知 托管线程不能保证在同一操作系统线程上运行 如果 CLR 可以在操作系统线程之间切换托管线程 这种情况发生的频率是多少 频率受什么影响 我有一个单独的问题 https stackoverflow com questions 1979
  • AutoMapper 无法识别特定于配置文件的前缀

    我正在尝试使用 AutoMapper 从属性名称之前有前缀的类中获取数据 并将其映射到没有这些前缀的第二个类 但是 我不一定希望它always删除该前缀 我只想让它为这个特定的映射执行此操作 我的源类如下所示 public class Ad
  • 如何检查应用程序的另一个实例是否正在运行[重复]

    这个问题在这里已经有答案了 有人可以展示如何检查程序的另一个实例 例如 test exe 是否正在运行 如果是 则停止加载应用程序 如果存在该实例 想要一些严肃的代码吗 这里是 var exists System Diagnostics P
  • 将参数传递给 .NET 定义的命令

    我需要在 Autocad 2000i 的命令行上编写一个命令 并且希望 autocad 提示输入参数 然后我的 vb net 程序将根据收到的参数进行操作 基本上我想我的解决方案都在这里 http through the interface
  • 在运行时从调试可视化工具中检测源语言

    我正在写一个Visual Studio 的调试可视化工具 https github com zspitz ExpressionToString visual studio debugger visualizer for expression
  • 如何将隐藏字段从一个页面传递到另一页面?

    我有一个 Net 类库 我想从一次代码隐藏页面传递一个隐藏变量 并在另一个代码隐藏页面中获取它 请注意 我没有任何可以使用表单标签和 get post 方法的设计页面 aspx 页面 我们应该怎么做 注意 我想使用隐藏字段将值从一页传递到另
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n

随机推荐

  • 如何在无需用户交互且仅通过客户端 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 这种方法不适用于我的情况 全局变量可以存储页