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:
Publicar un comentario