Sql server 向SQL Server Reporting services报表添加交替行颜色

Sql server 向SQL Server Reporting services报表添加交替行颜色,sql-server,reporting-services,formatting,Sql Server,Reporting Services,Formatting,如何在SQL Server Reporting Services报表中对交替行进行着色 编辑:下面列出了一系列好的答案——从和到。唉,我只能选择一个…转到表行的BackgroundColor属性并选择“表达式…” 使用以下表达式: = IIf(RowNumber(Nothing) Mod 2 = 0, "Silver", "Transparent") 此技巧可应用于报告的许多领域 在.NET 3.5+中,您可以使用: = If(RowNumber(Nothing) Mod 2 = 0, "S

如何在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)

有关组页眉/页脚的完整详细信息,请参见此

=iif(RunningValue(*group on field*,CountDistinct,"*parent group name*") Mod 2,"White","AliceBlue")
您还可以使用此选项“重置”每个组中的行颜色计数。我希望每个子组中的第一个详细信息行以白色开头,此解决方案(在详细信息行上使用时)允许这种情况发生:

=IIF(RunningValue(Fields![Name].Value, CountDistinct, "NameOfPartnetGroup") Mod 2, "White", "Wheat")

请看:

我注意到的一件事是,前两种方法都不知道组中第一行应该是什么颜色;该组将从上一组最后一行的相反颜色开始。我希望我的组总是以相同的颜色开始…每个组的第一行应该总是白色的,下一行应该是彩色的

基本概念是在每个组启动时重置切换,因此我添加了一些代码:

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
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
我现在有三种不同的细胞背景:

  • 数据行的第一列has=Code.AlternateColor(“AliceBlue”,“White”,True)(这与前面的答案相同)
  • 数据行的其余列具有=Code.AlternateColor(“AliceBlue”、“White”、False)(这也与前面的答案相同)
  • 分组行的第一列has=Code.restarcolor(“AliceBlue”)(这是新的。)
  • 分组行的其余列具有=Code.AlternateColor(“AliceBlue”、“White”和False)(以前使用过此选项,但未提及它用于分组行。)
  • 这对我有用。如果您希望分组行是非彩色的,或者是不同的颜色,那么从这里可以明显看出如何更改它


    请随意添加关于如何改进此代码的评论:我对SSRS和VB都是全新的,因此我强烈怀疑有很大的改进空间,但基本想法似乎是合理的(对我很有用)所以我想把它扔到这里。

    我的问题是我希望一行中的所有列都具有相同的背景。我按行和按列进行分组,在这里,使用最上面的两个解决方案,我得到了列1中所有带彩色背景的行,列2中所有带白色背景的行,列3中所有带彩色背景的行,依此类推。这就好像
    RowNumber
    bOddRow
    (Catch22的解决方案)注意我的列组,而不是忽略它,只与新行交替

    我希望第1行中的所有列都有白色背景,第2行中的所有列都有彩色背景,第3行中的所有列都有白色背景,依此类推。我通过使用所选答案获得了这种效果,但我没有将
    Nothing
    传递给
    RowNumber
    ,而是传递了列组的名称,例如

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

    我认为这可能对其他人有用。

    如果整个报表需要交替颜色,您可以将Tablix绑定到的数据集用于报表上的报表范围标识行号,并在rownumber函数中使用该数据集

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

    迈克尔·哈伦的解决方案对我很有效。然而,我得到一个警告,说“透明”不是一个有效的背景色预览时。从中找到了一个快速修复方法 . 不使用任何内容而不是“透明”


    当我使用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))
    

    这比手动更改每个字段背景色的颜色要可靠得多。

    有人能解释一下在下面的代码中将其余字段变为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
    
    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
    
    我现在有三种不同的细胞背景:

  • 数据行的第一列has=Code.AlternateColor(“AliceBlue”,“White”,True)(这与前面的答案相同)
  • 数据行的其余列具有=Code.AlternateColor(“AliceBlue”、“White”、False)(这也与前面的答案相同)
  • 分组行的第一列has=Code.restarcolor(“AliceBlue”)(这是新的。)
  • 分组行的其余列具有=Code.AlternateColor(“AliceBlue”、“White”和False)(以前使用过此选项,但未提及它用于分组行。)
  • 这对我有用。如果你愿意
    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
    
    =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