【问题标题】:Changing Row Colors in SSRS Report via data values通过数据值更改 SSRS 报告中的行颜色
【发布时间】:2011-10-09 12:18:15
【问题描述】:

我知道您可以使用相当简单的表达式将 BackgroundColor 设置为在两种颜色之间交替。我有一列包含按顺序组织的日期值。基本上,我希望 BackgroundColor 在每次日期值更改时随着您向下行而交替。我用这段代码成功了:

=iif(Previous(Fields!Req_Del_Dt.Value) = (Fields!Req_Del_Dt.Value), "White", "Lavender")

这将在每次行的值与前一行不同时更改颜色。这就是结果的样子:

http://imageshack.us/photo/my-images/24/alternatingcolors.jpg/

我怎样才能使颜色在整个日期(可能是 3 行)更改为一种颜色,然后在下一次日期更改发生时“切换”为另一种颜色?我想我走在正确的轨道上,但我就是想不通。

我将不胜感激任何建议或 cmets。谢谢!

【问题讨论】:

    标签: ssrs-2008 reporting-services


    【解决方案1】:

    您可以编写自定义代码。例如:

    Private _dateCount As Integer = 0
    Function GetDateRowColor(ByVal previousDate As DateTime, ByVal currentDate As DateTime) As String
        If previousDate = currentDate Then
            ' Do nothing
        Else
            _dateCount++
        End If
    
        If _dateCount Mod 2 = 0 Then
            Return "White"
        Else
            Return "Lavender"
        End If
    End Function
    

    然后,在背景颜色中使用表达式,例如:

    =Code.GetDateRowColor(Previous(Fields!Req_Del_Dt.Value), Fields!Req_Del_Dt.Value)
    

    HTH。

    【讨论】:

    • Cam - 首先,精彩的代码!在我看到你在做什么之前,我不得不盯着它看了一会儿。如果我将它应用于单个单元格上的 BackgroundColor,它会很好地工作。但是,如果我将其应用于多个单元格(当您将其应用于整行时会发生这种情况),它就无法正常工作。我很确定这是因为它增加了每个单元格的计数器。您可以在此处查看结果示例:imageshack.us/photo/my-images/839/alternatingcolors2.jpg您能想出一种方法来使整行都有效吗?非常感谢您的帮助!
    【解决方案2】:

    知道了 - 我应该在回复之前更加努力。我必须跟踪当前行号,并且只在新行上切换值。修改后的代码:

    Private _dateCount As Integer = 0
    Private CurRowNumber as Integer = 0
    Private ColorValue as String = ""
    
    Function GetDateRowColor(ByVal previousDate As DateTime, ByVal currentDate As DateTime, MyRowNumber as Integer) As String
    
        'Check if this is a new row number...
        If MyRowNumber <> CurRowNumber then
           CurRowNumber = CurRowNumber  + 1 'New row, so increment counter
    
            If previousDate = currentDate Then
                ' Do nothing
            Else
                    _dateCount = _dateCount + 1
            End If
    
            If _dateCount Mod 2 = 0 Then
                    ColorValue = "White"
            Else
                    ColorValue = "Lavender"
            End If
       End If
    
            Return ColorValue 'Always return a value (for columns other than the first one)
    
    End Function
    

    这样称呼:

    =Code.GetDateRowColor(Previous(Fields!Req_Del_Dt.Value), Fields!Req_Del_Dt.Value, RowNumber(Nothing))
    

    再次感谢您您的出色回复和回答!

    【讨论】:

    • 您是否遇到过问题,在第 2 页,由于某些原因,上面的代码在第 1 页运行完美,但在第 2 页,它没有正确选择行。
    • 不。我的报告有几页长,所有的颜色编码都能正常工作。
    【解决方案3】:
    Public Function Setcolor(ByVal Runs AS Integer,ByVal Wickets AS Integer) AS String
        setcolor="Transperent"
        IF(Runs >=500 AND Wickets >=10) THEN return "Green"
        END IF
    END Function
    

    【讨论】:

      【解决方案4】:
      =IIF(RunningValue(Fields!Address.Value, CountDistinct, Nothing) MOD 2 = 1, "White", "Lavender")
      

      对我来说,这就是诀窍。

      【讨论】:

        【解决方案5】:

        我遇到了与 Loki70 相同的问题,并且非常喜欢 Nanu 的解决方案。

        但是,一旦我看到结果,我就想做更多。我想让主要信息出现一次,但在组的第一行之后“隐藏”这些行。一起使用 Nanu 和 Loki70 的代码,我能够将第一行之后的行的字体颜色设置为与填充相同的颜色。从而隐藏该单元格的文本。

        =IIF(Previous(Fields!Req_Del_Dt.Value) <> (Fields!Req_Del_Dt.Value), "Black", 
            IIF(RunningValue(Fields!Req_Del_Dt.Value, CountDistinct, Nothing) MOD 2 = 1, 
            "White", "Lavender"))
        

        我用它来隐藏一行中显示相同信息的前几个单元格,然后显示该子组不同的其他单元格。

        【讨论】:

          【解决方案6】:

          这是一个简单的解决方案。首先,我假设您正在使用 MSSQL,因为问题是关于 SSRS。您可以直接从查询中选择值,因此在报表本身中,您只需根据单个值设置背景颜色,而不是范围...

          假设你想在报告Req_Del_Dt.Value 中显示不同的颜色,根据它的范围......所以,你可以查询这样的内容>

          select *,
              case when Req_Del_Dt < 30 then 1
              when Req_Del_Dt between 30 and 60 then 2
              when Req_Del_Dt between 61 and 90 then 3
              when Req_Del_Dt between 91 and 150 then 4
              else 5 end as color_range
          from source_table
          

          在 SSRS 中,您只需转到 BackgroundColor 属性,在显示 req_del_det 的文本框的填充部分中,选择颜色表达式,然后编写类似这样的内容>

              =SWITCH(Fields!color_range.Value = 1, "#ffffff", 
              Fields!color_range.Value = 2, "#ffebeb",
              Fields!color_range.Value = 3, "#ffd8d8",
              Fields!color_range.Value = 4, "#ffc4c4",
              Fields!color_range.Value = 5, "#ffb1b1")
          

          【讨论】:

          • 如果您更彻底地阅读了我的问题,我不只是使用单元格中的值来确定行颜色 - 我使用的是上一行中的值,这已包含在接受的答案中.无论如何,谢谢。
          【解决方案7】:

          我也遇到过类似的问题:

          • SSRS 16 中的 Tablix/表格
          • 不能分组(会干扰 tablix 的其他功能)
          • 需要在日期字段中替换具有相同值的行的颜色块
          • 可能会再次出现相同的日期值(这很重要,因为Nanus Answer 即 CountDistinct 的使用取决于相同的值(日期)不会在以后的块中再次出现)。

          对我来说,Loki70 revised answer 中的代码不起作用。几行随机块的第一行将在单元格中具有交替的颜色。但是,一旦我重写了代码,它就起作用了:

          Private _dateCount As Integer = 0
          Private RowNumberRunner as Integer = 0
          Private ColorValue as String = ""
          
          Function GetDateRowColor(ByVal previousDate As DateTime, ByVal currentDate As DateTime, MyRowNumber as Integer) As String
          
             If MyRowNumber <> RowNumberRunner Then 
                RowNumberRunner = MyRowNumber
                If previousDate <> currentDate Then 
                   _dateCount = _dateCount + 1
                End If
             End If
          
             If _dateCount Mod 2 = 1 Then 
                ColorValue = "White"
             Else ColorValue = "Lavender"
             End If
          
             Return ColorValue 
          End Function
          

          不知道为什么会这样,而之前的代码却没有。功能相同,只是写法不同。它的调用方式相同:

          =Code.GetDateRowColor(Previous(Fields!Req_Del_Dt.Value), Fields!Req_Del_Dt.Value, RowNumber(Nothing))
          

          【讨论】:

            猜你喜欢
            • 2015-10-14
            • 2014-01-05
            • 1970-01-01
            • 2013-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-08
            • 2015-07-19
            相关资源
            最近更新 更多