Llamando a nuestro informe desde el ReportViewer.
Normalmente creamos nuestro informe con alguna herramienta y lo previsualizamos para ver que todo anda correctamente, retocamos, vemos que va como queremos y lo preparamos para que se pueda ver desde alguna aplicación.
Tenemos dos formas de tener nuestro informe. Una es de forma local y otra de forma remota.
La local es cuando los informes los tenemos localizado en algún lugar, es decir, en alguna carpeta de nuestro equipo por ejemplo.
Cuando decimos que nuestro informe está en el servidor, significa que este está alojado en algún servidor de informes del servidor de base de datos sql server(en mi caso 2005). Esto lo hacemos desde un proyecto de tipo servidor de informes desde el ide de visual studio, pero bueno, eso es otro tema. El caso es que, cuando tenemos este informe listo, no solo basta con tenerlo, sino que hay que subirlo al servidor. Para hacer esto, tan solo tendremos que asignarle la ubicación del servidor de informes(normalmente: http://[localhost]ó[unaIP]ó[nombreDelServidor]/[reportserver]ó[reportserver$NombreInstancia]) y la carpeta donde almacenaremos nuestro informe, si este no va en el raíz del sitio. Una vez hecho esto, implementamos y el informe estará subido.
Ahora queda llamarlo. Podemos llamarlo desde el browser o desde un control nuevo llamado ReportViewer.
Yo prefiero llamarlo desde el ReportViewer, y tenerlo todo controlado, desde el browser podemos llamarlo con parámetros incluso desde la url, pero la verdad no lo utilizé mucho. Esto no significa que desde un browser no se pueda controlar ni mucho menos.
Ahora voy a explicar como configurar algunas propiedades del ReportViewer cuando estamos tratando con un informe desde un servidor de informes.
Para llamar un informe de forma remota, como ya dije antes, tan solo tenemos que especificar el servidor de informes, la carpeta(esta es opcional) y el informe.
Visual Basic:
' Le indicamos la carpeta y el informe si la extensión de este.
Me.ReportViewer1.ServerReport.ReportPath = "CarpetaDondeEsteMiInforme/MiInforme(sin la extensión)"
' Y el servidor donde está alojado el informe.
Me.ReportViewer1.ServerReport.ReportServerUrl = _
New System.Uri("http://[localhost] ó [mi servidor] ó [UnaIP]/" & _
"[reportserver] ó [reportserver$MiInstancia]/")
C#:
// Le indicamos la carpeta y el informe sin la extensión de este.
this.reportViewer1.ServerReport.ReportPath = "CarpetaDondeEsteMiInforme/MiInforme(sin la extensión)";
// Y el servidor donde está alojado el informe.
this.reportViewer1.ServerReport.ReportServerUrl =
new System.Uri("http://[localhost] ó [mi servidor] ó [UnaIP]/" +
"[reportserver] ó [reportserver$MiInstancia]/");
Si además nuestro informe tiene parámetros, no hace falta mostrar los controles que pone el reportviewer para cada parámetro, que están muy bien para introducirlos nosotros mismos al probar nuestro informe. ¿Pero y si queremos controlar que es lo que mete el usuario?, para ello podemos crear nosotros nuestros controles personalizados, métodos de comprobación y otros métodos. Luego una vez hecho estas comprobaciones podremos introducir nuestros parámetros también desde código.
En este caso para meter uno o varios parámetros deberemos de crear un array de la clase ReportParameter o una colección de estos. Cada parámetro deberá de llevar el nombre del parámetro al que se le va a pasar un valor o conjunto de valores y opcionalmente un valor booleano que nos indicará si el parámetro se muestra en la interfaz de usuario o no.
Ejemplo con dos formas diferentes de meter los parámetros.-
Visual Basic:
' Creo una colección de parámetros de tipo ReportParameter
' para añadirlos al control ReportViewer.
Dim parametros As New List(Of ReportParameter)
' Añado los parámetros necesarios.
parametros.Add(New ReportParameter("NombreDelParámetro", "Valor o Array de valores"))
' Añado el/los parámetro/s al ReportViewer.
Me.ReportViewer1.ServerReport.SetParameters(parametros)
' Creo uno o varios parámetros de tipo ReportParameter con sus valores.
Dim parametro As New ReportParameter("NombreDelParámetro", "Valor o Array de valores")
' Añado uno o varios parámetros(En este caso solo uno al ReportViewer
Me.ReportViewer1.ServerReport.SetParameters(parametro)
C#:
// Creo una colección de parámetros de tipo ReportParameter
// para añadirlos al control ReportViewer.
List<ReportParameter> parametros = new List<ReportParameter>();
// Añado los parámetros necesarios.
parametros.Add(new ReportParameter("NombreDelParámetro","Valor o Array de valores"));
// Añado el/los parámetro/s al ReportViewer.
this.reportViewer1.ServerReport.SetParameters(parametros);
// Creo uno o varios parámetros de tipo ReportParameter con sus valores.
ReportParameter parametro = new ReportParameter("NombreDelParámetro", "Valor o Array de valores");
// Añado uno o varios parámetros(En este caso solo uno al ReportViewer
this.reportViewer1.ServerReport.SetParameters(new ReportParameter [] {parametro});
Por otro lado, si además queremos obtener los parámetros que tiene nuestro informe, podemos obtenerlo desde el ReportViewer. Esta sentencia sirve tanto para informes locales como remotos.
Visual Basic:
' Creo una colección de parámetros y meto los parámetros.
Dim parametros As ReportParameterInfoCollection = Me.ReportViewer1.ServerReport.GetParameters()
'Dim parametros As ReportParameterInfoCollection = Me.ReportViewer1.LocalReport.GetParameters()
C#:
// Creo una colección de parámetros y meto los parámetros.
ReportParameterInfoCollection parametros = this.reportViewer1.ServerReport.GetParameters();
//ReportParameterInfoCollection parametros = this.reportViewer1.LocalReport.GetParameters();
Credenciales. Nuestras fuentes de datos pueden o no pedir credenciales a la hora de ejecutar el informe. Para ver que fuentes de datos tenemos en nuestro informe y asignarle los permisos necesarios a cada una, podemos hacerlo de la siguiente forma:
Visual Basic:
Dim total As Integer = Me.ReportViewer1.ServerReport.GetDataSources().Count
' Creo un array de DataSourceCredentials con el total
' de DataSources que tiene el informe.
Dim permisos(total) As DataSourceCredentials
' Obtengo los datasources del informe.
Dim datasources As ReportDataSourceInfoCollection = Me.ReportViewer1.ServerReport.GetDataSources()
' Ahora por cada fuente de datos, le asignaremos al array de credenciales
' el nombre, userid y password.
For i As Integer = 0 To total - 1
permisos(i).Name = datasources(i).Name
permisos(i).UserId = "UsuarioDeNuestraBBDD"
permisos(i).Password = "PasswordDelUserId"
Next
C#:
int total = this.reportViewer1.ServerReport.GetDataSources().Count;
// Creo un array de DataSourceCredentials con el total
// de DataSources que tiene el informe.
DataSourceCredentials [] permisos = new DataSourceCredentials[total];
// Obtengo los datasources del informe.
ReportDataSourceInfoCollection datasources = this.reportViewer1.ServerReport.GetDataSources();
// Ahora por cada fuente de datos, le asignaremos al array de credenciales
// el nombre, userid y password.
for (int j = 0; j < total; i++)
{
permisos[j].Name = datasources[j].Name;
permisos[j].UserId = "UsuarioDeNuestraBBDD";
permisos[j].Password = "PasswordDelUserId";
}
// Asigno los permisos.
this.reportViewer1.ServerReport.SetDataSourceCredentials(permisos);
Bueno se me queda en el tintero para otro posible post, como conectarse de forma local a un informe. Ya que la mayoría de estas opciones sirven tanto para informes locales(LocalReport) como para los que están en el servidor(ServerReport).
Espero que les sirva.
Un Saludo
[cross-posting desde Geeks.ms]