ENUNCIADO:
En la primera entrada de esta serie presentamos nuestro objetivo: Personalizar la regla de colores en un mapa incluido en un informe SSRS de forma que los valores y colores cumplieran ciertos requisitos.En la segunda entrada vimos cómo podíamos cargar en memoria del cliente la definición XML de un informe SSRS para poder modificarla antes de entregarsela al control ReportViewer.
En esta entrada veremos como modificamos la entrada XML.
SOLUCIÓN:
El código esta comentado:Public Function ParametrizaMapa(informe As XDocument,
s as string,
numRangos as integer) As XDocument ' s contiene una sentencia MDX
' numRangos numero de rangos que deseamos
'Calculamos los rangos de la regla de colores
dim rangosMapa As List(Of Double)=rangosMapa(s,numRangos)
' Para escribir menos.
Dim df = informe.Root.Name.Namespace
Dim capas = informe.Root.Element(
df + "ReportSections").Element(
df + "ReportSection").Element(
df + "Body").Element(
df + "ReportItems").Element(
df + "Map").Element(
df + "MapLayers").Element(
df + "MapPolygonLayer")
' comienzan las reglas de color
Dim reglasColor As XElement
' borramos cualquier regla existente en el informe original
If capa.Element(df + "MapPolygonRules").Element(df + "MapColorRangeRule") IsNot Nothing Then
capa.Element(df + "MapPolygonRules").Element(df + "MapColorRangeRule").Remove()
end if
If capa.Element(df + "MapPolygonRules").Element(df + "MapCustomColorRule") IsNot Nothing Then
capa.Element(df + "MapPolygonRules").Element(df + "MapCustomColorRule").Remove()
end if
'Vamos a establecer los colores y sus degradados
If rangosMapa.Contains(0) Then
'mapa coloreado alrededor del cero
'hay que generar la personalización "MapColorRangeRule" mediante la función coloresCero
capa.Element(df + "MapPolygonRules").Add(New XElement(df + "MapCustomColorRule"))
reglasColor = capa.Element(df + "MapPolygonRules").Element(df + "MapCustomColorRule") 'Personalizado
reglasColor.Add(New XElement(df + "MapCustomColors"))
Dim colorines = reglasColor.Element(df + "MapCustomColors")
dim colores as list (of String)= coloresCero(rangosMapa) 'obtenemos una lista de colores
For Each color In colores
colorines.Add(New XElement(df + "MapCustomColor", color))
Next
Else
'mapa estándar podemos dejar utilizar la generación automática "MapColorRangeRule"
capa.Element(df + "MapPolygonRules").Add(New XElement(df + "MapColorRangeRule")) 'Generado por SSRS
reglasColor = capa.Element(df + "MapPolygonRules").Element(df + "MapColorRangeRule")
reglasColor.Add(New XElement(df + "StartColor", My.Settings.ReglaColorInicio))
reglasColor.Add(New XElement(df + "MiddleColor", My.Settings.ReglaColorIntermedio))
reglasColor.Add(New XElement(df + "EndColor", My.Settings.reglaColorFin))
End If
'algunas cosas que siempre son necesarias
reglasColor.Add(New XElement(df + "ShowInColorScale", "true"))
reglasColor.Add(New XElement(df + "DataValue", "=Sum(Fields!Dato.Value)"))
reglasColor.Add(New XElement(df + "BucketCount", rangosMapa.count.toString))
reglasColor.Add(New XElement(df + "LegendText", "#FROMVALUE{N0} - #TOVALUE{N0}"))
'Vamos a rellenar los rangos de valores
Dim culturaUSA = New System.Globalization.CultureInfo("en-US")
If rangosMapa.Count = 2 Then 'solo max y min
reglasColor.Add(New XElement(df + "DistributionType", "EqualInterval"))
reglasColor.Add(New XElement(df + "StartValue"), rangosMapa(0).ToString(culturaUSA.NumberFormat))
reglasColor.Add(New XElement(df + "EndValue"), rangosMapa(1).ToString(culturaUSA.NumberFormat))
Else
'aquí es donde realmente estamos personalizando con nuestro rango personalizado
reglasColor.Add(New XElement(df + "DistributionType", "Custom"))
reglasColor.Add(New XElement(df + "MapBuckets"))
Dim rangos = reglasColor.Element(df + "MapBuckets")
For i = 0 To rangosMapa.Count - 2
rangos.Add(New XElement(df + "MapBucket"))
Dim rango = rangos.Elements(df + "MapBucket")(i)
rango.Add(New XElement(df + "StartValue", rangosMapa(i).ToString(culturaUSA.NumberFormat)))
rango.Add(New XElement(df + "EndValue", (rangosMapa(i + 1)).ToString(culturaUSA.NumberFormat)))
Next
End If
'Establecemos la sentencia MDX que suministra los datos al informe
Dim xdatos = (From f In doc.Root.Element(df + "DataSets").Elements(df + "DataSet")).First(
Function(x As XElement) x.Attribute("Name") = "Datos").Element(df + "Query").Element(df + "CommandText")
xdatos.SetValue(s)
Return informe
End Function
Con esto hemos terminado la personalización del informe, nos quedan por definir las dos funciones rangosMapa y coloresCero que presentaremos en la siguientes entradas
No hay comentarios:
Publicar un comentario