miércoles, 26 de octubre de 2011

Exportar Reporte rdlc a Pdf en C# y mostrarlo a través de un Label

Si queremos mostrar un reporte rdlc directamente en pdf en nuestra página sin usar el ReportViewer lo que podemos hacer es lo siguiente.

En la página aspx solo basta con poner este label
reporte.aspx

<asp:Label ID="lblReporte" Text="" runat="server"></asp:Label>


Y el reporte lo cargamos de la siguiente manera          
reporte.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
      DataTable datos = DatosParaElReporte();
      String pathReporte = "repDeudas.rdlc"
      RenderReport(pathReporte, datos)
}

private void RenderReport(string pathReporte, DataTable datos) 
{
  try
  {
     LocalReport localReport = new LocalReport();
     localReport.ReportPath = Server.MapPath(pathReporte);
     ReportDataSource rdsCabecera = new ReportDataSource("DataSet1", datos);
     localReport.DataSources.Add(rdsCabecera);
     string reportType = "PDF";
     string mimeType;
     string encoding;
     string fileNameExtension;
     Warning[] warnings;
     string[] streams;
     byte[] renderedBytes;

     //Render
     renderedBytes = localReport.Render(
     reportType, 

     //deviceInfo,
     null,
     out mimeType,
     out encoding,
     out fileNameExtension,
     out streams,
     out warnings);
   

     String filePath = MapPath(
"rpMiReporte.pdf");
     FileStream fs = new FileStream(filePath, FileMode.Create);
     fs.Write(renderedBytes, 0, renderedBytes.Length);
     fs.Close();
     lblReporte.Text = "<object id=\"objPdf\" type=\"application/pdf\"  data=\"" 

              + nombre + "\" style=\"width: 980px; height: 100%;\" >  ERROR (no 
              puede mostrarse el objeto)</object>";
                    }
     catch (Exception ex)
     {

        lblReporte.Text = ex.Message;
     }
}


Listo ahora el reporte ser carga en un pdf y se muestra en pantalla a través del label, esto es útil si hemos pasado por la experiencia de usar el ReportViewer en Firefox o Chrome donde este componente no muestra el boton de imprimir entonces reemplazamos el ReportViewer por el visor pdf de adobe y imprimimos directamente de ahi.

martes, 25 de octubre de 2011

Cargar un ReportViewer con un DataTable desde C#

Esta es una manera fácil de cargar un ReportViewer desde C#

reporte.aspx


<rsweb:ReportViewer ID="rvMiReporte" runat="server" Width="100%" 
           Font-Names="Verdana"
           Font-Size="8pt" 

           InteractiveDeviceInfos="(Collection)" 
           WaitMessageFont-Names="Verdana"
           WaitMessageFont-Size="14pt">
</rsweb:ReportViewer>



<asp:Button id="btnListarReporte" runat="server" OnClick="btnListarReporte_Click" text="Reporte"/>

reporte.aspx.cs

protected void btnListarReporte_Click(object sender, EventArgs e)
{
  DataTable dt = LlenarDatos();
  //el DataSet de nuestro reporte rldc se llama "Cabecera"
  ReportDataSource rds = new ReportDataSource("Cabecera", dt); 
  rvMiReporte.LocalReport.DataSources.Clear();    
  rvMiReporte.LocalReport.ReportPath = "reportes\\miReporte.rdlc";           
  rvMiReporte.LocalReport.DataSources.Add(rds);  
}         



Ahora, si el reporte posee un sub-reporte, con detalles por ejemplo, lo único que hay que agregar es lo siguiente.

El método para cargar el sub-reporte

protected void cargarSubReporte(object sender, SubreportProcessingEventArgs e) 
{
  DataTable detalles = GetDetalles();
  ReportDataSource rdsDetalles = new ReportDataSource("Detalles", detalles);
  e.DataSources.Add(
rdsDetalles);
}

Lo agregamos al reporte

protected void btnListarReporte_Click(object sender, EventArgs e)
{
  DataTable dt = LlenarDatos();
  ReportDataSource rds = new ReportDataSource("Cabecera", dt); 
  rvMiReporte.LocalReport.DataSources.Clear();    
  rvMiReporte.LocalReport.ReportPath = "reportes\\miReporte.rdlc"; 
  rvMiReporte.LocalReport.SubreportProcessing += 
            new SubreportProcessingEventHandler(cargarSubReporte);          
  rvMiReporte.LocalReport.DataSources.Add(rds);  


Y listo. :)