Ejemplo Crystal Reports

  • View
    108

  • Download
    2

Embed Size (px)

Transcript

EJEMPLO CRYSTAL REPORTS En este artculo voy a explicar como hacer que un informe nos muestre los datos de una columna de una tabla de base de datos en mltiples columnas y voy a hacer un ejemplo de subreport. Para realizar dichas tareas voy a crear un nuevo proyecto basado en lo que expuse en el artculo del 17 de septiembre "Crear Crystal Report sin problemas de conexin". En este caso voy a usar la base de datos NorthWind de Sql Server 2005 (es la misma que la de Sql Server 2000, solo la tenis que importar a 2005). Primer Ejemplo (multiples columnas) Voy a sacar un listado de productos en 3 columnas, para ello me creo una clase donde realizo la llamada a la base de datos y rellenar un dataset que ser el encargado de proporcionar los datos al report. La SQL que tengo es "SELECT ProductID, ProductName FROM dbo.Products ORDER BY 2". Genero el XML que dar forma al report Y ahora creamos el report como si en el detalle solo tuvieramos una columna, nos tiene que quedar mas o menos como esto:

Ahora pinchamos con botn derecho sobre la seccin detalle para que nos salga el siguiente men contextual donde elegiremos "Section Expert"

Ahora pincharemos sobre el check "Format with Multiple Columns"

Ahora nos vamos a la pestaa Layout donde definiremos la anchura de la columna, la separacin tanto vertical como horizontal entre celdas de la tabla resultante, si queremos que las columnas se rellenen primero hacia abajo y luego hacia la derecha o primero hacia la derecha y luego hacia abajo. En el ejemplo que he hecho, le he dado una anchura de 4 cm. a cada columna, he dejado medio centmetro de espacio entre celdas y he rellenado los datos primero hacia la derecha y luego hacia abajo.

Como podris observar, si os fijis en la primera imagen y en esta siguiente resultado de definir las columnas, el propio editor de crystal muestra la anchura de una columna.

Y por ltimo compilamos y ejecutamos la aplicacin con lo que nos resulta el informe desado en varias columnas.

Una aplicacin evidente de sto es si necesitamos crear etiquetas a partir de los datos que tengamos en base de datos. Segundo Ejemplo (crear subinforme) Para este ejemplo voy a aadir una segunda tabla al dataset que alimenta de datos al crystal, pero no voy a hacer que las tablas estn relacionadas, simplemente al final del informe voy a mostrar en un subinforme algunos datos de la tabla "Employees" de la base de datos NorthWind. Para realizar mi tarea modifico el mtodo DevuelveDataSet de la clase que uso para obtener los datos de la base de datos quedando lo siguiente: private DataTable dtResultado; private DataTable dtResultado2; public DataSet DevuelveDataSet() { //Creo la estructura de la tabla dtResultado = new DataTable("productos"); dtResultado.Columns.Clear(); dtResultado.Columns.Add(new DataColumn("ProductID", typeof(long))); dtResultado.Columns.Add(new DataColumn("ProductName", typeof(String))); //Le aado la PK

dtResultado.PrimaryKey = new DataColumn[] { dtResultado.Columns["ProductID"] }; dtResultado2 = new DataTable("empleados"); dtResultado2.Columns.Clear(); dtResultado2.Columns.Add(new DataColumn("EmployeeID", typeof(long))); dtResultado2.Columns.Add(new DataColumn("LastName", typeof(String))); dtResultado2.Columns.Add(new DataColumn("FirstName", typeof(String))); dtResultado2.Columns.Add(new DataColumn("Title", typeof(String))); //Le aado la PK dtResultado2.PrimaryKey = new DataColumn[] { dtResultado2.Columns["EmployeeID"] }; //Relleno la tabla con datos de la base de datos SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder(); bldr["Data Source"] = @".\SQLExpress"; bldr["Initial Catalog"] = "NorthWind"; bldr["Integrated Security"] = true; //Podemos rellenar una tabla como si de una vista se tratara string str = "SELECT ProductID, ProductName " + "FROM dbo.Products " + "ORDER BY 2"; string str2 = "SELECT EmployeeID, LastName, FirstName, Title " + "FROM dbo.Employees " + "ORDER BY 3"; //Realizo el acceso a datos using (SqlConnection con = new SqlConnection(bldr.ConnectionString)) { using (SqlDataAdapter da = new SqlDataAdapter()) { da.SelectCommand = new SqlCommand(); da.SelectCommand.CommandType = CommandType.Text; da.SelectCommand.CommandText = str; da.SelectCommand.Connection = con; da.Fill(dtResultado); da.SelectCommand.CommandText = str2; da.Fill(dtResultado2); } } //Defino el dataset DataSet ds = new DataSet();

ds.Tables.Add(dtResultado); ds.Tables.Add(dtResultado2); //Descomentando esta lnea nos sirve para crear el XML con //el esquema de tablas que necesitamos //ds.WriteXmlSchema(@"C:\report.xml"); //Elimino de memoria la tabla dtResultado.Dispose(); dtResultado = null; dtResultado2.Dispose(); dtResultado2 = null; return ds; }

Modifico el xml que ayuda a crear la estructura al crystal para contemplar la nueva tabla

Verifico la base de datos en el report (desde el VS, Crystal Reports / Database / Verify Database), me voy a la conexion concurrente para corroborar que la nueva tabla empleados nos aparece. Y visto esto empezamos a crear el subreport.

Colocamos el objeto resultante del paso anterior (ver imagen anterior) donde queramos que aparezca, en mi ejemplo lo pongo en el pi del informe (es decir, en la ltima pgina del informe) y seguidamente nos aparece la siguiente imagen

Pero pulsamos en la opcin "Create a subreport with the Report Wizard" (tambin podis usar uno que ya tengis hecho, pero a mi siempre me gusta mas as), le damos un nombre y pulsamos en el botn "Report Wizard".

Elegimos la/s tabla/s que necesitemos

Los campos que queremos que se muestren

Y ya nos saldra el subinforme

El ejemplo que he hecho es un poco tonto, pero si necesitaramos usar un subinforme en un pie de grupo de tal forma que los datos del subinforme se tuvieran que filtrar por una foreign key al dato que se usa para crear el grupo, tendramos que tener en cuenta lo siguiente segn la estructura que estoy siguiendo: 1. En el cdigo tendra que definir la foreign key DataRelation dr = new DataRelation("relacion_1", ds.Tables["tablapadre"].Columns["columnaPK"], ds.Tables["tablahija"].Columns["columnaFK"]); ds.Relations.Add(dr); dr = null; 2. En el XML habra que incluir la relacin 3. En el Crystal, botn derecho sobre el subinforme "Change Subreports Links", elegimos el campo de la tabla padre que hace referencia a la relacin. Tendremos algo parecido a

4. Si ahora nos vamos al subreport, en la opcin de men Crystal Report/Report/Selection Formula/Record (si lo hacemos desde el VS2005), nos aparecer algo parecido a:

Espero que os haya parecido interesante. En mi opinin no me gusta mucho este producto, voy a empezar a aprender Reporting Services.