none
Imprimir datos en DataGridView con Crystal Report

    Question

  • Saludos Cordiales:

    Requiero ayuda para crear un Form, espero Ustedes puedan colaborar. No soy experto pero si puedo comprender... O estudiarlo si es necesario. Al grano: Tengo un Windows Form con un DataGridView cargado desde un MDB Access (*.mdb). Actualmente se utiliza Crystal Report para imprimir la tabla del DataGridView contenida en em MDB. El Form incluye un cajón de texto, que cumple la función de filtro de las entradas del DataGridView. La necesidad es imprimir solo los datos en el DataGridVieew después de aplicar las rutinas de filtrado, idealmente utilizando el mismo reporte aplicado a la tabla del MDB.  He encontrado códigos donde se genera un DataTable, pero estos en su estructura requieren ingresar columna por columna los nombres para crear el DataTable. Este método no me asienta puesto que, hablamos de una base de datos de, aproximadamente, 20 tablas, cada una de mínimo 5 columnas... Entonces, se requiere un código Standard o lo más similar posible (que será aplicado a una plantilla de Form) para enviar los datos del DataGridView al Crystal Report correspondiente.

    Espero puedan ayudar. Cualquier colaboración y método alternativo será de ayuda. Utilizo Visual Studio 2008 en lenguaje Visual Basic. Anexo el código fuente del form. Gracias.

    Imports System.Data.OleDb
    Imports System.IO
    
    Public Class Form4
    
        'Carga del DataGridView sin filtros
        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.ProductosTableAdapter.Fill(Me.BDFarmacia2_EnsayosDataSet.Productos)
        End Sub
    
        'Código para imprimir toda la tabla, según diseño de Crystal
        Private Sub TodaLaTablaVistaInicialToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TodaLaTablaVistaInicialToolStripMenuItem.Click
            Dim Reporte As New CrystalReport1
            Reporte.SetDataSource(BDFarmacia2_EnsayosDataSet)
            Form5.CrystalReportViewer1.ReportSource = Reporte
            Form5.Show()
        End Sub
    
        'Código para crear el DataGridView filtrado
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Try
                Dim Datos As New DataView
                Datos.Table = Me.BDFarmacia2_EnsayosDataSet.Productos
                Dim Buscar As String = String.Empty
                Buscar = "Nombre LIKE '" & TextBox1.Text & "%'"
                Datos.RowFilter = Buscar
                Me.DataGridView1.DataSource = Datos
                Me.DataGridView1.Update()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK)
            End Try
    
        End Sub
    
        'Código no relacionado.
        Sub Prueba()
            MsgBox("Comando de Form4 ejecutado desde IndexForm.", MsgBoxStyle.Information)
        End Sub
        Private Sub SalirToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SalirToolStripMenuItem.Click
            Me.Close()
        End Sub
    
    
    End Class


    Wednesday, May 16, 2012 9:30 PM

Answers

  • se requiere un código Standard o lo más similar posible (que será aplicado a una plantilla de Form) para enviar los datos del DataGridView al Crystal Report correspondiente.

    del grid al reporte crystal directo no se puede enviar datos, deebs usar un intermediario ya sea un dataset tipado o un Lista generica

    pero algo tiene que intermediar como origen de datos

    igualmente segun veo generas una query que filtra el Textbox y que usas para cargar el datagridview, porque no useas esea query para cargar un dataset tipado que asignes al reporte ?

    es mas aconsejaria que uses parametros, algo como ser

    Public Function Busqueda(filtro As String) As DataTable
    
        Dim dt As New DataTable()
    
        Dim connectionstring As String = "<connection string>"
        Using conn As New SqlConnection(connectionstring)
    
            Dim query As String = "SELECT * FROM NombreTabla WHERE campo LIKE '%' + @filtro + '%'"
            Dim cmd As New SqlCommand(query, conn)
            cmd.Parameters.AddWithValue("@filtro", filtro)
    
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
        End Using
    
        Return dt
    
    End Function  

    es muy importante no concatener en un string el parametro usa el Parameters para asignar el valor del filtro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Wednesday, May 16, 2012 10:38 PM

All replies

  • Aquí un ejemplo con SQL

    Aqui filtro por mes, sector y año

     Dim da2 As New SqlDataAdapter("select * from registro where (sector LIKE '%" & Me.ComboBox2.SelectedValue & "%') and month (fecemi) ='" & Me.ComboBox1.SelectedValue & "' and year(fecemi) = " & Me.TextBox3.Text & " ", cn)
                Dim dt2 As New DataTable
                da2.Fill(dt2)
                Me.DataGridView1.DataSource = dt2
    
                Dim rpt2 As New rptreci
                rpt2.SetDataSource(dt2)
                rptrecibo.CrystalReportViewer1.ReportSource = rpt2
    
                rptrecibo.Show()
    Espero que sea útil

    David Mayurí Rojas

    Wednesday, May 16, 2012 10:24 PM
  • se requiere un código Standard o lo más similar posible (que será aplicado a una plantilla de Form) para enviar los datos del DataGridView al Crystal Report correspondiente.

    del grid al reporte crystal directo no se puede enviar datos, deebs usar un intermediario ya sea un dataset tipado o un Lista generica

    pero algo tiene que intermediar como origen de datos

    igualmente segun veo generas una query que filtra el Textbox y que usas para cargar el datagridview, porque no useas esea query para cargar un dataset tipado que asignes al reporte ?

    es mas aconsejaria que uses parametros, algo como ser

    Public Function Busqueda(filtro As String) As DataTable
    
        Dim dt As New DataTable()
    
        Dim connectionstring As String = "<connection string>"
        Using conn As New SqlConnection(connectionstring)
    
            Dim query As String = "SELECT * FROM NombreTabla WHERE campo LIKE '%' + @filtro + '%'"
            Dim cmd As New SqlCommand(query, conn)
            cmd.Parameters.AddWithValue("@filtro", filtro)
    
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
        End Using
    
        Return dt
    
    End Function  

    es muy importante no concatener en un string el parametro usa el Parameters para asignar el valor del filtro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Wednesday, May 16, 2012 10:38 PM
  • se requiere un código Standard o lo más similar posible (que será aplicado a una plantilla de Form) para enviar los datos del DataGridView al Crystal Report correspondiente.

    del grid al reporte crystal directo no se puede enviar datos, deebs usar un intermediario ya sea un dataset tipado o un Lista generica

    pero algo tiene que intermediar como origen de datos

    igualmente segun veo generas una query que filtra el Textbox y que usas para cargar el datagridview, porque no useas esea query para cargar un dataset tipado que asignes al reporte ?

    es mas aconsejaria que uses parametros, algo como ser

    Public Function Busqueda(filtro As String) As DataTable
    
        Dim dt As New DataTable()
    
        Dim connectionstring As String = "<connection string>"
        Using conn As New SqlConnection(connectionstring)
    
            Dim query As String = "SELECT * FROM NombreTabla WHERE campo LIKE '%' + @filtro + '%'"
            Dim cmd As New SqlCommand(query, conn)
            cmd.Parameters.AddWithValue("@filtro", filtro)
    
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
        End Using
    
        Return dt
    
    End Function  

    es muy importante no concatener en un string el parametro usa el Parameters para asignar el valor del filtro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Encuentro interesante y acertada su respuesta. Lamentablemente, por lo visto, no responde a mi necesidad. El hecho de cambiar la forma de filtrado no cambiará la situación, de que el DataGridView será diferente a la tabla (Aun aplicando filtros como el presentado) ya que la tabla contiene una variedad de campos, donde el Usuario podrá (y hará) ordenación de columnas que el filtro no podrá detectar (como ordenar de mayor a menor según XX o YY). Hay métodos para predecir el filtrado del Usuario, pero imagino abultarán demasiado el código (Usar Radiobutton que delimiten el filtro). Es por ello que busco un método que permita imprimir el DataGrid tal como lo ha dejado el Usuario. Estudiaré su respuesta sobre el Dataset tipado, que parece ser la solución. Se agradece la colaboración. Esperaré alguna otra respuesta. Gracias.
    Thursday, May 17, 2012 1:06 AM