Добавление цвета чередующихся строк в отчет службы отчетов SQL Server

Как вы изменяете переменные строки в отчете служб отчетов SQL Server?


Изменить: Ниже приведен список хороших ответов - от быстро и простой до комплексный и всеобъемлющий. Увы, я могу выбрать только один...

Ответ 1

Перейдите в свойство BackgroundColor строки таблицы и выберите "Expression..."

Используйте это выражение:

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Этот трюк может применяться ко многим областям отчета.

И в .NET 3.5+ Вы можете использовать:

= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")

Не смотря на репутацию - я просто сам исследовал этот вопрос и думал, что поделюсь.

Ответ 2

Использование 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

Ответ 3

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

=iif(RunningValue(Fields![rowgroupfield].Value.ToString,CountDistinct,Nothing) Mod 2,"Gainsboro", "White")

Ответ 4

Я изменил решение @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))

Это гораздо более надежное, чем ручное изменение цвета в цвете фона каждого поля.

Ответ 5

Одна вещь, которую я заметил, состоит в том, что ни один из двух лучших методов не имеет понятия о том, какой цвет должен иметь первая строка в группе; группа начнет с противоположного цвета с последней строки предыдущей группы. Я хотел, чтобы мои группы всегда начинались с одного цвета... первая строка каждой группы всегда должна быть белой, а следующая строка - цветной.

Основная идея заключалась в том, чтобы переключиться на 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

Итак, теперь у меня есть три разных типа фона:

  • В первом столбце строки данных есть = Code.AlternateColor( "AliceBlue", "Белый", True) (Это то же самое, что и предыдущий ответ.)
  • Остальные столбцы строки данных имеют = Code.AlternateColor( "AliceBlue", "Белый", False) (Это также совпадает с предыдущим ответом.)
  • Первый столбец группировки имеет = Code.RestartColor( "AliceBlue" ) (это новый.)
  • Остальные столбцы группировки row = Code.AlternateColor( "AliceBlue", "White", False) (Ранее это использовалось, но не упоминалось об этом для группировки строки.)

Это работает для меня. Если вы хотите, чтобы строка группировки была неокрашенной или отличалась цветом, из нее должно быть достаточно очевидно, как ее изменить.

Пожалуйста, не стесняйтесь добавлять комментарии о том, что можно было бы сделать для улучшения этого кода: я совершенно новый как для SSRS, так и для VB, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется звуковой (и это было полезно для меня), поэтому я хотел выбросить его здесь.

Ответ 6

для заголовков/нижних колонтитулов группы:

=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

Ответ 7

Решение Michael Haren отлично работает для меня. Однако я получил предупреждение о том, что "Прозрачный" не является допустимым BackgroundColor при предварительном просмотре. Нашел быстрое исправление от Установка BackgroundColor элементов отчета в SSRS. Используйте Nothing вместо "Transparent"

= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", Nothing)

Ответ 8

Единственный эффективный способ решить эту проблему без использования VB - это "сохранить" значение по модулю группировки строк в группе группировки (и вне группировки столбцов) и ссылаться на нее явно внутри вашей группировки столбцов. Я нашел это решение в

http://ankeet1.blogspot.com/2009/02/alternating-row-background-color-for.html

Но Ankeet не лучше всего объясняет, что происходит, и его решение рекомендует ненужный шаг создания группировки по постоянному значению, поэтому здесь мой пошаговый процесс для матрицы с одной группой строк RowGroup1

  • Создайте новый столбец внутри RowGroup1. Переименуйте текстовое поле для этого как-то вроде RowGroupColor.
  • Установите значение текстового поля RowGroupColor для

    =iif(RunningValue(Fields![RowGroupField].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  • Задайте свойство BackgroundColor для всех ваших ячеек строки

    "=ReportItems!RowGroupColor.Value"

  • Установите ширину столбца RowGroupColor равным 0pt и установите CanGrow на false, чтобы скрыть его от клиентов.

Voila! Это также решает много проблем, упомянутых в этой теме:

  • Автоматический сброс для подгрупп: просто добавьте новый столбец для этого rowgroup, выполнив RunningValue в его.
  • Не нужно беспокоиться об переключениях True/False.
  • Цвета только удерживаются в одном месте для легкой модификации.
  • Может использоваться взаимозаменяемо в группах строк или столбцов (просто установите высоту в 0 вместо ширины)

Было бы замечательно, если бы SSRS отображали свойства помимо Value on Textboxes. Вы можете просто наполнить этот вид вычислений в свойстве BackgroundColor текстовых полей группы строк, а затем ссылаться на него как ReportItems! RowGroup.BackgroundColor во всех других ячейках.

Хорошо, мы можем мечтать...

Ответ 9

Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели один и тот же фон. Я группировался как по строке, так и по столбцу, а с двумя верхними решениями я получил все строки в столбце 1 с цветным фоном, все строки в столбце 2 с белым фоном, все строки в столбце 3 с цветным фоном, и так далее. Как будто RowNumber и bOddRow (решения Catch22) обратите внимание на мою группу столбцов вместо того, чтобы игнорировать это и только чередуя с новой строкой.

Я хотел бы, чтобы все столбцы в строке 1 имели белый фон, а затем все столбцы в строке 2 имели цветной фон, а затем все столбцы в строке 3 имели белый фон и т.д. Я получил этот эффект, используя выбранный ответ, но вместо передачи Nothing в RowNumber, я передал имя моей группы столбцов, например.

=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")

Думал, что это может быть полезно кому-то другому.

Ответ 10

Я думаю, что этот трюк здесь не обсуждается. Так вот,

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

Если вам нужен альтернативный цвет ячеек coloumn wise, тогда

  • В правом нижнем углу окна представления отчета в столбце "Столбец" Группы ", создайте поддельную родительскую группу на 1 (используя выражение)," FakeParentGroup".
  • Затем в дизайне отчета для ячеек, которые должны быть окрашены альтернативно, используйте следующее цветовое выражение фона

= IIF (RunningValue (Fields! [ColumnGroupField].Value, countDistinct, "FakeParentGroup" ) MOD 2, "Белый", "LightGrey" )

Вот и все.

То же самое для альтернативной цветовой строки, просто нужно отредактировать решение соответственно.

ПРИМЕЧАНИЕ. Здесь вам иногда необходимо установить границу ячеек, обычно она исчезает.

Также не забудьте удалить значение 1 в отчете, который появился в pic при создании поддельной родительской группы.

Ответ 11

Если для всего отчета вам нужен чередующийся цвет, вы можете использовать DataSet, для которого Tablix привязан к отчетному идентификатору в отчете, и использовать его в функции RowNumber...

=IIf(RowNumber("DataSet1")  Mod 2 = 1, "White","Blue")

Ответ 12

Может ли кто-нибудь объяснить логику поворота остальных полей на 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

Итак, теперь у меня есть три разных типа фона:

  • В первом столбце строки данных есть = Code.AlternateColor( "AliceBlue", "Белый", True) (Это то же самое, что и предыдущий ответ.)
  • Остальные столбцы строки данных имеют = Code.AlternateColor( "AliceBlue", "Белый", False) (Это также совпадает с предыдущим ответом.)
  • Первый столбец группировки имеет = Code.RestartColor( "AliceBlue" ) (это новый.)
  • Остальные столбцы группировки row = Code.AlternateColor( "AliceBlue", "White", False) (Ранее это использовалось, но не упоминалось об этом для группировки строки.)

Это работает для меня. Если вы хотите, чтобы строка группировки была неокрашенной или отличалась цветом, из нее должно быть достаточно очевидно, как ее изменить.

Пожалуйста, не стесняйтесь добавлять комментарии о том, что можно было бы сделать для улучшения этого кода: я совершенно новый как для SSRS, так и для VB, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется звуковой (и это было полезно для меня), поэтому я хотел выбросить его здесь.

Ответ 13

@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")

Надеюсь, что это поможет.

Ответ 14

Я пробовал все эти решения в 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)

Ответ 16

В моих матричных данных в нем отсутствовали значения, поэтому я не смог получить решение ahmad для работы, но это решение сработало для меня

Основная идея - создать дочернюю группу и поле в вашей самой внутренней группе, содержащей цвет. Затем установите цвет для каждой ячейки в строке на основе этого значения поля.

Ответ 17

Небольшая модификация других ответов отсюда, которые работали для меня. Моя группа имеет два значения для группировки, поэтому я смог просто поместить их в первый аргумент с символом +, чтобы он правильно чередовался.

= Iif ( RunningValue (Fields!description.Value + Fields!name.Value, CountDistinct, Nothing) Mod 2 = 0,"#e6eed5", "Transparent")

Ответ 18

При использовании групп строк и столбцов, у меня была проблема, когда цвета чередуются между столбцами, хотя это была одна и та же строка. Я решил это, используя глобальную переменную, которая чередуется только при изменении строки:

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

Это должно привести к тому, что цвета будут чередоваться только после рисования первого столбца.

Это может (неопровержимо) повысить производительность, так как для каждого столбца не требуется математическое вычисление.