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!.