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

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


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

= IIf (RowNumber (Nothing) Mod 2 = 0, «Нет цвета», «# DDEBF7»)

Stefan Steiger 27.05.2016 14:19

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

kitsu.eb 03.02.2017 23:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
142
2
278 289
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Ответ принят как подходящий

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

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

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

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

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

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

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

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

Registered User 01.01.2009 20:53

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

Matt DiTrolio 31.08.2011 18:43

Когда я использую приведенный выше код, я получаю предупреждающее сообщение вроде [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). Тем не менее, спасибо за совет.

Russell B 27.08.2013 23:10

Это создает проблему в случае группировки и просмотра деталей.

user2721874 06.09.2013 09:03

некоторые браузеры не могут обрабатывать "Прозрачный" или "Ничего". Лучше всего использовать «белый».

Nate S. 16.09.2014 22:05

Использование 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, поскольку вы обычно упоминаете об этом в многочисленных отчетах.

Registered User 01.01.2009 20:58

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

Rex Miller 27.01.2009 06:07

Цвета смещаются, если у вас нечетное количество строк.

K Richard 14.06.2010 21:41

Не забудьте изменить "True" на "False" для всех столбцов в строке после первого, иначе вы увидите эффект шахматной доски! Спасибо за решение - отлично работает!

Peter Mularien 13.03.2011 08:13

Питер Муларен: У меня возникла эта проблема, вы можете объяснить, как ее исправить?

Bill Software Engineer 22.12.2012 21:19

Вы должны по очереди выделить каждую ячейку в строке и посмотреть на свойство BackgroundColor. Там, где вы видите Code.AlternateColor ("AliceBlue", "White", xxxx), измените xxxx на True или False, чтобы переключить цвета.

Catch22 23.12.2012 01:28

Спасибо! После долгой борьбы с RunningValue (и таких странностей, как цвета, применяемые до того, как произошла настраиваемая сортировка), это был намного более простой подход. Я добавил еще одну функцию, чтобы сбросить ее до истины, и вызвал ее из функции, которая получила значение внешней метки группы. Таким образом, каждая группа будет начинаться с одного цвета (в моем случае это имело смысл, поскольку между группами было много места).

ShawnFumo 08.06.2016 00:48

для верхних и нижних колонтитулов групп:

=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

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

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

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

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

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

StackOverthrow 22.08.2018 00:44

Моя проблема заключалась в том, что я хотел, чтобы все столбцы в строке имели одинаковый фон. Я сгруппировал как по строкам, так и по столбцам, и с двумя верхними решениями здесь я получил все строки в столбце 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)

У белых было бы лучше, чем Ничего.

Nate S. 16.09.2014 22:04

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

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

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

Stefan Mohr 10.03.2012 03:19

На самом деле, это прекрасно работает даже для нескольких столбцов, но не в том случае, если у вас есть «недостающие» данные в группировке. Таким образом, если у вас есть данные, которые содержат данные за 12 месяцев в 2007 году, но отсутствуют данные за январь в 2006 году и сгруппированы по месяцам по строкам и годам по столбцам, окраска 2006 года будет отключена на единицу, потому что RunningValue не синхронизируется, потому что все еще поле в матрице для «Январь 2006», в наборе данных нет данных, а RunningValue остается прежним, без изменения цвета и т. д.

Kyle Hale 04.12.2012 00:18

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

FistOfFury 02.12.2013 22:32

@KyleHale, у вас есть исправление для отсутствующей окраски коробки?

FistOfFury 02.12.2013 22:35

@FistOfFury Единственное известное мне решение - установить значение (обычно 0) для отсутствующих данных.

Kyle Hale 02.12.2013 23:27

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

underscore_d 23.11.2015 16:41

Я немного изменил решение @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-й ряд.

Baodad 26.11.2013 01:09

Мне тоже нравится это решение. Однако у меня это не работает, когда я использую группировку строк. Хотя решение @ahmad выше у меня сработал.

Baodad 23.03.2016 00:17

Это отличное решение для табликса, если вы не хотите добавлять дополнительные поля в свой DataSet!

clamchoda 08.09.2016 18:57

Может ли кто-нибудь объяснить логику превращения остальных полей в 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, поэтому я сильно подозреваю, что есть много возможностей для улучшения, но основная идея кажется разумной (и она была полезной. для меня) поэтому я хотел выкинуть это здесь.

Единственный эффективный способ решить эту проблему без использования 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 в false, чтобы скрыть это от клиентов.

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

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

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

Ну что ж, мы можем мечтать ...

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

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

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

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

Посмотрите @ Aditya и мой ответ, чтобы обработать недостающие значения в матрице. Полезно, если у вас уже есть (или вы хотите создать поддельную) родительскую группу. Таким образом вам не придется создавать отдельное поле.

rpyzh 21.05.2014 19:27

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

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

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

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

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

Вот и все.

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

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

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

Этот ответ определенно является отличной находкой для тех, кому нужно создавать чередование строк в сложных табликсах! Если существует родительская группа, используйте ее. В противном случае создайте FakeParentGroup. Отсутствующие значения в таблицах, содержащих как столбцы, так и группы строк, обычно нарушают форматирование. См. Мой ответ, основанный на @ Aditya, чтобы учесть пропущенные значения в первой ячейке.

rpyzh 20.05.2014 23:29

Ответ @ 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, это было решение, которое сработало для моей многострочной группы с общим отчетом родительской группы строк!

Niallty 06.11.2018 21:23

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

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

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

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

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

Другие вопросы по теме