1

Вот что я знаю:Содержание для PDF/Печатный отчет в SSRS

  1. Я знаю, что карты документов и закладки могут быть использованы на экране, но не в формате PDF.
  2. SSRS не имеет возможности создавать печатную Оглавление с номерами страниц в формате pdf.
  3. Я знаю, что TOC может быть сгенерирован путем экспорта карты документа в Word. Такой подход не будет работать для моей ситуации.
  4. Глобальные переменные могут хранить номера страниц, но они не могут быть использованы в теле отчета, только верхние и нижние колонтитулы.

Самое близкое, что я могу найти, это ссылка на создание внешней сборки или dll, чтобы заставить ее работать. Эта ссылка Eric Charran's blog говорит, что это можно сделать, но не публикует никакого кода. Я мог бы ограничить свой путь в репликации сборки .net, если кто-то может дать мне код для метода, но я никогда не создавал его и имел очень ограниченное знание VB и никаких знаний C#. Я только ссылался на DLL из SSRS.

Основываясь на количестве людей, ищущих это решение, любой, кто напишет эту внешнюю сборку, поможет тысячам людей! И я знаю, что буду очень благодарен.

Заранее благодарим за внимание.

ответ

1

Это то, что я смог сделать с помощью коллег и коллег. Это работает хорошо.

  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. Создайте эту хранимую процедуру, чтобы добавить необходимые данные. У нас есть уникальный идентификатор, который отправляется из интерфейса, который запускает отчет. Мы также используем другой параметр (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  [email protected] 
    ) 
    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 [email protected] 
        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 [email protected] where [email protected] 
        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, Culture = Нейтральная , 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