lunes, 1 de febrero de 2010

Informe Maestro Detalle usando DataSet y Crystal Report

Introducción
Este artículo mostrare la forma de crear un reporte maestro detalle utilizando la plantilla CrystalReport que provee Visual Studio .NET y utilizando un DataSetTipado como Origen de datos para poblar el reporte. Nos introduciremos un poco en la funcionalidad ofrecida por el asistente para crear reportes, Usaremo el ReportViewer para mostrar los datos del reporte y finalmente explicare un poco del NameSpace System.Data.Sql, especificamente los objetos SQLConnection, SqlDataAdapter.
Código de Ejemplo: 
Reporte Producto por Categoria (Northwind)

Los pasos siguientes los podriamos realizar en difentes orden o hacerlos otra forma, aqui solo les muestro una manera de hacerlo.
Crear el DataSet Tipado
Este dataset almacenara la información de las tablas Products y Categories de la base de datos Northwind. Para crearlo:
1. Agregemos un nuevo elemento al proyecto utilizando la plantilla DataSet, usare el nombre dsProductByCategories.xsd.  Por el Momento el dataset esta vacio, no contiene elementos (Tablas, Ni Relaciones). Una buena via para adicionar tablas a un DataSet es utilizar es Explorador de servidores,  primero debes crear una conexión a la base de datos utilzando la opcion Agregar Conexión, en las conexiones de datos.
2. Desde la conexión a la base de datos Northwind seleccione la tabla Products y arrastrala hasta el diseñador del Dataset(dsProductByCategories.xsd.),  repite  lo mismo con la tabla categories. Visual Studio .NET crea las tablas como elementos del dataset con todos los registros contendo en estas y los tipos de datos adecuados.
3. Para crear la relacion (DataRelaction) entre las tablas products y Categories, se toma el campo CategoryID de Categories y Se arrastra hasta el Campo CategoryID de Productos, de esta forma definimos que el Elemento Primario es Categories, que el Elemento Secundario es Productos, que el Campo Clave es CategoryID(Categories) y que el Campo de Clave externa es CategoryID (Productos).


Crear la pantallia del Reporte
Utilizaremos la plantilla CrytalReport, esta pantilla nos permite creer una gran variedad  de estilos de reportes basados en el crystal report gallery.  Para utilizar esta plantilla:
1. Agregar un nuevo elemento al proyecto, en la sección categorias seleccione utilidad y luego la plantilla CrystalReport, asigne un nombre al reporte utilizare crProductByCategory.rpt. Despues de aceptar Visual Studio presenta la Galeria de Crystal Report
2. Cree un nuevo documento de crystal report utilizando el asistente de informes Estandar y acepte.
3. Ahora vamos a definir el origen de datos.  Selecciones Proyect Data en la Ficha Datos, Seleccione ADO .NET DataSets, esta lista presenta el dataset dsProductByCategories.xsd (creado anteriormente) y las tablas de este dataset Seleccionemos las dos tablas e Insertemosla en las tablas del reporte (como muestra la figura).


4. En al ficha campos (Fields) adiciones los campos de las dos tablas que incluiresmos en el informe (Como muesta la figura siguiente)

5. En la Ficha Group (Grupo), seleccionemos que vamos agrapar por CategoryName (Como muestra la figura Siguiente).
6. En al ficha Total adicionos los campos a sumarizar, para este ejemplo adicionaremos UnitPrice y UnitsInStock de la Products.  Para UnitPrices seleccionaremos en el Summary Type(tipo de sumarizacion) Avg y para UnitsInStock Sum. 

 5. Finalmente Seleccionemos Finalizar. El asistente construira el informe y lo mostrara en vista de diseño.  En este paso podemos hacer modificaciones al diseño del informe (en este articulo no detallaremos en este aspecto).

Crear La Forma Contenedora
Adicionamos una forma al proyecto y la modificamos para que contenga el informe. 
Para poder visualizar el informe debemos adiconar el control
ReportViewer a la forma y lo preparamos para que cubra todo el tamaño de la forma utilizando la propiedad Dock del Control en Fill.

Crear el Procedimiento para poblar el Reporte.
El procemiento siguiente (PoblarReporte) realizará la conexión a la base de datos Utizando el Objeto sqlConnection llamado sqlConn, la cadena de conexión, la creamos en la variable strConn, esta cadena de conexion se conecta al servidor local a la base de datos Northwind usuando seguridad integrada. Como vamos a utilizar el dataset tipado creado anteriormente entoces creamos dos sqlDataAdapter y en cada uno de ellos cargados todos los datos de las tablas por medio de las instrucciones definidas en las cadenas strCommCate y strCommProc. Luego Poblamos el dataset por medio de la instruccion Fill del dataAdapter. (Los Nombres de las tablas tiene que ser iguales a los nombres definidos en el dataset tipado y primero debemos poblar categores y luego products para no infringir las reglas de integridad).
Luego creamos un objeto info del tipo del informe creado anteriormente (crProductByCategory), definimos el origen de datos, que es el objeto dsPc que poblamos usando los dataAdapters. Luego definimos la propiedad ReporSource del objeto crvwProductsbyCategory como el objeto info definido anterirmente
El procedimiento lo podemos llamar desde el constructor de la forma (Sub New) despues del procedimiento inicializador de componentes y listo.
    Private Sub PoblarReporte()

        Dim sqlConn As SqlConnection
        Dim sqlDaProd As SqlDataAdapter
        Dim sqlDaCate As SqlDataAdapter
        Dim dsPc As New dsProductByCategories
        Dim strConn As String = "Server=localhost;Initial Catalog=Northwind;" _
          "Integrated Security = SSPI"
        Dim StrCommCate As String = "Select * From Categories"
        Dim strCommProd As String = "Select * From Products"

        Try
            'Crear los DataAdapters
            sqlConn = New SqlConnection(strConn)
            sqlDaCate = New SqlDataAdapter(StrCommCate, sqlConn)
            sqlDaProd = New SqlDataAdapter(strCommProd, sqlConn)
 
            'Poblar las tablas del dataset desde los dataAdaperts
            sqlDaCate.Fill(dsPc, "Categories")
            sqlDaProd.Fill(dsPc, "Products")
            'Poblar el informe con el dataSet y mostrarlo
            Dim info As New crProductByCategory
            info.SetDataSource(dsPc)
            crvwProductsbyCategory.ReportSource = info
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try
    End Sub 
Asi se veria el reporte.


Conclusión
Combinando las diferentes herramientas que nos provee Visual Studio .NET podemos facil y rapidamente soluciones de datos, El objeto dataAdapter nos permite facilmente trabajar desconectado de la base de datos, Los dataset nos proveen un metodo facil para manipular los datos e integrarlos diversos controles y que decir de la plantilla de crystal reporta, facil de usuar y muy util.  Espero que este articulo les sea de utilidad.

5 comentarios:

  1. Como hacer para realizar un Report sin conexion ADO...?

    ResponderEliminar
  2. coman mierda todo lo que hay que hacer

    ResponderEliminar
  3. no te entendi un carajo¡¡¡¡¡¡¡¡¡

    ResponderEliminar
  4. Gracias!!!!!!... me complique un poco usando c# y MySql pero gracias a tu tutorial lo logre, no pude dormir pensando como podria hacerlo y ahora bua... que felicidad!!! :P realmente muchas GRACIAS!!!

    ResponderEliminar
  5. MUY BIEN!!!!! ME SIRVIO DE MUCHO
    GRACIAS

    ResponderEliminar