Добавление переменного цвета строк в отчет служб SQL Server Reporting services


Как затенять чередующиеся строки в отчете служб SQL Server Reporting Services?


Edit: есть куча хороших ответов, перечисленных ниже-от быстрого и простого к сложному и комплексно. Увы, я могу выбрать только один...

18 136

18 ответов:

перейдите к свойству 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))

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

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

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

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

Так что у меня есть три различных вида клеточных фонов сейчас:

  1. первый столбец строки данных =код.AlternateColor ("AliceBlue"," White", True) (это то же самое, что и предыдущий ответ.)
  2. остальные столбцы строки данных имеют =код.AlternateColor ("AliceBlue"," White", False) (это, также, то же самое, что и предыдущий ответ.)
  3. первый столбец строки группировки имеет =код.RestartColor ("AliceBlue") (это новый.)
  4. остальные столбцы строки группировки имеют =код.AlternateColor ("AliceBlue"," White", False) (это использовалось раньше, но не упоминалось об этом для группировки строк.)

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

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

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

=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

решение Майкла Харена отлично работает для меня. Однако я получил предупреждение о том, что" прозрачный " не является допустимым фоновым цветом при предварительном просмотре. Нашел быстрое решение от установка BackgroundColor элементов отчета в SSRS. Ничего не используйте вместо "прозрачный"

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

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

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

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

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

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

  3. установите свойство BackgroundColor для всех ячеек строки к

    "=ReportItems!RowGroupColor.Value"

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

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

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

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

Ах, ну, мы можем мечтать ...

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

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

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

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

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

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

если вы хотите альтернативный цвет клеток coloumn мудрый тогда,

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

=IIF (RunningValue (Fields![ColumnGroupField].Value, countDistinct," FakeParentGroup") MOD 2, "White", "LightGrey")

вот и все.

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

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

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

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

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

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

Так что у меня есть три различных вида клеточных фонов сейчас:

  1. первый столбец строки данных =код.AlternateColor ("AliceBlue"," White", True) (это то же самое, что и предыдущий ответ.)
  2. остальные столбцы строки данных имеют =код.AlternateColor("AliceBlue", "Белый", ложь) (это, также, является таким же, как предыдущие ответ.)
  3. первый столбец строки группировки имеет =код.RestartColor ("AliceBlue") (это новое.)
  4. остальные столбцы строки группировки имеют =код.AlternateColor ("AliceBlue"," White", False) (это использовалось раньше, но не упоминалось об этом для группировки строк.)

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

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

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

надеюсь, что это помогает.

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

вот функция, которую я написал, которая работала для меня, используя счетчик столбцов:

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 столбцов я использую это выражение для строки (ячеек) Backcolour:

=Code.AlternateColorByColumnCount("LightGrey","White", 7)

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

http://reportingservicestnt.blogspot.com/2011/09/alternate-colors-in-matrixpivot-table.html

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

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

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

= 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

теперь, в первый столбец строки, которую вы хотите чередовать, установите выражение цвета в:

=код.AlternateColor ()

-

в остальных столбцах, набор им всем до:

=код.BGColor

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

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