Как отобразить номер страницы в теле отчета SSRS 2008 R2?

Я думаю, что многие разработчики сталкиваются с проблемой попытки отобразить номера страниц с помощью SSRS 2008 R2.

Существует альтернативное решение, для которого требуется версия SSRS 2010 +. В противном случае вы получите 1 все время.

Перейдите в "Отчет" -> "Свойства отчета" -> "Код"

в Custom Code введите следующее:

Public Function PageNumber() as String
     Dim str as String
     str = Me.Report.Globals!PageNumber.ToString()
     Return str
End Function

Public Function TotalPages() as String
     Dim str as String
     str = Me.Report.Globals!TotalPages.ToString()
     Return str
End Function

Теперь вы сможете получить доступ к этим функциям в любом месте отчета (заголовок, тело или нижний колонтитул). Итак, чтобы вывести номер страницы и общее количество страниц в текстовом поле, расположенном в теле, просто введите это значение:

="Page " + Code.PageNumber() + " of " + Code.TotalPages()

Это решение НЕ работает с SSRS 2008 R2.

Однако есть обходной путь, он будет работать с любой версией выше, чем 2008 R2 (включая 2008 R2). Я опубликую в качестве ответа, надеюсь, что это поможет некоторым людям, которые борются с этой проблемой.

3 ответа

Решение

Сначала вам нужно использовать переменные отчета: щелкните правой кнопкой мыши пустое пространство отчета -> Переменные -> Создайте переменную, например PageCount (установите значение по умолчанию 0)

Затем в верхнем или нижнем колонтитуле -> создать текстовое поле и установить выражение ->

=Variables!PageCount.SetValue(Variables!PageCount.Value+1)

Он будет автоматически увеличиваться для каждой страницы. (ВАЖНО: НЕ скрывайте его из верхнего или нижнего колонтитула, SetValue НЕ БУДЕТ работать, если вы скрываете прямоугольник, поэтому измените шрифт на 1 или текст на белый, делайте все, что угодно, только НЕ скрывайте его (будет напечатано "True" как настройка заняла места))

Тогда вы можете использовать:

=Variables!PageCount.Value

в любой части вашего тела отчета для доступа к номеру страницы.

ВАЖНО: ОБРАТИТЕ ВНИМАНИЕ, что я пытался использовать Globals!PageNumber для установки переменной, но в итоге она НЕ была доступна из тела отчета. Таким образом, это должно быть что-то и доступное из верхнего / нижнего колонтитула или тела.

В моем случае я должен сбросить номер страницы для каждого экземпляра моей группы. Поэтому я просто установил триггер в конце группы. (например, я проверяю, есть ли у меня возвращаемое значение Total, потому что я знаю, что для каждого конца моей группы у меня будет отображение Total.

Из-за в функции IIF Обе части True и False будут обработаны, поэтому если вы установите сеттеры в IIF такие как ниже:

=IIF(IsNothing(ReportItems!TotalBox.Value),Variables!PageCount.SetValue(Variables!PageCount.Value+1),Variables!PageCount.SetValue(0))

 ) 

у вас всегда будет значение 0, потому что в отчете будет проверена часть True, а затем часть False, оба установщика будут выполнены (значение будет установлено дважды)

поэтому нам нужно 2 коробки и что-то вроде:(Вы должны скрыть ненужные коробки ваши условия проверки)

=IIF(IsNothing(ReportItems!TotalBox.Value),Variables!PageCount.SetValue(Variables!PageCount.Value+1),"")
)

Вы должны скрыть эту коробку, когда NOT IsNothing(ReportItems!TotalBox.Value)

=IIF(NOT IsNothing(ReportItems!TotalBox.Value),Variables!PageCount.SetValue(0),"")
)

Опять же вам нужно скрыть эту коробку, когда IsNothing(ReportItems!TotalBox.Value)

Конечно, вы можете использовать другой способ определения конца экземпляра группы, например: создать текстовое поле, которое содержит ТОЛЬКО фиксированное значение в конце таблицы вашей группы. и скрыть это. когда вы проверяете триггер, просто делайте такой же подход, как и я.

Он отлично работает для всех версий выше 2008 R2 (в комплекте).

Если вы используете построитель отчетов SQL Server 2016, это выражение работало со мной.

=Globals!PageNumber.ToString() +"/" + Globals!TotalPages.ToString()

Вот рабочее выражение:

знак равноMicrosoft.VisualBasic.Interaction.Switch(Parameters!LANGUAGE.Value = "en-US", "Page " + code.PageNumber().ToString() + " of " + code.TotalPages().ToString(), Parameters!LANGUAGE.Value = "es-MX", "Hoja " + code.PageNumber().ToString() + " de " + code.TotalPages().ToString(), 1 = 1, "Page " +code.PageNumber().ToString() + " of " + code.TotalPages().ToString())

Сначала выполните шаги 1 ниже, чтобы сделать нумерацию страниц:
1)
1.1. Щелкните группу "Подробности" на панели "Группы строк".
1.2. На панели свойств элемента Tablix разверните "Группа" -> "PageBreak".
1.3. Установите "BreakLocation" на "End" и установите для свойства "Disable" выражение, как показано ниже:

=IIF(rownumber(nothing) mod 40=0,false,true)  

Вышеуказанный пункт 1 используется для разбивки на страницы при выводе отчета (вывод только 40 записей на страницу в выводе)

2) использовать пользовательский код:

Public Function PageNumberno(val as integer) as String
     Dim str as String
     str =(val/40)
     Return str
End Function

3) Создайте вычисляемый столбец в наборе данных и введите =0 в выражении

4) В 2-х вычисляемых столбцах
1) Pageno
2) Нет
в наборе данных

В теле отчета используйте выражение для PageNo:

=code.PageNumberno(Rownumber("DataSet1"))

используйте выражение для No:

 =IIF(Instr(code.PageNumberno(Rownumber("DataSet1"))
,".")<>0,
(Left(code.PageNumberno(Rownumber("DataSet1")),
(Instr(code.PageNumberno(Rownumber("DataSet1")),".")-1))+1)
,code.PageNumberno(Rownumber("DataSet1"))
)

5) Щелкните правой кнопкой мыши и вставьте столбец справа, а в поле Имя столбца добавьте код в текстовое поле.

=ReportItems!No.Value

Примечание. Не рассчитывается имя столбца поля.

6) В AdvancedMode IN Row Group выберите Static и установите для свойств RepeatOnNewPage значение True

В колонке "Выше", созданной в пункте 5, будет отображаться правильный номер страницы на каждой странице в теле отчета.

Я попробовал, и он работает отлично. Попробуйте.

В Visual Studio 2013Report variables будет Visible под меню отчета.

Из главного меню - Отчет > Свойства отчета > Переменные > Добавить

Другие вопросы по тегам