Как вы изменяете переменные строки в отчете служб отчетов SQL Server?
Изменить: Ниже приведен список хороших ответов - от быстро и простой до комплексный и всеобъемлющий. Увы, я могу выбрать только один...
Как вы изменяете переменные строки в отчете служб отчетов SQL Server?
Изменить: Ниже приведен список хороших ответов - от быстро и простой до комплексный и всеобъемлющий. Увы, я могу выбрать только один...
Перейдите в свойство BackgroundColor строки таблицы и выберите "Expression..."
Используйте это выражение:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Этот трюк может применяться ко многим областям отчета.
И в .NET 3.5+ Вы можете использовать:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Не смотря на репутацию - я просто сам исследовал этот вопрос и думал, что поделюсь.
Использование 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
Я получил шахматный эффект, когда использовал решение Catch22, я думаю, потому что моя матрица имеет более одного столбца в дизайне. это выражение отлично справилось со мной:
=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")
Я изменил решение @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))
Это гораздо более надежное, чем ручное изменение цвета в цвете фона каждого поля.
Одна вещь, которую я заметил, состоит в том, что ни один из двух лучших методов не имеет понятия о том, какой цвет должен иметь первая строка в группе; группа начнет с противоположного цвета с последней строки предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета... первая строка каждой группы всегда должна быть белой, а следующая строка - цветной.
Основная идея заключалась в том, чтобы переключиться на reset, когда начинается каждая группа, поэтому я добавил немного кода:
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, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется звуковой (и это было полезно для меня), поэтому я хотел выбросить его здесь.
для заголовков/нижних колонтитулов группы:
=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
Вы также можете использовать это для "reset" количество цветов строк в каждой группе. Я хотел, чтобы первая строка в каждой подгруппе начиналась с White, и это решение (при использовании в строке подробностей) позволило:
=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")
Смотрите: http://msdn.microsoft.com/en-us/library/ms159136(v=sql.100).aspx
Решение Michael Haren отлично работает для меня. Однако я получил предупреждение о том, что "Прозрачный" не является допустимым BackgroundColor при предварительном просмотре. Нашел быстрое исправление от Установка BackgroundColor элементов отчета в SSRS. Используйте Nothing вместо "Transparent"
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)
Единственный эффективный способ решить эту проблему без использования 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"
Voila! Это также решает много проблем, упомянутых в этой теме:
Было бы замечательно, если бы SSRS отображали свойства помимо Value on Textboxes. Вы можете просто наполнить этот вид вычислений в свойстве BackgroundColor текстовых полей группы строк, а затем ссылаться на него как ReportItems! RowGroup.BackgroundColor во всех других ячейках.
Хорошо, мы можем мечтать...
Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели один и тот же фон. Я группировался как по строке, так и по столбцу, а с двумя верхними решениями я получил все строки в столбце 1 с цветным фоном, все строки в столбце 2 с белым фоном, все строки в столбце 3 с цветным фоном, и так далее. Как будто RowNumber
и bOddRow
(решения Catch22) обратите внимание на мою группу столбцов вместо того, чтобы игнорировать это и только чередуя с новой строкой.
Я хотел бы, чтобы все столбцы в строке 1 имели белый фон, а затем все столбцы в строке 2 имели цветной фон, а затем все столбцы в строке 3 имели белый фон и т.д. Я получил этот эффект, используя выбранный ответ, но вместо передачи Nothing
в RowNumber
, я передал имя моей группы столбцов, например.
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Думал, что это может быть полезно кому-то другому.
В любом типе сложной матрицы, когда вам нужны альтернативные цвета ячеек, будь то строка мудрая или столбчатая, рабочее решение,
Если вам нужен альтернативный цвет ячеек coloumn wise, тогда
= IIF (RunningValue (Fields! [ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "Белый", "LightGrey" )
Вот и все.
То же самое для альтернативной цветовой строки, просто нужно отредактировать решение соответственно.
ПРИМЕЧАНИЕ. Здесь вам иногда необходимо установить границу ячеек, обычно она исчезает.
Также не забудьте удалить значение 1 в отчете, который появился в pic при создании поддельной родительской группы.
Если для всего отчета вам нужен чередующийся цвет, вы можете использовать DataSet, для которого Tablix привязан к отчетному идентификатору в отчете, и использовать его в функции RowNumber...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
Может ли кто-нибудь объяснить логику поворота остальных полей на false в нижнем коде (сверху сообщения)
Одна вещь, которую я заметил, состоит в том, что ни один из двух лучших методов не имеет понятия о том, какой цвет должен иметь первая строка в группе; группа начнет с противоположного цвета с последней строки предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета... первая строка каждой группы всегда должна быть белой, а следующая строка - цветной.
Основная идея заключалась в том, чтобы переключиться на reset, когда начинается каждая группа, поэтому я добавил немного кода:
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, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется звуковой (и это было полезно для меня), поэтому я хотел выбросить его здесь.
@Aditya ответ велик, но есть случаи, когда форматирование будет отменено, если самая первая ячейка строки (для форматирования фона строки) имеет отсутствующее значение (в сложных таблицах с группами столбцов/строк и отсутствующими значениями).
Решение @Aditya умело использует результат countDistinct
функции runningValue
для определения номеров строк в группе tablix (row). Если у вас есть строки таблицы с отсутствующим значением в первой ячейке, 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")
Надеюсь, что это поможет.
Я пробовал все эти решения в Grouped Tablix с пробелами строк, и ни один из них не работал во всем отчете. В результате были дублированные цветные ряды и другие решения, которые приводили к чередующимся столбцам!
Вот функция, которую я написал, которая работала для меня с использованием столбца столбца:
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 столбца Tablix я использую это выражение для строки Row (of Cells) Backcolour:
=Code.AlternateColorByColumnCount("LightGrey","White", 7)
Просто потому, что ни один из вышеперечисленных ответов не работал в моей матрице, я размещаю это здесь:
http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html
В моих матричных данных в нем отсутствовали значения, поэтому я не смог получить решение ahmad для работы, но это решение сработало для меня
Основная идея - создать дочернюю группу и поле в вашей самой внутренней группе, содержащей цвет. Затем установите цвет для каждой ячейки в строке на основе этого значения поля.
Небольшая модификация других ответов отсюда, которые работали для меня. Моя группа имеет два значения для группировки, поэтому я смог просто поместить их в первый аргумент с символом +, чтобы он правильно чередовался.
= 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
Теперь, в столбце first строки, которую вы хотите изменить, установите цветовое выражение:
= Code.AlternateColor()
-
В остальных столбцах установите для них все:
= Code.BGColor
Это должно привести к тому, что цвета будут чередоваться только после рисования первого столбца.
Это может (неопровержимо) повысить производительность, так как для каждого столбца не требуется математическое вычисление.