sábado, 25 de mayo de 2013

Una regla de color uniforme, redondeada, con cero y colores desplazados (2)

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.

El diseñador de informes de MS (BIDS) no nos permite definir reglas de color automáticas para nuestros requisitos, deberemos utilizar intervalos y colores personalizados.

Dado que esta personalización depende de los valores de la consulta no puede estar establecida en el informe, y deberemos modificar este cada vez que vayamos a visualizarlo.

En esta entrada vamos a ver como cargar un informe desde el servidor SSRS en nuestro programa cliente, modificar el XML e inyectar el resultado en un control ReportViewer que finalmente solicitará al servidor el procesado.

SOLUCIÓN:

Partimos de que hemos creado una página web que contiene un control ReportViewer llamado Visor y que está configurado para remoteProcessing.
Usaremos la libreria ReportingServices2010 nos permite recuperar la definición de un informe  mediante los servicios Web de reporting services:

Imports mapasAduanas.Microsoft.SqlServer.ReportingServices2010

El esquema de nuestro proceso será:
 
Sub Main()
 Dim informe as byte()=cargaInforme(nombre as string) 'cargamos el informe
 Dim informeXML as system.XML.linq.xDocument= bytesToXML(informe)  'lo pasamos a XML
 informeXML=parametrizaMapa(informeXML, sentenciaMDX,10)  'Personalizamos e informe
 informe = XMLtoBytes(InformeXML)  'Volvemos a array de bytes
 Visor.ServerReport.LoadReportDefinition(informe) 'lo cargamos en el visor de informes.
 Visor.ServerReport.Refresh()
End Sub 

Deberemos importar la librería de acceso proxy al SSRS
Imports mapasAduanas.Microsoft.SqlServer.ReportingServices2010

Para poder cargar el informe:

    Private Function CargaInforme(nombre As String) As byte()
        Dim SSRS As New ReportingService2010
        SSRS.Credentials = (New MyReportServerCredentials).NetworkCredentials
        Dim informe = SSRS.GetItemDefinition(My.Settings.pathMapas + nombre)
        SSRS = Nothing
        Return doc
    End Function

Para conectarnos necesitamos suministrar una credenciales utilizando la clase myReportServerCredentials descrita en Autenticación Reporting Services.

La función getItemDefinition y  nuetra función CargaInforme nos devuelven una matriz de bytes que deberemos convertir en un documento system.XML.link.xDocument para poder editarla:
    Private Function bytesToXML(informe As byte()) As xDocument
        Dim stream = New System.IO.MemoryStream(informe)
        Dim lector = System.Xml.XmlReader.Create(stream)
        Dim doc As XDocument = XDocument.Load(lector, LoadOptions.None)
        Return doc
    End Function

Cuando hayamos terminado de personalizar este documento deberemos volverlo a convertir en matriz de bytes.

   Private Function XMLBytes(doc As XDocument) As System.IO.Stream
        Dim stream As New System.IO.MemoryStream
        Dim escritor = System.Xml.XmlWriter.Create(stream)
        doc.Save(escritor)
        escritor.Close()
        stream.Position = 0
        Return stream
    End Function

En la siguiente entrada editaremos el XML del informe usando linq-to-xml.

No hay comentarios: