Як відтіняти чергування рядків у звіті про послуги звітування SQL Server?
Редагувати: Нижче наведено купу хороших відповідей - від швидких та простих до складних та всеосяжних . На жаль, я можу вибрати лише один ...
Як відтіняти чергування рядків у звіті про послуги звітування SQL Server?
Редагувати: Нижче наведено купу хороших відповідей - від швидких та простих до складних та всеосяжних . На жаль, я можу вибрати лише один ...
Відповіді:
Перейдіть до властивості BackgroundColor рядка таблиці та виберіть "Вираз ..."
Використовуйте цей вираз:
= IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Ця хитрість може бути застосована до багатьох областей звіту.
І в .NET 3.5+ ви можете використовувати:
= If(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent")
Не шукаю представників - я просто досліджував це питання сам і думав, що поділюсь.
[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)
. Дякую за пораду, хоча.
Використання 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)
Я отримав шаховий ефект, коли використовував рішення 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
Отже, у мене зараз три різні типи клітин:
Це працює для мене. Якщо ви хочете, щоб рядок групування був не кольоровим або іншим кольором, з цього повинно бути досить очевидно, як його змінити.
Будь ласка, додайте коментарі щодо того, що можна зробити для вдосконалення цього коду: я абсолютно новий для 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 під час попереднього перегляду. Швидке виправлення знайдено з налаштування елементів 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:
Встановіть значення текстового поля RowGroupColor на
=iif(RunningValue(Fields![RowGroupField].Value
,CountDistinct,Nothing) Mod 2, "LightSteelBlue", "White")
Встановіть властивість BackgroundColor для всіх комірок рядка
"=ReportItems!RowGroupColor.Value"
Вуаля! Це також вирішує багато проблем, згаданих у цій темі:
Було б дивовижно, якби SSRS виставив властивості, окрім значення в Textboxes. Ви можете просто заповнити такий обчислення у властивості BackgroundColor текстових полів групи рядків, а потім посилати його як ReportItems! RowGroup.BackgroundColor у всіх інших клітинках.
Ах, ну, ми можемо мріяти ...
Моя проблема полягала в тому, що я хотів, щоб усі стовпці поспіль мали однакове тло. Я згрупував і рядки, і стовпці, і за допомогою двох найкращих рішень тут я отримав усі рядки в колонці 1 з кольоровим фоном, всі рядки в колонці 2 з білим тлом, всі рядки в колонці 3 з кольоровим фоном , і так далі. Це як би RowNumber
і bOddRow
(рішення Catch22) зверніть увагу на мою групу стовпців, а не ігноруючи це і лише чергуючи новий рядок.
Я хотів, щоб усі стовпці першого ряду мали білий фон, потім усі стовпці у другому рядку мали кольоровий фон, потім усі стовпці у рядку 3 мали білий фон тощо. Цей ефект я отримав за допомогою обраної відповіді, але замість того, Nothing
щоб переходити до RowNumber
, я передав назву моєї групи стовпців, наприклад
=IIf(RowNumber("MyColumnGroupName") Mod 2 = 0, "AliceBlue", "Transparent")
Думав, що це може бути корисним комусь іншому.
У будь-якому типі складної матриці, коли вам потрібні альтернативні кольори комірок, будь то рядкові або стовпчикові, робочим рішенням є:
Якщо ви хочете, щоб черговий колір колон колони був мудрим,
= IIF (RunningValue (Поля! [ColumnGroupField] .Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")
Це все.
Те ж саме для альтернативного кольорового ряду мудрий, просто вам потрібно редагувати рішення відповідно.
ПРИМІТКА. Тут іноді потрібно встановити межу комірок відповідно, зазвичай це зникає.
Також не забудьте видалити значення 1 у звіті, який потрапив у pic під час створення фальшивої батьківської групи.
Якщо для всього звіту потрібен змінний колір, ви можете використовувати DataSet, до якого прив’язаний ваш Tablix, для ідентифікаційного списку ідентифікаційних номерів у звіті у звіті та використовувати його у функції RowNumber ...
=IIf(RowNumber("DataSet1") Mod 2 = 1, "White","Blue")
@ Відповідь Aditya чудова, але є випадки, коли форматування буде скинуто, якщо сама перша клітинка рядка (для форматування фону рядків) має відсутнє значення (у складних таблицях із групами стовпців / рядків та відсутніми значеннями).
@ Рішення Aditya вміло використовує countDistinct
результат runningValue
функції для виявлення номерів рядків у групі tablix (рядок). Якщо у першій комірці є рядки tablix з пропущеним значенням, результат 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
Отже, у мене зараз три різні типи клітин:
Це працює для мене. Якщо ви хочете, щоб рядок групування був не кольоровим або іншим кольором, з цього повинно бути досить очевидно, як його змінити.
Будь ласка, додайте коментарі щодо того, що можна зробити для вдосконалення цього коду: я абсолютно новий для 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 стовпців я використовую цей вираз для рядкового (із клітин) фонового кольору:
=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
Тепер у першому стовпці рядка, який ви хочете чергувати, встановіть вираз кольору:
= Code.AlternateColor ()
-
У решті стовпців встановіть їх на:
= Код.BGColor
Це повинно зробити чергування кольорів лише після того, як намальовано перший стовпець.
Це також може (неперевірено) підвищити продуктивність, оскільки не потрібно робити математичні обчислення для кожного стовпця.