SQL Server Reporting Services 보고서에 대체 행 색 추가


141

SQL Server Reporting Services 보고서에서 대체 행을 어떻게 음영 처리합니까?


편집 : 아래에 나열된 좋은 답변 무리가있다 -에서 신속 하고 간단한복잡하고 포괄적 인가 . 아아, 하나만 선택할 수 있습니다 ...


2
= IIf (RowNumber (Nothing) Mod 2 = 0, "No Color", "# DDEBF7")
Stefan Steiger

여러 셀을 선택하면 텍스트 상자 속성을 편집 할 수 없지만 속성 패널에서 채우기 색상에 액세스하여 표현식을 설정할 수 있습니다!
kitsu.eb

답변:


213

테이블 행의 BackgroundColor 속성으로 이동하여 "Expression ..."을 선택하십시오.

이 표현을 사용하십시오 :

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

이 트릭은 보고서의 여러 영역에 적용 할 수 있습니다.

그리고 .NET 3.5 이상에서는 다음을 사용할 수 있습니다.

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

담당자를 찾지 않음-나는이 질문을 직접 조사하고 공유 할 것이라고 생각했습니다.


10
이는 특정 상황, 특히 소계가 많은 테이블 및 행렬 개체에서 실패합니다. Catch22의 응답에는 동일한 제한이 없습니다. 또한 Catch22의 방법을 사용하면 행렬의 열이 파란색 달에 한 번 유용한 열 색상을 번갈아 가도록 할 수 있습니다.
등록 된 사용자

16
나는 항상 자신의 질문에 대답하는 사람을 공감해야합니다. 너무 자주, asker는 스스로 답변을 찾은 다음 다시 게시하지 않아서 같은 질문을 가진 나머지 사람들은 어둠 속에서 떠납니다. 당신을위한 충격.
Matt DiTrolio

4
위의 코드를 사용하면 [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

2
이 그룹화의 경우 문제를 제공하고 세부 사항보기

3
일부 브라우저는 "투명"또는 "아무것도"를 처리 할 수 ​​없습니다. 가장 좋은 방법은 "화이트"를 사용하는 것입니다
네이트 S.

89

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로 배포하기 위해 추가 노력을 기울이는 것이 좋습니다.
등록 된 사용자

이것은 몇 가지 다른 해킹을 시도한 후 그룹화 문제를 처리하기 위해 선호하는 방법입니다. 대화 형 정렬이 열에 적용될 때 분류되지 않습니다. +1 그리고 많은 감사합니다.
Rex Miller

홀수 행이 있으면 색상이 오프셋됩니다.
K Richard

20
첫 행 이후에 행의 모든 ​​열에 대해 "참"을 "거짓"으로 변경하는 것을 잊지 마십시오. 그렇지 않으면 바둑판 효과가 나타납니다! 솔루션 주셔서 감사합니다-그것은 잘 작동합니다!
피터 Mularien

Peter Mularien :이 문제가 발생했습니다. 해결 방법을 설명해 주시겠습니까?
Bill Software Engineer

64

Catch22의 솔루션을 사용할 때 체스 효과가 나타났습니다. 매트릭스에는 디자인에 둘 이상의 열이 있기 때문입니다. 그 표현은 나를 위해 잘 작동했습니다 :

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

13
이 답변은 훨씬 더 주목할 가치가 있습니다. 행 그룹과 열 그룹이있는 행렬에서 완벽하게 작동하고 작동하는 사용자 정의 코드가없는 깨끗한 솔루션입니다. 아름다운!
스테판 모어

9
실제로 이것은 여러 열에 대해서도 잘 작동하지만 그룹에 데이터가 누락 된 경우에는 작동하지 않습니다. 따라서 2007 년에 12 개월 동안의 데이터 데이터가 있지만 2006 년에 1 월 데이터가없는 데이터를 가지고 있고 열별로 행과 연도별로 그룹화하면 RunningValue가 동기화되지 않아서 2006 년 색상이 하나씩 사라집니다. 여전히 "2006년 1월"에 대한 매트릭스의 상자가 데이터 세트에서 데이터가 없습니다와 RunningValue 같은, 어떤 색상 변경 등 남아
카일 헤일

2
@ahmad 이것은 너무 가깝습니다. 빈 상자가 반대 색상을 사용하는 문제가 있습니다. 빈 상자가 제대로 색칠되도록하려면 어떻게해야합니까?
FistOfFury

@KyleHale 누락 된 상자 색상을 수정 했습니까?
FistOfFury

2
@FistOfFury 내가 아는 유일한 해결책은 누락 된 데이터에 대해 값 (일반적으로 0)을 설정하는 것입니다.
카일 헤일

20

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

이는 각 필드의 배경색에서 색상을 수동으로 변경하는 것보다 훨씬 강력합니다.


1
이 스레드에 좋은 추가! 각 열에서 "True"또는 "False"를 설정하지 않아도됩니다. 나는 또한 "mod 3"옵션을 좋아해서 매 3 번째 줄만 가리킬 수 있습니다.
Baodad

나는 또한이 솔루션을 좋아합니다. 그러나 행 그룹화를 사용하면 작동하지 않습니다. 위 의 @ahmad의 솔루션 은 나를 위해 일했습니다.
Baodad

DataSet에 추가 필드를 추가하지 않으려는 경우 테이블 릭스에 대한 훌륭한 솔루션입니다!
clamchoda

16

내가 주목 한 한 가지는 상위 두 가지 방법 중 어느 것도 그룹에서 첫 번째 행의 색을 나타내는 개념이 없다는 것입니다. 그룹은 이전 그룹의 마지막 줄과 반대 색상으로 시작합니다. 나는 그룹이 항상 같은 색으로 시작하기를 원했습니다 ... 각 그룹의 첫 번째 행은 항상 흰색이어야하고 다음 행은 색이 지정되어야합니다.

기본 개념은 각 그룹이 시작될 때 토글을 재설정하는 것이므로 약간의 코드를 추가했습니다.

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

10

그룹 머리글 / 바닥 글의 경우 :

=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")

이것을 사용하여 각 그룹 내에서 행 색상 수를 "재설정"할 수도 있습니다. 각 하위 그룹의 첫 번째 세부 행이 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가 아니라는 경고가 나타납니다. SSRS에서 보고서 요소의 배경색 설정 에서 빠른 수정 사항을 찾았습니다 . "투명"대신에 아무것도 사용하지 마십시오

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

흰색이 Nothing보다 낫습니다.
Nate S.

6

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로 설정하여 클라이언트에서 숨기십시오.

짜잔! 또한이 스레드에서 언급 된 많은 문제를 해결합니다.

  • 하위 그룹에 대한 자동 재설정 : 해당 행 그룹 에 새 열을 추가 하고 그룹 값 에서 RunningValue 를 수행하십시오 .
  • True / False 토글에 대해 걱정할 필요가 없습니다.
  • 색상은 한 곳에서만 유지되므로 쉽게 수정할 수 있습니다.
  • 행 또는 열 그룹에서 상호 교환하여 사용할 수 있습니다 (너비 대신 높이를 0으로 설정).

SSRS가 텍스트 상자의 값 이외의 속성을 노출하는 것이 좋습니다. 행 그룹 텍스트 상자의 BackgroundColor 속성에 이러한 종류의 계산을 채우고 다른 모든 셀에서 ReportItems! RowGroup.BackgroundColor로 참조하면됩니다.

음, 우리는 꿈을 꿀 수 있습니다 ...


5

내 문제는 행의 모든 ​​열이 동일한 배경을 갖기를 원한다는 것입니다. 나는 내가 가진 행에 의해 열을 기준으로, 2 개의 솔루션 여기에 상단이 모두 그룹화 모든 컬러 배경 컬러 배경에 열 1 행, 흰색 배경에 열 2의 모든 행, 열 셋의 모든 행을 , 등등. 그것은 마치의 RowNumberbOddRow만 새로운 행과 번갈아 것을주의하십시오 (Catch22의 솔루션) 내 열 그룹 대신 무시합니다.

내가 원하는 것은 1 행의 모든 열에 흰색 배경이 있고 2 행의 모든 ​​열에 배경색이 있고 3 행의 모든 ​​열에 흰색 배경이있는 것입니다. 선택한 답변을 사용 하여이 효과를 얻었지만에 전달 Nothing하는 대신 RowNumber열 그룹의 이름을 전달했습니다.

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

이것은 다른 사람에게 유용 할 수 있다고 생각했습니다.


4

이 트릭은 여기서 논의되지 않았다고 생각합니다. 여기 있습니다.

복잡한 매트릭스의 모든 유형에서 행 단위 또는 열 단위의 대체 셀 색상을 원할 경우 작업 솔루션은 다음과 같습니다.

당신이 현명하게 다른 색의 세포를 원한다면,

  1. 보고서 디자인보기의 오른쪽 아래 모서리에있는 "열 그룹"에서 "FakeParentGroup"이라는 이름으로 1 (식 사용)에 가짜 부모 그룹을 만듭니다.
  2. 그런 다음 보고서 디자인에서 다르게 색칠 될 셀의 경우 다음 배경색 표현을 사용하십시오.

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

그게 다야.

대체 색상 행과 동일하게 솔루션을 편집해야합니다.

참고 : 여기에서 때로는 셀의 경계를 적절하게 설정해야하며 일반적으로 사라집니다.

또한 가짜 부모 그룹을 만들 때 그림에 나온 보고서에서 값 1을 삭제하는 것을 잊지 마십시오.


1
이 답변은 복잡한 테이블 릭스에서 행 밴딩을 만들어야하는 사람들에게 매우 유용합니다! 기존 상위 그룹이 있으면 사용하십시오. 그렇지 않으면 FakeParentGroup을 작성하십시오. 열 그룹과 행 그룹이 모두있는 테이블 릭스에서 누락 된 값은 일반적으로 서식을 해제합니다. 첫 번째 셀에서 누락 된 값을 설명하기 위해 @Aditya를 기반으로하는 내 대답을 참조하십시오.
rpyzh

2

전체 보고서에 대해 대체 색상이 필요한 경우 테이블 릭스가 보고서 전체의 ID 행 번호에 바인딩 된 DataSet을 사용하여 RowNumber 함수에서 사용할 수 있습니다.

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

2

@Aditya의 대답은 훌륭하지만 행의 첫 번째 셀 (행 배경 서식의 경우)에 결측 값이있는 경우 (열 / 행 그룹이있는 복잡한 테이블 릭스 및 결측 값) 서식이 해제되는 경우가 있습니다.

@Aditya의 솔루션 countDistinctrunningValue함수 결과를 영리하게 활용 하여 테이블 릭스 (행) 그룹 내 행 번호를 식별합니다. 첫 번째 셀에 결 측값이있는 테이블 릭스 행이있는 경우 결과 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

1

누군가 아래 코드에서 위의 나머지 필드를 거짓으로 바꾸는 논리를 설명 할 수 있습니까?

내가 주목 한 한 가지는 상위 두 가지 방법 중 어느 것도 그룹에서 첫 번째 행의 색을 나타내는 개념이 없다는 것입니다. 그룹은 이전 그룹의 마지막 줄과 반대 색상으로 시작합니다. 나는 그룹이 항상 같은 색으로 시작하기를 원했습니다 ... 각 그룹의 첫 번째 행은 항상 흰색이어야하고 다음 행은 색이 지정되어야합니다.

기본 개념은 각 그룹이 시작될 때 토글을 재설정하는 것이므로 약간의 코드를 추가했습니다.

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를 처음 접하는 사람이므로 개선 할 여지가 충분하다고 생각하지만 기본 아이디어는 건전 해 보입니다 (유용했습니다). 나를 위해) 그래서 나는 여기서 버리고 싶었다.


1

행 공간이있는 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 열 테이블 릭스의 경우 행의 셀에 대해 다음 식을 사용합니다.

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


0

매트릭스 데이터에 값이 누락되어 ahmad의 솔루션을 작동시킬 수 없었지만 이 솔루션은 저에게 효과적 이었습니다.

기본 아이디어는 색상을 포함하는 가장 안쪽 그룹에 자식 그룹과 필드를 만드는 것입니다. 그런 다음 해당 필드 값을 기준으로 행에서 각 셀의 색상을 설정하십시오.


@Aditya와 내 답변을 확인하여 행렬의 누락 된 값을 처리하십시오. 부모 그룹이 이미 있거나 가짜 그룹을 만들려는 경우에 유용합니다. 그런 식으로 별도의 필드를 만들 필요가 없습니다.
rpyzh 2016 년

0

나를 위해 일한 다른 답변을 약간 수정했습니다. 내 그룹에는 그룹화 할 두 가지 값이 있으므로 첫 번째 인수에 +를 사용하여 두 값을 모두 올바르게 대체 할 수있었습니다.

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

0

행과 열 그룹을 모두 사용할 때 같은 행이더라도 열 사이에서 색상이 번갈아 나타나는 문제가 발생했습니다. 행이 변경 될 때만 대체되는 전역 변수를 사용 하여이 문제를 해결했습니다.

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

첫 번째 열을 그린 후에 만 ​​색상을 번갈아 표시해야합니다.

이는 각 열에 대해 수학 계산을 수행 할 필요가 없기 때문에 (확인할 수없는) 성능도 향상시킬 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.