none
Pasar datos de Datagridview a CrystalReport RRS feed

  • Pregunta

  • Hola, necesito hacer un informe para sacar facturas.

    Tengo un datagridview que se va rellenando manualmente...

    Al darle a imprimir necesito sacar los datos que hay en el datagridview y pasarlos al reporte... Estaba intentando esto pero no me funciona.

     Dim ds As New DataSet
            Dim dt As New DataTable
    
            Dim reporte As New CrystalReport1
            Dim filas As Integer = Me.DataGridView1.Rows.Count
            Dim i As Integer = 0
            For i = 0 To filas - 1
                dt.Rows.Add(Me.DataGridView1.Rows(i).Cells("Descripción").Value)
                dt.Rows.Add(Me.DataGridView1.Rows(i).Cells("Cantidad").Value)
                dt.Rows.Add(Me.DataGridView1.Rows(i).Cells("PVP").Value)
                dt.Rows.Add(Me.DataGridView1.Rows(i).Cells("TOTAL").Value)
            Next (i)
            ds.Tables("tabla").Merge(dt)
            reporte.SetDataSource(ds)
            Form2.CrystalReportViewer1.ReportSource = reporte
            Form2.Show()
    

    Me da este error: La matriz de entrada es más larga que el número de columnas en esta tabla.

    No se si sabeis otra forma de hacerlo o que estoy haciendo mal...Si pudierais darme algun consejo os lo agradeceria.

    jueves, 28 de enero de 2016 12:29

Respuestas

  • Hola:
    Te falta pasar el datatable del Form1 al Form2. Prueba con esto.

    Private Sub BttImprimir_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Using loForm As New Form2
                loForm.DataTable =dt
                loForm.ShowDialog()
            End Using
        End Sub

    Y donde esta el CrystalReportViewer (Form2):

        Public Property DataTable As DataTable

        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim informe As New CrystalReport1
            informe.SetDataSource(DataTable)
            CrystalReportViewer1.ReportSource = informe
        End Sub

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta RamonArevalo martes, 2 de febrero de 2016 18:30
    viernes, 29 de enero de 2016 8:04

Todas las respuestas

  • El error está en que tu bucle for añade cuatro filas con una sola columna, cuando lo que deberías hacer es añadir una sola fila con cuatro columnas. Se podría arreglar poniendo un único "dt.Rows.Add" y dentro del Add poner las cuatro columnas (que ahora tienes escritas en cuatro filas), separadas por comas.

    Pero no merece la pena. Hay una forma mucho más sencilla de conseguirlo. Simplemente, al principio, crea un DataTable vacío y vincúlalo al grid poniéndolo en el DataSource. Según el usuario vaya introduciendo datos en el grid, esos datos irán copiándose automáticamente al DataTable que está vinculado. En cualquier momento puedes imprimir pasándole ese datatable al report, no hay que hacer nada  de código para pasar los datos del grid al datatable.


    jueves, 28 de enero de 2016 14:03
  • Gracias por la aclaración Alberto, parece bastante sencillo pero me da algunos problemas... Se me cierra directamente cando quiero mostrar el formulario donde esta el CrystalReportViewer...
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            dt = DataGridView1.DataSource
    
            DataGridView1.Columns.Add("Descripción", "Descripcion")
            DataGridView1.Columns.Add("Cantidad", "Cantidad")
            DataGridView1.Columns.Add("PVP", "PVP")
            DataGridView1.Columns.Add("TOTAL", "TOTAL")
    
        End Sub
    
        Private Sub BttAgregar_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            DataGridView1.Rows.Add("Producto de varios", "2", "15", "30")
    
        End Sub
    
        Private Sub BttImprimir_Click(sender As Object, e As EventArgs) Handles Button2.Click
       
            Form2.ShowDialog()
    
        End Sub
    Y donde esta el CrystalReportViewer:
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim informe As New CrystalReport1
            informe.SetDataSource(dt)
            CrystalReportViewer1.ReportSource = informe
    
        End Sub


    jueves, 28 de enero de 2016 16:43
  • Así a simple vista parece que debería funcionar. ¿Cómo haces para que "dt" pase del Form1 al Form2?
    jueves, 28 de enero de 2016 17:35
  • Tal como se ve...

       Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Dim informe As New CrystalReport1
            informe.SetDataSource(dt)
            CrystalReportViewer1.ReportSource = informe
    
        End Sub

    He probado otra forma y parece que me abre el CrystalReportViewer, pero no se como pasarle los datos al reporte...

    Siempre habia echo los reportes con el asistente y entonces me creaba el Dataset pero no se como pasarselo a mano...

    jueves, 28 de enero de 2016 18:13
  • Vale parece ser que me faltaba añadir algunas lineas en app.config...

    Si que me lo abre pero me sigue faltando sacar los datos en el informe...

    jueves, 28 de enero de 2016 18:17
  • Tal como se ve...

    Ese es el problema, que no se ve. Aparentemente en el Form1 se carga una variable local llamada dt, y luego en el Form2 se usa otra variable también local llamada igualmente dt. ¿Cómo ha llegado el dt del Form1 hasta el dt del Form2?
    jueves, 28 de enero de 2016 19:52
  • Hola:
    Te falta pasar el datatable del Form1 al Form2. Prueba con esto.

    Private Sub BttImprimir_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Using loForm As New Form2
                loForm.DataTable =dt
                loForm.ShowDialog()
            End Using
        End Sub

    Y donde esta el CrystalReportViewer (Form2):

        Public Property DataTable As DataTable

        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim informe As New CrystalReport1
            informe.SetDataSource(DataTable)
            CrystalReportViewer1.ReportSource = informe
        End Sub

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta RamonArevalo martes, 2 de febrero de 2016 18:30
    viernes, 29 de enero de 2016 8:04
  • Gracias por todo! al final lo e solucionado y ya imprime perfecto.
    viernes, 29 de enero de 2016 10:33