Как обеспечить согласованность цветов от диаграммы к диаграмме в службах Reporting Services 2005? - PullRequest
2 голосов
/ 14 января 2010

Я создал собственную цветовую палитру для своих диаграмм, используя метод, описанный в TechNet.

У меня также есть серия диаграмм с детализацией по столбцам, где вы щелкаете по одному столбцу, и он передает параметр на следующую диаграмму и так далее, создавая вид развертки.

Мои графики состоят из 3 видов труда и имеют три цвета на основной диаграмме. Когда я перехожу к следующему графику, некоторые категории не имеют всех трех видов труда, которые есть у основной. Таким образом, первый цвет в палитре назначается серии, хотя это был второй цвет на предыдущем графике. Я хотел бы избежать этого, если это возможно.

Таким образом, значение данных будет зеленым на первом графике (2-й в порядке цветов) и желтым на следующем графике (1-й в порядке цветов). Как сделать так, чтобы графики «запоминали» общее количество групп рядов, которые были на первом графике?

Это Reporting Services 2005.

Ответы [ 4 ]

2 голосов
/ 15 января 2010

Вы не можете это исправить с помощью пользовательских цветовых палитр.

Что вы можете сделать, это присвоить типу работы цвет в базе данных (использовать HEX проще всего). Затем передайте это в вашем наборе данных. Затем установите свойство цвета для вас шестнадцатеричное значение.

1 голос
/ 14 января 2010

К сожалению, это невозможно. Я долго искал это ...

0 голосов
/ 01 июля 2010

Я решил это чрезвычайно просто.

В моем родительском отчете я имею, скажем, 12 полей серии, каждое из которых получает свой собственный цвет на диаграмме, в моем дочернем отчете я просто сохраняю все серии на диаграмме, например, переходя от столбчатой ​​диаграммы к линейной диаграмме, используя развернуть, но я контролирую их видимость ...

Так что в дочернем отчете в Свойствах серии -> Видимость я просто добавляю выражение: = (Поля! ContentType.Value <> Параметры! ContentType.Value)

Таким образом, отчет только сохраняет видимость значения, на которое нажали, и скрывает все остальные, а цвета остаются неизменными:)

0 голосов
/ 15 января 2010

Мне удалось решить эту проблему, потому что я использовал собственную цветовую палитру, реализованную в виде хэш-таблицы. Я в основном сериализовал эту информацию и передал ее скрытому параметру в подотчете, а затем перефлировал структуру данных.

Это не идеально, но пока работает.

' Define some globals, including the color palette '
Private colorPalette As String() = _
    {"#FFF8A3", "#A9CC8F", "#B2C8D9", "#BEA37A", "#F3AA79", "#B5B5A9", "#E6A5A4", _
     "#F8D753", "#5C9746", "#3E75A7", "#7A653E", "#E1662A", "#74796F", "#C4384F", _
     "#F0B400", "#1E6C0B", "#00488C", "#332600", "#D84000", "#434C43", "#B30023"}
     ' color palette pulled from SAP guidelines '
     ' http://www.sapdesignguild.org/resources/diagram_guidelines/color_palettes.html '
Private count As Integer = 0
Private colorMapping As New System.Collections.Hashtable()
' Create a custom color palette '
Public Function GetColor(ByVal groupingValue As String) As String
    If colorMapping.ContainsKey(groupingValue) Then
        Return colorMapping(groupingValue)
    End If
    Dim c As String = colorPalette(count Mod colorPalette.Length)
    count = count + 1
    colorMapping.Add(groupingValue, c)
    Return c
End Function

' In custom actions of the data value, set the results of this '
' function to the mapping parameter in the next report '
Public Function PassColorMapping() As String
    If colorMapping.Count = 0 Then
        Return Nothing
    End If
    Try
        ' convert the hashtable to an array so it can be serialized '
        Dim objHash As Object()() = ToJaggedArray(colorMapping)

        ' serialize the colorMapping variable '
        Dim outStream As New System.IO.StringWriter()
        Dim s As New System.Xml.Serialization.XmlSerializer(GetType(Object()()))
        s.Serialize(outStream, objHash)

        ' move on to the next report '
        Return outStream.ToString()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Function

Я столкнулся с проблемой, из-за которой не смог найти эквивалент события onLoad для отчета. Так как я не был уверен, куда поместить этот код, я вставил его в цвет фона области графика. Поэтому я всегда возвращаю "WhiteSmoke". Я изменю это, если смогу найти подходящее место, чтобы поставить его.

' Call this function when the report loads to get the series groups '
' that have already been loaded into the custom color palette '
' Pass in the parameter used to store the color mapping '
Public Function InflateParamMapping(ByVal paramMapping As Parameter) As String
    Try
        If paramMapping.Value Is Nothing Then
            Return "WhiteSmoke"
        ElseIf colorMapping.Count = 0 Then      
            Dim pXmlized As String = paramMapping.Value
            ' deserialize the mapping parameter '
            Dim s As New System.Xml.Serialization.XmlSerializer(GetType(Object()()))

            ' get the jagged array and convert to hashtable '
            Dim objHash As Object()() = DirectCast(s.Deserialize(New System.IO.StringReader(pXmlized)), Object()())
            ' stick the result in the global colorMapping hashtable '
            colorMapping = ToHashTable(objHash)
            count = colorMapping.Count
        End If
    Catch ex As Exception
'       MsgBox(ex.Message) '
    End Try
    Return "WhiteSmoke"
End Function

ToJaggedArray() и ToHashTable() являются вспомогательными функциями, поскольку HashTable не сериализуем, поскольку они реализуют IDictionary. Я спешил, поэтому я быстро преобразовал их в массив. Код взят из сериализации Collection в ASP.NET Web Services Статья написана Марком Ричманом. Я преобразовал код из C # в VB.NET для использования в отчете.

Public Function ToJaggedArray(ByVal ht As System.Collections.HashTable) As Object()()
    Dim oo As Object()() = New Object(ht.Count - 1)() {}
    Dim i As Integer = 0
    For EAch key As Object in ht.Keys
        oo(i) = New Object() {key, ht(key)}
        i += 1
    Next
    Return oo
End Function

Public Function ToHashTable(ByVal oo As Object()()) As System.Collections.HashTable
    Dim ht As New System.Collections.HashTable(oo.Length)
    For Each pair As Object() In oo
        Dim key As Object = pair(0)
        Dim value As Object = pair(1)
        ht(key) = value
    Next
    Return ht
End Function

Теперь в самом отчете вам нужно сделать пару вещей.

  • Добавить ссылку на System.Xml в Свойства отчета в обоих отчетах.
  • В Действиях вашего родительского отчета установите для параметра, содержащего вашу структуру данных, значение =Code.PassColorMapping()
  • В разделе Область печати вашего отчета поместите это выражение для фона: =Code.InflateParamMapping(Parameters!colorMapping)
  • И, конечно же, в Заполните для ваших данных Стиль серии на обеих диаграммах поместите это выражение: =Code.GetColor(Fields!Type.Value)

Вы можете продолжать делать это для любого количества вложенных отчетов - в настоящее время у меня есть 3 уровня детализации, и он отлично работает.

...