// ************************************************************************* // CLASE PARA CREAR INFORMES UTILIZANDO CRYSTAL REPORTS (BUSINESS OBJECT) // // Referencias a importar (C:\Archivos de Programa\Business Objects\Common\3.5\managed\dotnet2) // CrystalDecisions.CrystalRports.Engine // CrystalDecisions.Shared // // Manuel Toscano Blancas // ************************************************************************* using CrystalDecisions.CrystalReports.Engine; using CrystalDecisions.Shared; using System; using System.Collections; namespace GestorInformes { class InformesCrystalReports { #region " Variables miembro " // Informacion de conexion a la BD private static string _bbdd_servidor; private static string _bbdd_nombre; private static string _bbdd_usuario; private static string _bbdd_clave; private static bool _bbdd_seguridadIntegrada; #endregion #region " Métodos públicos " /// <summary> /// Establecer las propiedades de conexión a la base de datos para los informes. /// </summary> /// <param name="servidor"></param> /// <param name="nombreBBDD"></param> /// <param name="usuario"></param> /// <param name="clave"></param> /// <param name="seguridadIntegrada"></param> public static void SetInfoConexion(string servidor, string nombreBBDD, string usuario, string clave, bool seguridadIntegrada) { _bbdd_servidor = servidor; _bbdd_nombre = nombreBBDD; _bbdd_usuario = usuario; _bbdd_clave = clave; _bbdd_seguridadIntegrada = seguridadIntegrada; } /// <summary> /// Generar informe y devolver resultado en forma de fichero en PDF. /// </summary> /// <param name="ficheroRPT"></param> /// <param name="hashTableFormulas"></param> /// <param name="ficheroPDF"></param> public static void ReportToPDF(string ficheroRPT, Hashtable hashTableFormulas, string ficheroPDF) { try { ReportDocument rpt; rpt = GetResultadoRPT(ficheroRPT, hashTableFormulas); rpt.ExportToDisk(ExportFormatType.PortableDocFormat, ficheroPDF); rpt.Close(); rpt.Dispose(); } catch (Exception ex) { throw new Exception(ex.InnerException.ToString()); } } /// <summary> /// Generar informe y devolver resultado por impresora. /// </summary> /// <param name="ficheroRPT"></param> /// <param name="hashTableFormulas"></param> /// <param name="nombreImpresora"></param> /// <param name="numeroCopias"></param> /// <param name="dobleCara"></param> public static void ReportToPrinter(string ficheroRPT, Hashtable hashTableFormulas, string nombreImpresora = "", int numeroCopias = 1, bool dobleCara = false) { try { ReportDocument rpt; rpt = GetResultadoRPT(ficheroRPT, hashTableFormulas); // Se podrian configurar otras opciones de impresion con rpt.PrintOptions rpt.PrintOptions.PrinterName = nombreImpresora; rpt.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.DefaultPaperOrientation; rpt.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.DefaultPaperSize; rpt.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Default; rpt.PrintOptions.PaperSource = CrystalDecisions.Shared.PaperSource.Auto; if (dobleCara) { if (rpt.PrintOptions.PaperOrientation == PaperOrientation.Portrait) rpt.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Vertical; else if (rpt.PrintOptions.PaperOrientation == PaperOrientation.Landscape) rpt.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Horizontal; else rpt.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Default; } // Imprimir rpt.PrintToPrinter(numeroCopias, true, 0, 0); rpt.Close(); rpt.Dispose(); } catch (Exception ex) { throw new Exception(ex.InnerException.ToString()); } } #endregion #region " Métodos privados para la generación del informe " private static ReportDocument GetResultadoRPT(string ficheroRPT, Hashtable hashTableFormulas = null) { try { // Validaciones if (!System.IO.File.Exists(ficheroRPT)) throw new ApplicationException("No se encontró el fichero de reporte " + ficheroRPT); // Informe CrystalDecisions.CrystalReports.Engine.ReportDocument rpt = new CrystalDecisions.CrystalReports.Engine.ReportDocument(); rpt.Load(ficheroRPT); // Pasar fórmulas if (hashTableFormulas != null && hashTableFormulas.Count > 0) { foreach (string key in hashTableFormulas.Keys) SetFormula(rpt, key, hashTableFormulas[key].ToString()); } // Logarse en todas las tablas LoginEnTablas(rpt); return rpt; } catch (Exception ex) { throw new Exception(ex.InnerException.ToString()); } } private static void SetFormula(ReportDocument rpt, string nombre, string valor) { try { rpt.DataDefinition.FormulaFields[nombre].Text = "\"" + valor.ToString() + "\""; } catch (Exception ex) { throw new Exception("Fórmula no válida. " + ex.Message); } } private static void LoginEnTablas(ReportDocument rpt) { try { CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = new CrystalDecisions.Shared.TableLogOnInfo(); CrystalDecisions.Shared.ConnectionInfo connectionInfo = new CrystalDecisions.Shared.ConnectionInfo(); connectionInfo.ServerName = _bbdd_servidor; connectionInfo.DatabaseName = _bbdd_nombre; connectionInfo.UserID = _bbdd_usuario; connectionInfo.Password = _bbdd_clave; connectionInfo.IntegratedSecurity = _bbdd_seguridadIntegrada; // Tablas del informe foreach (CrystalDecisions.CrystalReports.Engine.Table table in rpt.Database.Tables) { if (table.LogOnInfo.ConnectionInfo.DatabaseName == connectionInfo.DatabaseName) // Esto permite cambiar el login solo en tablas de la misma BBDD, no interfiere si son otras como por ejemplo XML { tableLogonInfo = table.LogOnInfo; tableLogonInfo.ConnectionInfo = connectionInfo; table.ApplyLogOnInfo(tableLogonInfo); if (table.Location.Contains(".")) table.Location = _bbdd_nombre + ".dbo.[" + table.Location + "]"; } } // Tablas de los SubInformes for (int i = 0; i < rpt.Subreports.Count; i++) { foreach (CrystalDecisions.CrystalReports.Engine.Table table in rpt.Subreports[i].Database.Tables) { if (table.LogOnInfo.ConnectionInfo.DatabaseName == connectionInfo.DatabaseName) // Esto permite cambiar el login solo en tablas de la misma BBDD, no interfiere si son otras como por ejemplo XML { tableLogonInfo = table.LogOnInfo; tableLogonInfo.ConnectionInfo = connectionInfo; table.ApplyLogOnInfo(tableLogonInfo); if (table.Location.Contains(".")) table.Location = _bbdd_nombre + ".dbo.[" + table.Location + "]"; } } } tableLogonInfo = null; connectionInfo = null; } catch (Exception ex) { throw new Exception(ex.InnerException.ToString()); } } #endregion } }La utilización de la clase genérica anterior, podría resumirse en el código siguiente, que sería el que utilizaríamos en nuestra aplicación:
System.Collections.Hashtable htFormulas = new System.Collections.Hashtable(); htFormulas.Clear(); htFormulas.Add("Codigo",dt.Rows[i]["ParametrosGeneracion"].ToString()); InformesCrystalReports.ReportToPDF(dt.Rows[i]["FicheroOrigen"].ToString(), htFormulas, ficheroDestinoPDF);
Eso crea un PDF con el resultado de ejecutar el informe, pero como hemos incluido otros métodos, podríamos haber hecho que directamente saliera por impresora, o bien recoger el objeto resultante para mostrarlo por pantalla en un contenedor de report.
0 comentarios :
Publicar un comentario