viernes, 23 de septiembre de 2011

[Crystal Reports] - Reporte con DataSet Tipado

Para este ejemplo haremos un Reporte de Libreta de Notas de un Colegio "X", en el cual el Dataset Tipado actuará como contenedor de los datos que se mostrarán en el reporte, tambien pueden aplicar este ejemplo como exportación de datos de un gridview para los detalles como las notas.

1. Definir la estructura

Crearemos un Dataset llamado libreta.xds y aquí definiremos los datos que se mostrarán en los reportes con los Datatables creados manualmente, en el cual iran algunos campos que queremos mostrar de su tabla real de vuestra BD.

2. Creación del Reporte

Una vez terminado el esquema de los datos se procede con el reporte, para ello se agrega uno nuevo en el proyecto, en este caso con el nombre de Libreta.rpt, y se configuran los datos mediante la opciones del “Field Explorer”, agregando el origen de datos, como muestra la imagen:

Del cuadro de dialogo siguiente se selecciona el DataSet creado en el paso previo llamado libreta.xds  y pasan las 3 tablas creadas:
Por ultimo, el asistente de Crystal permitirá redefinir como se vinculan las tablas, en este caso por representar información a distinto nivel no existe una relación, pero si se desarrollara algún reporte del estilo maestro-detalles, podría existir un vinculo entre las tablas.

Una vez concluidos los pasos para configurar el esquema de datos del reporte, arrastrando los campos al reporte, podría armar un reporte similar a este:


3. Carga de los datos en el DataSet

Ahora se creara un Formulario nuevo para que allí se muestre el reporte en una nueva ventana como se muestra en la imagen y se inseta un reportviewer:





Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Public Class Reporte

    Dim libre As New Libreta

    Public Sub New()
        InitializeComponent()
    End Sub

    Public Sub New(ByVal datos As Libreta)
        Me.New()
        libre = datos
    End Sub



    Private Sub Reporte_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim path As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase.ToString()).Remove(0, 6) & "\Libreta.rpt"
        Dim cryRPT As New ReportDocument
        cryRPT.Load(path)
        cryRPT.SetDataSource(libre)
        CrystalReportViewer1.ReportSource = cryRPT
        CrystalReportViewer1.Refresh()
    End Sub
End Class

En esta última parte es la codificación del llenado de datos hacia el dataset Libreta.xds que para tal efecto lo pueden hacer deste la clase del formulario nuevo que vamos a crear en 1 boton como se va a hacer ahora para no perder un poco el orden :



Imports System.Data.SqlClient
Imports System.Data

Public Class frmLibreta

    Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click

        Dim dsLibreta As Libreta = Nothing
        Dim datos As New DataTable
        Dim datos2 As New DataTable
        Dim datos3 As New DataTable
        Dim conexion As New SqlConnection("Data Source=xxx;Initial Catalog=base;User ID=xxx;Password=xx")

        Try
            'Creamos la query
            Dim query As String = "select id_alumno,nombre,apellido from alumnos where id_alumno = 'a003'"
            'Creamos el adaptador
            Dim adaptador As New SqlDataAdapter(query, conexion)
            'Abrimos la conexion
            conexion.Open()
            'Llenamos el Datatable
            adaptador.Fill(datos)

            'Recorremos el datatable y pasamos los datos al Dataset.Se realiza
            'de esta forma para que en este paso puedan extraer datos si en caso
            'fuera desde un datagridview para que recorran y pasen los datos deseados
            dsLibreta = New Libreta
            For x As Integer = 0 To datos.Rows.Count - 1
                dsLibreta.Alumno.AddAlumnoRow(datos.Rows(x).Item(0).ToString, datos.Rows(x).Item(1).ToString, datos.Rows(x).Item(2).ToString)
            Next

            'Creamos la nueva consulta
            query = "select nroMatricula,anoCursado from matriculas where id_alumno = 'a003'"
            'Nuevo adaptador para la nueva consulta
            Dim adaptador2 As New SqlDataAdapter(query, conexion)
            'Llenamos
            adaptador2.Fill(datos2)
            'Recorremos y pasamos datos al dataset
            For x As Integer = 0 To datos2.Rows.Count - 1
                dsLibreta.Matricula.AddMatriculaRow(datos2.Rows(x).Item(0).ToString, datos2.Rows(x).Item(1).ToString)
            Next

            'Creamos la nueva consulta
            query = "select b.descripcion,a.nota1T1,a.nota2T1,a.nota3T1,a.nota1T2,a.nota2T2,a.nota3T2,a.nota1T3,a.nota2T3,a.nota3T3,a.promedioGral from calificaciones a inner join Materias b on a.id_materia = b.id_materia where a.id_alumnos = 'a003'"
            'Nuevo adaptador para la nueva consulta
            Dim adaptador3 As New SqlDataAdapter(query, conexion)
            'Llenamos
            adaptador3.Fill(datos3)
            'Recorremos y pasamos datos al dataset
            For x As Integer = 0 To datos3.Rows.Count - 1
                dsLibreta.Calificacion_Materia.AddCalificacion_MateriaRow(datos3.Rows(x).Item(0).ToString, datos3.Rows(x).Item(1).ToString, datos3.Rows(x).Item(2).ToString, datos3.Rows(x).Item(3).ToString, datos3.Rows(x).Item(4).ToString, datos3.Rows(x).Item(5).ToString, datos3.Rows(x).Item(6).ToString, datos3.Rows(x).Item(7).ToString, datos3.Rows(x).Item(8).ToString, datos3.Rows(x).Item(9).ToString, datos3.Rows(x).Item(10).ToString)
            Next

            'Cerramos conexion
            conexion.Close()

            Dim formulario As New Reporte(dsLibreta)
            formulario.Show()


        Catch ex As Exception
            MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try


    End Sub
End Class

RESULTADO FINAL :


 Espero les haya sido util. Saludos!.



No hay comentarios:

Publicar un comentario