Как затенять чередующиеся строки в отчете служб отчетов SQL Server?
Редактировать: Ниже перечислены несколько хороших ответов - от быстро и просто до сложный и всеобъемлющий. Увы, я могу выбрать только одно ...
Если вы выберете несколько ячеек, вы не сможете редактировать свойства текстового поля, но вы можете получить доступ к цвету заливки на панели свойств и установить там выражение!





Перейдите к свойству BackgroundColor строки таблицы и выберите «Выражение ...»
Используйте это выражение:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Этот прием можно применить ко многим областям отчета.
А в .NET 3.5+ вы можете использовать:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Не ищу представителя - я просто исследовал этот вопрос сам и подумал, что поделюсь.
При определенных обстоятельствах это не работает, особенно в таблицах и объектах матриц с большим количеством промежуточных итогов. Ответ Catch22 не имеет таких же ограничений. Кроме того, метод Catch22 можно использовать, чтобы заставить столбцы в матрице иметь чередующиеся цвета столбцов, что полезно один раз в синюю луну.
Я всегда уверен, что проголосую за того, кто отвечает на свой вопрос. Слишком часто спрашивающий сам находит ответ и никогда не возвращается, чтобы опубликовать его, оставляя всех нас, у кого может быть тот же вопрос, в неведении. Шишка для вас, сэр.
Когда я использую приведенный выше код, я получаю предупреждающее сообщение вроде [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 следующим образом:
=Code.AlternateColor("AliceBlue", "White", True)
Полная информация находится на этом Статья Wrox
Приведенный выше код либо добавляется в раздел отчета «Код», либо на страницу кода программной части в проекте VB.NET, компилируется и развертывается как DLL, на которую имеется ссылка как на сборку. Я рекомендую приложить дополнительные усилия для развертывания этого как dll, поскольку вы обычно упоминаете об этом в многочисленных отчетах.
Это мой предпочтительный способ решения проблемы группировки после того, как я попробовал несколько других хаков. Он не ломается, когда к столбцу применяется интерактивная сортировка. +1 и большое спасибо.
Цвета смещаются, если у вас нечетное количество строк.
Не забудьте изменить "True" на "False" для всех столбцов в строке после первого, иначе вы увидите эффект шахматной доски! Спасибо за решение - отлично работает!
Питер Муларен: У меня возникла эта проблема, вы можете объяснить, как ее исправить?
Вы должны по очереди выделить каждую ячейку в строке и посмотреть на свойство BackgroundColor. Там, где вы видите Code.AlternateColor ("AliceBlue", "White", xxxx), измените xxxx на True или False, чтобы переключить цвета.
Спасибо! После долгой борьбы с RunningValue (и таких странностей, как цвета, применяемые до того, как произошла настраиваемая сортировка), это был намного более простой подход. Я добавил еще одну функцию, чтобы сбросить ее до истины, и вызвал ее из функции, которая получила значение внешней метки группы. Таким образом, каждая группа будет начинаться с одного цвета (в моем случае это имело смысл, поскольку между группами было много места).
для верхних и нижних колонтитулов групп:
=iif (RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
Вы также можете использовать это, чтобы «сбросить» счетчик цветов строки в каждой группе. Я хотел, чтобы первая строка деталей в каждой подгруппе начиналась с белого, и это решение (при использовании в строке деталей) позволило это сделать:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
См .: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
Я заметил одну вещь: ни один из двух верхних методов не имеет никакого представления о том, какого цвета должна быть первая строка в группе; группа просто начнется с цветом, противоположным последней строке предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета ... первый ряд каждой группы всегда должен быть белым, а следующий - цветным.
Основная идея заключалась в том, чтобы сбрасывать переключатель при запуске каждой группы, поэтому я добавил немного кода:
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, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется разумной (и она была полезной. для меня) поэтому я хотел выкинуть это здесь.
Вы также можете сбросить нумерацию строк для каждой группы, как описано в этот ответ.
Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели одинаковый фон. Я сгруппировал как по строкам, так и по столбцам, и с двумя верхними решениями здесь я получил все строки в столбце 1 с цветным фоном, все строки в столбце 2 с белым фоном, все строки в столбце 3 с цветным фоном , и так далее. Это как если бы RowNumber и bOddRow (из решения Catch22) обращали внимание на мою группу столбцов вместо того, чтобы игнорировать это и только чередовать с новой строкой.
Я хотел, чтобы все столбцы в строке 1 имели белый фон, затем все столбцы в строке 2 имели цветной фон, затем все столбцы в строке 3 имели белый фон и так далее. Я получил этот эффект, используя выбранный ответ, но вместо передачи Nothing в RowNumber я передал имя своей группы столбцов, например
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Думал, что это может быть полезно кому-то другому.
Если для всего отчета вам нужен чередующийся цвет, вы можете использовать DataSet, к которому привязан ваш Tablix, для номера строки идентификации всего отчета в отчете и использовать его в функции RowNumber ...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
Решение Майкла Харена отлично подходит для меня. Однако я получил предупреждение о том, что «Прозрачный» не является допустимым BackgroundColor при предварительном просмотре. Нашел быстрое исправление от Настройка BackgroundColor элементов отчета в SSRS. Используйте Nothing вместо "Transparent"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
У белых было бы лучше, чем Ничего.
Я получил шахматный эффект, когда использовал решение Catch22, я думаю, потому что моя матрица имеет более одного столбца в дизайне. это выражение отлично сработало для меня:
=iif (RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Этот ответ заслуживает гораздо большего внимания - это чистое решение, которое отлично работает в матрице с группами строк и группами столбцов и не требует для работы специального кода. Красивый!
На самом деле, это прекрасно работает даже для нескольких столбцов, но не в том случае, если у вас есть «недостающие» данные в группировке. Таким образом, если у вас есть данные, которые содержат данные за 12 месяцев в 2007 году, но отсутствуют данные за январь в 2006 году и сгруппированы по месяцам по строкам и годам по столбцам, окраска 2006 года будет отключена на единицу, потому что RunningValue не синхронизируется, потому что все еще поле в матрице для «Январь 2006», в наборе данных нет данных, а RunningValue остается прежним, без изменения цвета и т. д.
@ahmad, это так близко. У меня проблема, когда пустые поля имеют противоположный цвет. как убедиться, что пустые коробки правильно окрашены?
@KyleHale, у вас есть исправление для отсутствующей окраски коробки?
@FistOfFury Единственное известное мне решение - установить значение (обычно 0) для отсутствующих данных.
Когда принятый ответ не изменился для меня должным образом, я сразу перешел к этому, вместо того, чтобы возиться с VBA и различными функциями в строке, как некоторые другие ответы. По крайней мере, для моих данных этот ответ работает отлично. Спасибо!
Я немного изменил решение @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
Заметил, что я изменил функцию с той, которая принимает цвета, на ту, которая содержит цвета, которые будут использоваться.
Затем в каждое поле добавьте:
=Code.AlternateColor(rownumber(nothing))
Это намного надежнее, чем изменение цвета фона каждого поля вручную.
Хорошее дополнение к этой теме! Мне нравится не устанавливать «Истина» или «Ложь» в каждом столбце. Мне также нравится вариант «мод 3», поэтому я могу заштриховать только каждый 3-й ряд.
Мне тоже нравится это решение. Однако у меня это не работает, когда я использую группировку строк. Хотя решение @ahmad выше у меня сработал.
Это отличное решение для табликса, если вы не хотите добавлять дополнительные поля в свой DataSet!
Может ли кто-нибудь объяснить логику превращения остальных полей в 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, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется разумной (и она была полезной. для меня) поэтому я хотел выкинуть это здесь.
Единственный эффективный способ решить эту проблему без использования 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 во всех других ячейках.
Ну что ж, мы можем мечтать ...
Просто потому, что ни один из приведенных выше ответов, похоже, не работал в моей матрице, я публикую это здесь:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
В моих матричных данных отсутствовали значения, поэтому я не смог заставить решение Ахмада работать, но это решение сработало для меня
Основная идея состоит в том, чтобы создать дочернюю группу и поле в самой внутренней группе, содержащее цвет. Затем установите цвет для каждой ячейки в строке на основе значения этого поля.
Посмотрите @ Aditya и мой ответ, чтобы обработать недостающие значения в матрице. Полезно, если у вас уже есть (или вы хотите создать поддельную) родительскую группу. Таким образом вам не придется создавать отдельное поле.
В любой сложной матрице, когда вам нужны альтернативные цвета ячеек, по строкам или по столбцам, рабочий раствор,
Если вам нужен другой цвет ячеек по колонкам, тогда,
=IIF(RunningValue( Fields![ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "White", "LightGrey")
Вот и все.
То же самое для строки с альтернативным цветом, просто вам нужно соответствующим образом отредактировать решение.
ВНИМАНИЕ: Здесь иногда нужно соответственно установить границу ячеек, обычно она исчезает.
Также не забудьте удалить значение 1 в отчете, который появился на картинке при создании поддельной родительской группы.
Этот ответ определенно является отличной находкой для тех, кому нужно создавать чередование строк в сложных табликсах! Если существует родительская группа, используйте ее. В противном случае создайте FakeParentGroup. Отсутствующие значения в таблицах, содержащих как столбцы, так и группы строк, обычно нарушают форматирование. См. Мой ответ, основанный на @ Aditya, чтобы учесть пропущенные значения в первой ячейке.
Ответ @ Aditya отличный, но есть случаи, когда форматирование будет сброшено, если самая первая ячейка строки (для форматирования фона строки) имеет пропущенное значение (в сложных таблицах с группами столбцов / строк и пропущенными значениями).
Решение @ Aditya умело использует результат countDistinct функции runningValue для определения номеров строк в группе табликса (строки). Если у вас есть строки табликса с отсутствующим значением в первой ячейке, runningValue не будет увеличивать результат countDistinct и вернет номер предыдущей строки (и, следовательно, повлияет на форматирование этой ячейки). Чтобы учесть это, вам нужно будет добавить дополнительный член для компенсации значения countDistinct. Я решил проверить первое текущее значение в самой группе строк (см. Строку 3 фрагмента ниже):
=iif (
(RunningValue(Fields![RowGroupField].Value, countDistinct, "FakeOrRealImmediateParentGroup")
+ iif (IsNothing(RunningValue(Fields![RowGroupField].Value, First, "GroupForRowGroupField")), 1, 0)
) mod 2, "White", "LightGrey")
Надеюсь это поможет.
Спасибо @rpyzh, это было решение, которое сработало для моей многострочной группы с общим отчетом родительской группы строк!
Я пробовал все эти решения на сгруппированном таблисе с пространствами строк, и ни одно не помогло во всем отчете. Результатом стали повторяющиеся цветные строки, а другие решения привели к чередованию столбцов!
Вот функция, которую я написал, которая работала для меня с использованием счетчика столбцов:
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:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Небольшая модификация других ответов здесь, которая сработала для меня. У моей группы есть два значения для группировки, поэтому я смог просто поместить их оба в первый аргумент с +, чтобы заставить его правильно чередоваться
= 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
Теперь в столбце первый строки, которую вы хотите изменить, установите для выражения цвета значение:
=Code.AlternateColor()
-
В остальных столбцах задайте для них следующие значения:
=Code.BGColor
Это должно заставить чередоваться цвета только после того, как будет нарисован первый столбец.
Это также может (что не поддается проверке) улучшить производительность, поскольку не требуется выполнять математические вычисления для каждого столбца.
= IIf (RowNumber (Nothing) Mod 2 = 0, «Нет цвета», «# DDEBF7»)