Reportes desde Mysql en Vb.net

Escrito en Julio 16, 2009 por Alex

Les pongo un ejemplo para crear reportes en Crystal reports utilizando una base de datos de Mysql.

Utilizaremos una base de datos llamada “Mibase” con una tabla llamada “alumnos” con tres campos “nombre”, “apellidos” calificacion” .

Para este ejemplo lo primero que necesitamos hacer es crear un archivo XML con la estructura de la tabla. Para esto utilizamos el Dataset con su método WriteXml

'importar espacios de nombres
Imports MySql.Data
Imports MySql.Data.MySqlClient
 
'dentro de la clase
    Dim Ds As New DataSet
    Dim Con As New MySqlConnection
    Dim Cmd As New MySqlCommand
    Dim Da As New MySqlDataAdapter
 
'Esto puede estar dentro de un botón o dentro del procedimiento Load
Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
'variable cadena de conexión
        Con.ConnectionString = "server=localhost;uid=root;password=mipass;database=mibase"
        cmd.Connection = Con
        Con.Open()
 
'Aquí escribimos la query de la tabla que necesitamos con los datos que necesitamos
Cmd.CommandText = "select * from alumnos"
        Da.SelectCommand = cmd
        Da.Fill(Ds)
 
'aqui es donde creamos el archivo XML en la unidad C
        Ds.WriteXml("C:\productos.xml", XmlWriteMode.WriteSchema)
    End Sub

Ahora ya tenemos un archivo XML en la ruta que escribimos. Lo siguiente que tenemos que hacer es agregar las referencias a crystal Reports.
Para agregar las referencias Crystal reports nos vamos al menu Proyecto-Agregar referencia…
y en la pestaña de .Net seleccionamos las siguientes:

CrystalDecisions.CrystalReports.Engine
CrystalDecisions.ReportSource
CrystalDecisions.Shared
CrystalDecisions.VsDesigner
CrystalDecision.Web
CrystalDesicions.Windows.Forms

Agregamos un segundo formulario llamado form2 donde insertaremos el reporte, despues en el cuadro de herraminetas agregamos el componente CrystalReportViewer. Le ponemos de nombre CRV1

Tambien insertamos un CrystalReportDocument al que llamaremos CR1.

Dentro ya del CrystalReportDocument nos vamos al explorador de campos y damos clic derecho sobre el, dentro del menu que aparece damos clic en el Asistente de Base de datos.

Ya dentro del asistente desplegamos la carpeta “Crear nueva conexión” dentro de esta desplegamos “ADO.Net”. Se abrirá una nueva ventana donde nos pidde la ruta del archivo; es ahi donde le diremos donde se encuentra el archivo que acabamos de crear de tipo XML. Damos clic en finalizar.
Despues seleccionamos la tabla que apareció y la mandamos con el boton “>” a la columna de la derecha para agregarla y damos clic en aceptar.

Como podemos ver ya tenemos agregados los campos a la lista desplegable en el explorador de campos. Solo nos queda arrastrar al contenido del reporte los campos y acomodarlos a nuestro gusto.

Ahora para llamar al reporte escribimos estas lineas en el form2:

mports System.Data
Imports MySql.Data.MySqlClient
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.ReportSource
Imports CrystalDecisions.Shared
 
Public Class Form2
    Dim Ds As New DataSet
    Dim Con As New MySqlConnection("server=localhost;uid=root;password=mipass;database=alumnos")
 
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Cmd As New MySqlCommand(sql, Con)
        Dim Da As New MySqlDataAdapter(Cmd)
 
        Dim myReport As New ReportDocument
        Da.Fill(Ds)
 
        myReport.Load(My.Application.Info.DirectoryPath & "\CR1.rpt")
        myReport.SetDataSource(Ds)
        CRV1.ReportSource = myReport
 
    End Sub
    Public Function LeerColumna(ByVal nTabla As String, ByVal nColumna As String, ByVal Valores As ComboBox) As Boolean
        Dim Sql As String = "SELECT * FROM " & nTabla
        Dim DR As MySqlDataReader
        Dim Comando As New MySqlCommand("SELECT " & nColumna & " FROM " & nTabla, Con)
 
        Try
            If Not Con Is Nothing Then Con.Close()
            Con.Open()
            DR = Comando.ExecuteReader()
 
            If DR.HasRows = False Then
                Return Nothing
                Exit Function
            End If
 
            While DR.Read()
                Valores.Items.Add(DR(nColumna))
            End While
 
            Return True
        Catch ex As Exception
            Return False
 
        Finally
            DR = Nothing
            Comando = Nothing
            Con.Close()
        End Try
    End Function
 
End Class

Con esto desde el form1 llamamos al form2 con form2.show() y se mostrara el reporte.

Si te gusto este artículo Suscribete a nuestro feed

23 Comentarios en “Reportes desde Mysql en Vb.net”

  1. Bobxina |

    orales…
    te la rifastes, bueno dejame decirte q solo falto unas capturas del programa para ver q tal esta

    entendido desde el principio…

    eres un genio y no es por alavarte ni dada por el estilo estuve buscando algo similar pero no entendi nada asta en tu post
    mil gracias…

  2. Alex |

    De nada…

  3. Manuel |

    Hola que tal otra vez teniendo problemasen la linea
    myReport.Load(My.Application.Info.DirectoryPath & “\CR1.rpt”)
    me dice que no se ha declarado ningun nombre &amp
    esto se repite en todas las lineas que lo contengan

  4. Alex |

    Ese error debe dartelo porque no has declarado la variable myreport.
    Tambien checa la importtacion de espacios de nombres a crystal reports.

  5. Hugo |

    Hola Alex, fijate que dentro de cristalreportdocument no encuentro donde esta el asistente de base de datos para agregar el archivo xml, solo puedo agregar un archivo .rpt, Gracias

  6. Hugo |

    Disculpa, ya lo encontre, Gracias.

  7. Hugo |

    Alex disculpa, pero tengo el mismo problema de Manuel, dice que no se ha declarado &amp, como declaramos la variable myreport?, Gracias

  8. Hugo |

    Dice que amp no se ha declarado y el ; dice que es caracter no valido.

  9. Rodrigo |

    Hola que tal alex tengo un problema talvez me puedas ayudar
    en un formulario tengo campos texbox, los valores de estos campos los quiero enviar a un reporte ya editado este reporte no tiene ninguna conexion a ninguna BD.
    anteriormente tenia un formulario con un crystalreportviewer para cada reporte utilizaba este codigo para cargar los datos de los texbox

    Dim importar As CrystalDecisions.CrystalReports.Engine.TextObject

    importar = SATFRONT1.Section1.ReportObjects.Item(”txtdescrip1″)
    importar.Text = FrmFormatos.TextBox1.Text

    y funcionaba por que en el crystalreportviewer ya tenia cargado el reporte(SATFRON.rpt) pero ahora en mi aplicacion tengo un menu donde se seleccione el reporte que quiero ver y este se carguen en un solo formulario con un solo crystalreportviewer claro que para lograrlo tengo que validar que boton del menu se selecciono todo funciona con este codigo

    If FrmFormatos.VistaPreviaToolStripMenuItem.Checked = True Then
    FrmFormatos.VistaPreviaToolStripMenuItem.Checked = False

    CrvVistaPre.ReportSource = “C:\satfront.rpt”

    End If

    mi problema es que ya no puedo visualizar los datos de los texbox en el el reporte porque el codigo que ocupaba para cargar los datos ya no funciona por que ya no tengo cargado el reporte (SATFRONT.rpt) en el crystalreportviewer sino que la carga del archivo se hace en tiempo de ejecucion y no se como modificar el codigo de carga de los datos de los textbox para que funcione con el reporte que se cargó despues de la seleccion
    espero haber explicado bien mi problema y que me puedas ayudar

  10. Alex |

    Rodrigo:
    Utiliza parametros
    Si necesitas un ejemplo te lo pongo más tarde.

    Saludos.

  11. Alex |

    Hugo:

    Fijate que la ruta donde esta el archivo RPT sea correcta, generalmente necesitas meterlo en la carpeta Release o Debug.

    Saludos.

  12. Rodrigo |

    Te agradeceria un ejemplo me seria de gran ayuda

  13. Hugo |

    Alex:

    Coloque el archivo RPT en la carpeta Debug y no me funciona, el problema que no puedo correr el programa porque dice que no he declarado el nombre ” amp ” y el simbolo ” ; ” que esta al final de amp me dice que es un caracter no valido, todo lo tengo justo como esta explicado aqui, pero no se si falta agregar alguna referencia o libreria extra.

    Saludos.

  14. Rodrigo |

    Hola que tal Hugo
    intenta porner la ruta completa del archivo por ejemplo:

    myReport.Load(”C:\Documents and Settings\HP_Propietario\Mis documentos\Visual Studio 2008\Projects\reportes\reportes\CR1.rpt”)

  15. Alex |

    Ok Hugo:

    El problema es que no tienes que poner ningun amp.

    El código es así:
    myReport.Load(My.Application.Info.DirectoryPath & “\CR1.rpt”)

    Es decir:
    Reemplaza & amp ; por solo el signo &

    El problema se debe a un error en la manera en quie el fragmento de código se muestra aqui en la pagina web. Pero originalmente no es así. De hecho ya está corregido.

  16. Hugo |

    Gracias Alex, ahora si todo funciona muy bien.

  17. Jorge |

    –>Dim Cmd As New MySqlCommand(sql, Con)
    Dim Da As New MySqlDataAdapter(Cmd)

    en esa linea me tira un error, dice que “sql” no esta declarado o algo asi

  18. Alex |

    Porque Sql es una variable de tipo String que debes tener declarada asi:

    Dim Sql as string=”aqui va tu sentencia sql”

  19. Jorge |

    Muchas Gracias Alex. muy bueno tu blog

  20. Gabriel Molina |

    seria bueno que lo pongas en C# igual.. saludos! y gracias por compartir :)

  21. vangeorgeri |

    vale muy bien lo felicito

  22. vangeorgeri |

    vale enesta linea me sale error Dim Cmd As New MySqlCommand(sql, Con)
    ayuda

  23. Alex |

    Hay que importar los espacios de nomres al inicio de la clase o modulo.

Escribe un comentario