Как отобразить номер страницы в теле отчета 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 2013
Report variables
будет Visible
под меню отчета.
Из главного меню - Отчет > Свойства отчета > Переменные > Добавить