Hace unos dias estaba terminando mi aplicación de informes para el proyecto de mi empresa. Entre uno de los requisitos estaba la exportación a Access. Como la barra de herramientas del ReportViewer no traia la exportación a Access tuve que crearme yo toda la funcionalidad para pillar los datos y crearla desde una clase.
Hasta ahí bien, tengo el dataset, las correspondencias de Sql Server y access y todo listo. Pero me faltaba algo, así es que despues de investirgar(google, codeproyect, ect) encontré un control en codeproyect que era básicamente el mismo que traia el ReportViewer pero con algunas limitaciones, asi es que no lo utilicé. Despues de probar y seguir buscando soluciones encontré la que comento ahora.
Lo que hice para ello es añadir un botón ToolStripDropDownButton mis opciones de exportación. Para ello implemnté las que ya traia por defecto(bueno, algunas de ellas no por cuestiones técnicas) y la de access.
Para ello me creé la función que me exporta un informe utilizando la funcionalidad que trae los servicios web de SSRS 2005 y añadí la nueva funcionalidad de access[...].
Lo siguiente que he hecho es crearme una propiedad que me de el ToolStrip que contiene el ReportViewer.
1 2 3 4 |
private ToolStrip ToolStrip { get { return this.BuscarToolStrip<ToolStrip>(this.reportViewer ); } } |
La función a la que llama es la siguiente y lo que hace básicamente es encontrar el ToolStrip dentro del control que nosotros le pasamos. En este caso el ReportViewer.
#region [BuscarToolStrip]
/// <summary>
/// Busca un tool strip en un control pasado.
/// </summary>
/// <typeparam name="TClass"></typeparam>
/// <param name="control"></param>
/// <returns></returns>
private TClass BuscarToolStrip<TClass>(Control control)
where TClass : System.Windows.Forms.Control
{
if (control == null)
return default(TClass);
else if (control is TClass)
return (TClass)control;
else
{
TClass result = default(TClass);
foreach (Control embedded in control.Controls)
{
if (result == null)
result = BuscarToolStrip<TClass>(embedded);
}
return result;
}
}
#endregion
Ya tengo la propiedad y la función necesaria para obtener mi ToolStrip, ahora solo queda implementarla y tratarla. Para ello creo una función que se ejecutará después del InitialiteComponent. Esta función se suscribirá al evento paint del ToolStrip.
#region [ConfigurarExportacion]
/// <summary>
/// Agrega un item de tipo ToolStripDropDownButton con las opciones de exportación.
/// </summary>
private void ConfigurarExportacion()
{
try
{
// Establezco el ToolStrip del ReportViewer
// para trabajar con el.
ToolStrip toolStrip = this.ToolStrip;
if (toolStrip != null)
{
// Obtengo el menú de exportación.
ToolStripDropDownButton BotonExportar =
toolStrip.Items["export"]
as oolStripDropDownButton;
if (BotonExportar != null)
{
// Suscribo al evento paint a la barra
// ToolStrip del ReportViewer
// para cargar el menú.
toolStrip.Paint +=
new PaintEventHandler(toolStrip_Paint);
}
}
}
catch (Exception ex)
{ }
}
#endregion
En el evento Paint del ToolStrip sustituiremos el botón export por uno propio. Este evento lo haremos solo una vez. La variable CrearMenu controlará la creación del botón de exportar. Cada botón del ToolStripDrownButton tendrá un texto y una imagen, y además de un evento.
#region [toolStrip (OnPaint)]
/// <summary>
/// Evento Paint de la barra ToolStrip del ReportViewer.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void toolStrip_Paint(object sender, PaintEventArgs e)
{
if (this.CrearMenu)
toolStrip = this.ToolStrip;
if (toolStrip != null)
{
ToolStripDropDownButton BotonExportarIni =
toolStrip.Items["export"] as ToolStripDropDownButton;
ToolStripDropDownButton BotoExportar =
new ToolStripDropDownButton(BotonExportarIni.Text, BotonExportarIni.Image);
toolStrip.Items.Remove(BotonExportarIni);
BotonExportarIni = null;
// Inserto los items.
BotoExportar.DropDownItems.Add("Exportar a Access",
this.imlInforme2.Images["Access.png"],
this.ExportarInforme);
BotoExportar.DropDownItems.Add("Exportar a Excell",
this.imlInforme2.Images["Excell.png"],
this.ExportarInforme);
BotoExportar.DropDownItems.Add("Exportar a PDF",
this.imlInforme2.Images["PDF.png"],
this.ExportarInforme);
BotoExportar.DropDownItems.Add("Exportar a HTML",
this.imlInforme2.Images["HTML.png"],
this.ExportarInforme);
BotoExportar.DropDownItems.Add("Exportar a XML",
this.imlInforme2.Images["XML.png"],
this.ExportarInforme);
// Añado en la posición del item anterior el nuevo item.
toolStrip.Items.Insert(18, BotoExportar);
CrearMenu = false;
}
}
}
#endregion
Por ultimo decir que, el evento ExportarInforme tendrá dos parámetros: Object sender y EventArgs e. El sender.ToString() me dará el nombre del text que le puse al item y con ello según sea uno u otro, exportaré al formato suyo.
Esta es mi solución a el problema, no me gusta la idea de que cada vez que se pinte tenga que comprobar si hay que crear el menú o no, pero ya buscaré alguna solución, por ahora esta me vale. Si tenéis alguna sugerencia bienvenida es. Espero que os sirva de utilidad.
Un Saludo.
Hace unos dias recibí un comentario en unos de mis posts sobre SSRS, el caso es que me preguntaban como hacer un reporte con un subreporte. Como creo que puede ayudarle a alguien en un futuro lo pongo como un post aquí.Para poder hacer el ejemplo necesitamos dos reports, uno (rpt) que hará de report principal y otro (subrpt) de subreport que irá incluido en el principal. Para este ejemplo utilizaré dos tablas, una llamada tbl_autor con un solo campo llamado autor y otra tbl_titulos con autor, título y dvd.
Para el rpt utilizaré la consulta: SELECT Autor FROM tbl_Autor y para el subrpt: SELECT Titulo, DVD FROM tbl_Titulos Where Autor = @UnAutor. Con esto ya tenemos creado nuestros dos reports. Ahora en el primero creamos dentro de la tabla creada una nueva fila y añadimos el subreport(subrpt) a la fila creada.

Ya tenemos el informe creado, pero ahora nos queda pasarle al subrpt el parámetro necesario. En este caso será el autor que nos rellenará el subrpt con las filas según este campo. Nos situamos en la nueva fila donde metimos el subrpt y de damos botón derecho y propiedades. Una vez aquí nos situamos en la pestaña parámetros y seleccionamos el parámetro y el campo que lo va a rellenar.

Ea, pues ya está nuestro informe preparado, ahora podemos ver un preview.

Espero que os sea de utilizad.
Un Saludo