Как затенять чередующиеся строки в отчете служб отчетов SQL Server?
Изменить: Ниже перечислены несколько хороших ответов - от быстрых и простых до сложных и исчерпывающих . Увы, я могу выбрать только одно ...
sql-server
reporting-services
formatting
Майкл Харен
источник
источник
Ответы:
Перейдите к свойству BackgroundColor строки таблицы и выберите «Выражение ...»
Используйте это выражение:
Этот прием можно применить ко многим областям отчета.
А в .NET 3.5+ вы можете использовать:
Не ищу представителя - я просто исследовал этот вопрос сам и подумал, что поделюсь.
источник
[rsInvalidColor] The value of the BackgroundColor property for the textbox ‘active’ is “Transparent”, which is not a valid BackgroundColor.
Похоже, правильное выражение будет"=IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
. Тем не менее, спасибо за совет.Использование IIF (RowNumber ...) может привести к некоторым проблемам при группировке строк, и другой альтернативой является использование простой функции VBScript для определения цвета.
Это немного больше усилий, но когда базового решения недостаточно, это хорошая альтернатива.
По сути, вы добавляете код в отчет следующим образом ...
Private bOddRow As Boolean '************************************************************************* ' -- Display green-bar type color banding in detail rows ' -- Call from BackGroundColor property of all detail row textboxes ' -- Set Toggle True for first item, False for others. '************************************************************************* Function AlternateColor(ByVal OddColor As String, _ ByVal EvenColor As String, ByVal Toggle As Boolean) As String If Toggle Then bOddRow = Not bOddRow If bOddRow Then Return OddColor Else Return EvenColor End If End Function
Затем для каждой ячейки установите BackgroundColor следующим образом:
Полная информация находится в этой статье Wrox
источник
Я получил шахматный эффект, когда использовал решение Catch22, я думаю, потому что моя матрица имеет более одного столбца в дизайне. это выражение отлично сработало для меня:
источник
Я изменил решение @Catch22. Мне не нравится идея заходить в каждое поле, если я решу, что хочу изменить один из цветов. Это особенно важно в отчетах, где необходимо изменить цветовую переменную в многочисленных полях.
'************************************************************************* ' -- Display alternate color banding (defined below) in detail rows ' -- Call from BackgroundColor property of all detail row textboxes '************************************************************************* Function AlternateColor(Byval rowNumber as integer) As String Dim OddColor As String = "Green" Dim EvenColor As String = "White" If rowNumber mod 2 = 0 then Return EvenColor Else Return OddColor End If End Function
Заметил, что я изменил функцию с той, которая принимает цвета, на ту, которая содержит цвета, которые будут использоваться.
Затем в каждое поле добавьте:
Это намного надежнее, чем изменение цвета фона каждого поля вручную.
источник
Я заметил одну вещь: ни один из двух верхних методов не знает, какого цвета должна быть первая строка в группе; группа просто начнется с цветом, противоположным последней строке предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета ... первый ряд каждой группы всегда должен быть белым, а следующий - цветным.
Основная идея заключалась в том, чтобы сбрасывать переключатель при запуске каждой группы, поэтому я добавил немного кода:
Private bOddRow As Boolean '************************************************************************* ' -- Display green-bar type color banding in detail rows ' -- Call from BackGroundColor property of all detail row textboxes ' -- Set Toggle True for first item, False for others. '************************************************************************* Function AlternateColor(ByVal OddColor As String, _ ByVal EvenColor As String, ByVal Toggle As Boolean) As String If Toggle Then bOddRow = Not bOddRow If bOddRow Then Return OddColor Else Return EvenColor End If End Function ' Function RestartColor(ByVal OddColor As String) As String bOddRow = True Return OddColor End Function
Итак, у меня есть три разных типа фона ячеек:
У меня это работает. Если вы хотите, чтобы группирующая строка была неокрашенной или другого цвета, из этого должно быть довольно очевидно, как ее изменить.
Не стесняйтесь добавлять комментарии о том, что можно сделать для улучшения этого кода: я новичок как в SSRS, так и в VB, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется разумной (и она была полезной. для меня) поэтому я хотел выкинуть это здесь.
источник
для верхних и нижних колонтитулов групп:
Вы также можете использовать это для «сброса» счетчика цветов строки в каждой группе. Я хотел, чтобы первая строка деталей в каждой подгруппе начиналась с белого цвета, и это решение (при использовании в строке деталей) позволило это осуществить:
См .: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
источник
Решение Майкла Харена отлично подходит для меня. Однако я получил предупреждение о том, что «Transparent» не является допустимым BackgroundColor при предварительном просмотре. Нашел быстрое исправление в настройке BackgroundColor элементов отчета в SSRS . Используйте Nothing вместо "Transparent"
источник
Единственный эффективный способ решить эту проблему без использования VB - это «сохранить» значение группировки строк по модулю внутри группировки строк (и вне группировки столбцов) и явно ссылаться на нее внутри группы столбцов. Я нашел это решение в
http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html
Но Ankeet не лучшим образом объясняет, что происходит, и его решение рекомендует ненужный шаг по созданию группировки по постоянному значению, поэтому вот мой пошаговый процесс для матрицы с одной группой строк RowGroup1:
Установите значение текстового поля RowGroupColor на
=iif(RunningValue(Fields![RowGroupField].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Установите для свойства BackgroundColor всех ячеек строки значение
"=ReportItems!RowGroupColor.Value"
Вуаля! Это также решает многие проблемы, упомянутые в этой теме:
Было бы здорово, если бы SSRS предоставляла свойства помимо Value в текстовых полях. Вы можете просто поместить такой вид вычислений в свойство BackgroundColor текстовых полей группы строк, а затем ссылаться на него как на ReportItems! RowGroup.BackgroundColor во всех других ячейках.
Ну что ж, мы можем мечтать ...
источник
Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели одинаковый фон. Я сгруппировал как по строкам, так и по столбцам, и с двумя верхними решениями здесь я получил все строки в столбце 1 с цветным фоном, все строки в столбце 2 с белым фоном, все строки в столбце 3 с цветным фоном , и так далее. Это как если бы
RowNumber
иbOddRow
(в решении Catch22) обращали внимание на мою группу столбцов вместо того, чтобы игнорировать это и только чередовать с новой строкой.Я хотел, чтобы все столбцы в строке 1 имели белый фон, затем все столбцы в строке 2 имели цветной фон, затем все столбцы в строке 3 имели белый фон и так далее. Я получил этот эффект, используя выбранный ответ, но вместо перехода
Nothing
к немуRowNumber
я передал имя своей группы столбцов, напримерДумал, что это может быть полезно кому-то другому.
источник
Думаю, здесь этот трюк не обсуждается. Итак, вот оно,
В любой сложной матрице, когда вам нужны альтернативные цвета ячеек, по строкам или по столбцам, рабочее решение:
Если вам нужен другой цвет ячеек по колонке, тогда,
Вот и все.
То же самое для строки с альтернативным цветом, просто вам нужно соответствующим образом отредактировать решение.
ВНИМАНИЕ: Здесь иногда нужно соответственно установить границу ячеек, обычно она исчезает.
Также не забудьте удалить значение 1 в отчете, который появился на картинке при создании поддельной родительской группы.
источник
Если для всего отчета вам нужен чередующийся цвет, вы можете использовать DataSet, к которому привязан ваш Tablix, для номера строки идентификации всего отчета в отчете и использовать его в функции RowNumber ...
источник
Ответ @ Aditya отличный, но есть случаи, когда форматирование будет сброшено, если самая первая ячейка строки (для форматирования фона строки) имеет пропущенное значение (в сложных таблицах с группами столбцов / строк и пропущенными значениями).
Решение @ Aditya умело использует
countDistinct
результатrunningValue
функции для определения номеров строк в группе табликса (строки). Если у вас есть строки табликса с отсутствующим значением в первой ячейке, результатrunningValue
не будет увеличиваться,countDistinct
а будет возвращен номер предыдущей строки (и, следовательно, повлияет на форматирование этой ячейки). Чтобы учесть это, вам нужно будет добавить дополнительный член для компенсацииcountDistinct
значения. Я решил проверить первое текущее значение в самой группе строк (см. Строку 3 фрагмента ниже):Надеюсь это поможет.
источник
Может ли кто-нибудь объяснить логику превращения остальных полей в false в коде ниже (из сообщения выше)
Я заметил одну вещь: ни один из двух верхних методов не имеет никакого представления о том, какого цвета должна быть первая строка в группе; группа просто начнется с цветом, противоположным последней строке предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета ... первый ряд каждой группы всегда должен быть белым, а следующий - цветным.
Основная идея заключалась в том, чтобы сбрасывать переключатель при запуске каждой группы, поэтому я добавил немного кода:
Private bOddRow As Boolean '************************************************************************* '-- Display green-bar type color banding in detail rows '-- Call from BackGroundColor property of all detail row textboxes '-- Set Toggle True for first item, False for others. '************************************************************************* ' Function AlternateColor(ByVal OddColor As String, _ ByVal EvenColor As String, ByVal Toggle As Boolean) As String If Toggle Then bOddRow = Not bOddRow If bOddRow Then Return OddColor Else Return EvenColor End If End Function ' Function RestartColor(ByVal OddColor As String) As String bOddRow = True Return OddColor End Function
Итак, у меня есть три разных типа фона ячеек:
У меня это работает. Если вы хотите, чтобы группирующая строка была неокрашенной или имела другой цвет, из этого должно быть довольно очевидно, как ее изменить.
Не стесняйтесь добавлять комментарии о том, что можно сделать для улучшения этого кода: я новичок как в SSRS, так и в VB, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется разумной (и она была полезной. для меня) поэтому я хотел выкинуть это здесь.
источник
Я пробовал все эти решения в сгруппированном таблисе с пространством строк, и ни одно не помогло во всем отчете. Результатом были повторяющиеся цветные строки, а другие решения привели к чередованию столбцов!
Вот функция, которую я написал, которая работала для меня с использованием счетчика столбцов:
Private bOddRow As Boolean Private cellCount as Integer Function AlternateColorByColumnCount(ByVal OddColor As String, ByVal EvenColor As String, ByVal ColCount As Integer) As String if cellCount = ColCount Then bOddRow = Not bOddRow cellCount = 0 End if cellCount = cellCount + 1 if bOddRow Then Return OddColor Else Return EvenColor End If End Function
Для табликса с 7 столбцами я использую это выражение для Row (of Cells) Backcolour:
источник
Просто потому, что ни один из приведенных выше ответов, похоже, не работал в моей матрице, я публикую это здесь:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
источник
В моих матричных данных отсутствовали значения, поэтому я не смог заставить решение Ахмада работать, но это решение сработало для меня.
Основная идея состоит в том, чтобы создать дочернюю группу и поле в самой внутренней группе, содержащее цвет. Затем установите цвет для каждой ячейки в строке на основе значения этого поля.
источник
Небольшая модификация других ответов здесь, которая сработала для меня. У моей группы есть два значения для группировки, поэтому я смог просто поместить их оба в первый аргумент с +, чтобы заставить его правильно чередоваться
= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")
источник
При использовании групп строк и столбцов у меня возникла проблема, когда цвета между столбцами чередовались, даже если это была одна и та же строка. Я решил эту проблему, используя глобальную переменную, которая меняется только при изменении строки:
Public Dim BGColor As String = "#ffffff" Function AlternateColor() As String If BGColor = "#cccccc" Then BGColor = "#ffffff" Return "#cccccc" Else BGColor = "#cccccc" Return "#ffffff" End If End Function
Теперь в первом столбце строки, которую вы хотите изменить, установите для выражения цвета значение:
-
В остальных столбцах установите для них все:
Это должно заставить цвета чередоваться только после того, как будет нарисован первый столбец.
Это также может (не поддаётся проверке) улучшить производительность, так как не требуется выполнять математические вычисления для каждого столбца.
источник