lunes, 1 de noviembre de 2010

Reutilización de informes en entornos de aplicación orientadas a productos

 

Merece la pena escribir este post, ya que me ha dado algún que otro dolor de cabeza hasta llegar a la solución. Vamos a jugar un ratito a pasar como parámetro la cadena de conexión para visualizar un informe mediante Report Viewer 2010.

 

Generando el informe con Report Builder 3.0

Esta herramienta, ya mencionada en posts anteriores, nos permitirá crear la definición del informe y obtener un archivo en formato RDL (Report Definition Language) se trata de un fichero estándar XML que nos permite cotillear las tripas y ver lo que ocurre en la “sala de máquinas”.

Primeramente tendremos que incluir un nuevo parámetro en el informe al que llamaremos BaseDatos, lo marcaremos como oculto, guardamos y salimos de Report Builder.

 

Modificando el RDL

Partiendo de cualquier informe generado previamente con dicha herramienta, solo nos queda guardar el archivo (en el escritorio de Windows por ejemplo) y usar el bloc de notas para ver en detalle la definición del mismo. Tendremos que localizar al principio del documento la sección ConnectString del elemento DataSource y modificarlo de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">
  <AutoRefresh>0</AutoRefresh>
  <DataSources>
    <DataSource Name="GIE">
      <ConnectionProperties>
        <DataProvider>SQL</DataProvider>
        <ConnectString>="Password=XXXX;Persist Security Info=True;User ID=XXXX;Data Source=XXXX;Initial Catalog=" &amp; Parameters!BaseDatos.Value</ConnectString>
      </ConnectionProperties>
      <rd:DataSourceID>2bf79f31-84cc-4a46-b53d-93fbf236f92d</rd:DataSourceID>
    </DataSource>
  </DataSources>

Lo que hemos modificado con respecto al original ha sido la inclusión de la expresión Parameters!BaseDatos.Value embebida en la cadena de conexión delDataSource

Os dejo un enlace de interés donde podréis indagar mas sobre estas cuestiones:http://msdn.microsoft.com/en-us/library/ms156450.aspx#Expressions

Hay otro punto importantísimo y que también me costo un buen rato, no se porque razón la definición del parámetro BaseDatos tiene que ser el primero de la colección, podemos observar también su definición en el propio documento RDL casi al final del archivo:

<ReportParameters>
  <ReportParameter Name="BaseDatos">
    <DataType>String</DataType>
    <Prompt>BaseDatos</Prompt>
    <Hidden>true</Hidden>
  </ReportParameter>
  <ReportParameter Name="IdUsuarioComercial">
    <DataType>Integer</DataType>
    <DefaultValue>
      <DataSetReference>
        <DataSetName>Comerciales</DataSetName>
        <ValueField>IdUsuario</ValueField>
      </DataSetReference>
    </DefaultValue>
    <Prompt>Comercial</Prompt>
    <ValidValues>
      <DataSetReference>
        <DataSetName>Comerciales</DataSetName>
        <ValueField>IdUsuario</ValueField>
        <LabelField>Comercial</LabelField>
      </DataSetReference>
    </ValidValues>
    <MultiValue>true</MultiValue>
  </ReportParameter>

 

Publicación del informe mediante Report Manager

Ya sabéis que Report Manager es la herramienta web que nos permite gestionar y publicar informes cuando nos basamos en RemoteMode, solo tendremos que asegurarnos de indicar que no se necesitan credenciales para la visualización del informe, os dejo la pantalla donde se parametriza:

report_manager

 

Report Viewer en Visual Studio

Os dejo el código a implementar desde Visual Studio con la llamada al informe:

if (!IsPostBack)
{
    ReportViewer1.ProcessingMode = ProcessingMode.Remote;
    ServerReport serverReport = ReportViewer1.ServerReport;
    serverReport.ReportServerUrl = new Uri(Properties.Settings.Default.ReportServer);
    serverReport.ReportPath = Request["ReportPath"].ToString();
    ReportParameter rp = new ReportParameter("BaseDatos",”XXXXX”);
    serverReport.SetParameters(rp);

}

Esto nos permitirá reutilizar informes que compartan diferentes bases de datos con misma estructura, imprescindible cuando se trata por ejemplo de desarrollo de aplicaciones orientadas a productos donde existe un único repositorio de ejecución de aplicación pero diferentes bases de datos (una para cada cliente).

Como inconveniente es que no podéis hacer ingeniería inversa, si abres el informe (ya modificado desde el bloc de notas anteriormente) mediante Report Manager al volverlo a publicar o grabar destroza la expresión de paso de parámetros de la cadena de conexión. Se lo comunicaremos a Redmond para que lo corrijan Guiño

No hay comentarios:

Related Posts Plugin for WordPress, Blogger...