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
Espero les haya sido util. Saludos!.
No hay comentarios:
Publicar un comentario