programing

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

i4 2023. 6. 10. 08:18
반응형

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

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

그런 다음 각 셀에서 배경색을 다음과 같이 설정합니다.

=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. 데이터 행의 첫 번째 열에는 = 코드가 있습니다.대체 색상("AliceBlue", "White", True)(이전 답변과 동일합니다.)
  2. 데이터 행의 나머지 열에는 = 코드가 있습니다.대체 색상("AliceBlue", "White", False)(또한 이전 답변과 동일합니다.)
  3. 그룹화 행의 첫 번째 열에 = 코드가 있습니다.색상 다시 시작("AliceBlue")(새 버전입니다.)
  4. 그룹화 행의 나머지 열에는 = 코드가 있습니다.AliceBlue("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

Michael Haren의 해결책은 저에게 잘 맞습니다.그러나 미리보기 시 "투명"이 올바른 배경색이 아니라는 경고가 표시되었습니다.SSRS에서 보고서 요소의 배경색 설정에서 빠른 수정을 찾았습니다."투명" 대신 "아무것도 사용 안 함"

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

VB를 사용하지 않고 이 문제를 해결하는 유일한 효과적인 방법은 행 그룹 내에서 행 그룹화 모듈로 값을 "저장"하고 열 그룹화 내에서 이 값을 명시적으로 참조하는 것입니다.이 솔루션을 찾은 곳은

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

그러나 Ankeet은 무슨 일이 일어나고 있는지 설명하는 최선의 작업이 아니며, 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로 설정하여 클라이언트에서 숨깁니다.

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

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

SSRS가 텍스트 상자의 값 외에 속성을 노출하면 멋질 것입니다.행 그룹 텍스트 상자의 BackgroundColor 속성에 이러한 종류의 계산을 입력한 다음 ReportItems로 참조하면 됩니다!행 그룹.다른 모든 셀의 배경색입니다.

아 글쎄, 우리는 꿈을 꿀 수 있어요...

제 문제는 한 줄에 있는 모든 열의 배경이 같았으면 좋겠다는 것이었습니다.행별 및 열별로 그룹화했습니다. 여기서 상위 두 솔루션을 사용하면 1열의 모든 행이 배경색으로 표시되고, 2열의 모든 행이 배경색으로 표시되며, 3열의 모든 행이 배경색으로 표시됩니다.마치RowNumber그리고.bOddRow(Catch22의 솔루션 중) 이를 무시하고 새 행과 교대하는 대신 내 열 그룹에 주의를 기울입니다.

제가 원했던 것은 1행의 모든 열은 흰색 배경을, 2행의 모든 열은 색 배경을, 3행의 모든 열은 흰색 배경을 가지라는 것입니다.합격 대신 선택한 답변을 사용하여 이 효과를 얻었습니다.NothingRowNumber컬럼 그룹의 이름을 전달했습니다. 예를 들어 전달했습니다.

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

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

저는 이 속임수가 여기서 논의되지 않았다고 생각합니다.자, 여기 있습니다.

어떤 유형의 복잡한 행렬에서도 행 단위 또는 열 단위로 대체 셀 색상을 원할 때, 작업 솔루션은 다음과 같습니다.

만약 당신이 다른 색의 셀을 열로 원하신다면,

  1. 보고서 설계 보기의 오른쪽 하단 모서리에 있는 "열 그룹"에서 "FakeParentGroup"이라는 이름의 1(식 사용)에 가짜 상위 그룹을 만듭니다.
  2. 그런 다음 보고서 설계에서 대체 색상으로 지정할 셀에 대해 다음 배경색 표현식을 사용합니다.

=IIF(실행값(필드![ColumnGroupField].Value, countDistinct, "FakeParentGroup") MOD 2, "White", "LightGrey")

이상입니다.

대체 색상 행에 대해서도 마찬가지이며, 그에 따라 솔루션을 선택하면 됩니다.

참고: 여기서는 때때로 세포의 경계를 적절히 설정해야 합니다. 보통은 사라집니다.

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

전체 보고서에 대해 대체 색상이 필요한 경우 보고서의 전체 ID 행 번호에 대해 Tablix가 바인딩된 데이터 설정을 사용하고 RowNumber 함수에서 이를 사용할 수 있습니다.

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

@Aditya의 답변은 좋지만 행의 첫 번째 셀(행 배경 포맷용)에 결측값이 있는 경우(열/행 그룹이 있고 결측값이 있는 복잡한 표제에서) 형식이 해제되는 경우가 있습니다.

은 @아디티아솔영활용다니합게리하루의은션▁@ly▁@▁leverages▁clever아다▁solution를 교묘하게 활용합니다.countDistinctrunningValue테이블릭스(행) 그룹 내에서 행 번호를 식별하는 함수입니다.첫 번째 셀에 결측값이 있는 테이블릭스 행이 있는 경우runningValue 가하지않countDistinct결과를 입력하면 이전 행의 번호가 반환됩니다(따라서 해당 셀의 형식에 영향을 미칩니다).이를 설명하려면 다음을 상쇄하기 위해 추가 항을 추가해야 합니다.countDistinct행의 첫 value. 행 그룹 자체의 첫 번째 실행 값을 확인했습니다(아래 스니펫의 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
'*************************************************************************
'-- 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. 데이터 행의 첫 번째 열에는 = 코드가 있습니다.대체 색상("AliceBlue", "White", True)(이전 답변과 동일합니다.)
  2. 데이터 행의 나머지 열에는 = 코드가 있습니다.대체 색상("AliceBlue", "White", False)(또한 이전 답변과 동일합니다.)
  3. 그룹화 행의 첫 번째 열에 = 코드가 있습니다.색상 다시 시작("AliceBlue")(새 버전입니다.)
  4. 그룹화 행의 나머지 열에는 = 코드가 있습니다.AliceBlue("AliceBlue", "White", False) (이전에 사용된 것이지만 그룹화 행에 대한 언급은 없습니다.

이것은 나에게 효과가 있습니다.그룹화 행을 비색상 또는 다른 색으로 지정하려면 그룹화 행을 변경하는 방법이 이 방법에서 상당히 분명해야 합니다.

이 코드를 개선하기 위해 수행할 수 있는 작업에 대한 의견을 자유롭게 추가하십시오.저는 SSRS와 VB 모두에 대해 처음이라 개선의 여지가 충분하다고 강하게 의심하지만, 기본 아이디어는 건전한 것처럼 보여서 (그리고 저에게 유용했습니다) 여기에 버리고 싶었습니다.

행 공간이 있는 그룹화된 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열 Tablix의 경우 행( 셀) 백컬러에 대해 다음 식을 사용합니다.

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

위의 답변 중 어떤 것도 제 매트릭스에서 작동하지 않는 것 같았기 때문에, 저는 이것을 여기에 올립니다.

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

매트릭스 데이터에 결측값이 포함되어 있어서 아흐마드의 솔루션을 사용할 수 없었지만 이 솔루션은 저에게 효과가 있었습니다.

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

저에게 효과가 있었던 다른 답변들을 약간 수정했습니다.우리 그룹에는 그룹화해야 할 두 개의 값이 있기 때문에 +를 사용하여 두 값을 첫 번째 Arg에 모두 넣을 수 있었습니다.

= 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

이제 대체할 행의 첫 번째 열에서 색상 식을 다음으로 설정합니다.

= 코드. 대체 색상()

-

나머지 열에서 모두 다음으로 설정합니다.

=코드.BG컬러

이렇게 하면 첫 번째 열이 그려진 후에만 색상이 번갈아 표시됩니다.

각 열에 대해 수학 계산을 수행할 필요가 없기 때문에 성능도 (검증할 수 없을 정도로) 향상될 수 있습니다.

언급URL : https://stackoverflow.com/questions/44376/add-alternating-row-color-to-sql-server-reporting-services-report

반응형