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

StackOverflow https://stackoverflow.com/questions/44376

Вопрос

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


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

Это было полезно?

Решение

Перейдите к свойству backgroundColor строки таблицы и выберите "Выражение ...".

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

= 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. Первый столбец строки данных имеет =Code.AlternateColor("AliceBlue", "White", True) (Это то же самое, что и предыдущий ответ.)
  2. Остальные столбцы строки данных имеют =Code .AlternateColor("AliceBlue", "White", False) (Это также совпадает с предыдущим ответом.)
  3. Первый столбец строки группировки имеет =Code.RestartColor("AliceBlue") (Это новое значение.)
  4. Остальные столбцы строки группировки имеют =Code.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

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

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

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

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

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

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

    =iif(RunningValue(Fields![Групповое поле строк].Value ,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")

  3. Установите для свойства backgroundColor всех ваших ячеек строки значение

    "=ReportItems!RowGroupColor.Value"

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

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

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

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

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

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

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

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

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

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

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

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

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

=IIF(RunningValue( Поля![ColumnGroupField].Значение, countDistinct, "FakeParentGroup" ) МОД 2, "Белый", "Светло-серый")

Вот и все.

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

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

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

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

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

Ответ @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")

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

Может ли кто-нибудь объяснить логику, стоящую за преобразованием остальных полей в 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. Первый столбец строки данных имеет =Code.AlternateColor("AliceBlue", "White", True) (Это то же самое, что и предыдущий ответ.)
  2. Остальные столбцы строки данных имеют =Code .AlternateColor("AliceBlue", "White", False) (Это также совпадает с предыдущим ответом.)
  3. Первый столбец строки группировки имеет =Code.RestartColor("AliceBlue") (Это новое значение.)
  4. Остальные столбцы строки группировки имеют =Code.AlternateColor("AliceBlue", "White", False) (Это использовалось ранее, но не упоминалось об этом для строки группировки.)

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

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

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

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

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

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

=Код.Альтернативный цвет ()

-

В оставшихся столбцах установите для них значение:

=Код.BGColor

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top