none
Coger datos del Grid y rellenar reporte, no me filtra me saca todos los datos de la tabla RRS feed

  • Pregunta

  • Buenas,

    filtro la base de datos a través de un grid por diferentes paramentros, luego esta misma cadena(diferente segun los parametros de busqueda se la paso para que realice el reporte pero el resultado del filtro no es el mismo y lo que sale en el reporte no tiene nada que ver con lo que veo en el grid. Que puede pasar? 

    En la cadena que le paso para las busquedas hay cambos de esas 4 tablas, los mismos que tienen que aparecer en el reporte.

    Este es el botón de imprimir el reporte.

    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
            
            Dim rpt As New reporte
            Dim formulario As New generar_reporte
            Dim conexion As New MySqlConnection("Server=localhost;Database=grupomontes;Uid=root;Pwd=;")
            Dim str As String
            str = cadena.Text.ToString
            Dim da As New MySqlDataAdapter(str, conexion)
            Dim ds As New DataSet
            'da.Fill(ds)
            'Cargamos los albaranes
            da.Fill(ds, "albaranes")
            ''Cargamos los clientes obras y productos
            da = New MySqlDataAdapter("select * from clientes", conexion)
            da.Fill(ds, "clientes")
            da = New MySqlDataAdapter("select * from obras", conexion)
            da.Fill(ds, "obras")
            da = New MySqlDataAdapter("select * from productos", conexion)
            da.Fill(ds, "productos")
            da = New MySqlDataAdapter("select * from empresas", conexion)
            da.Fill(ds, "empresas")
    
    
            rpt.SetDataSource(ds)
            formulario.CrystalReportViewer1.ReportSource = rpt
            formulario.CrystalReportViewer1.Dock = DockStyle.Fill
    
            Dim frmreport As New Form()
            With frmreport
                .Controls.Add(formulario.CrystalReportViewer1)
                .Text = "Generar Reporte"
                .WindowState = FormWindowState.Maximized
                .ShowDialog()
            End With
            conexion.Close()
    
        End Sub


    miércoles, 30 de mayo de 2012 8:06

Todas las respuestas

  • Algo he avanzado y ya no me muestra todos los contenidos de todas las base de datos. Ahora me muestra toda la informacion de la tabla albaranes pero sin hacerme ningun tipo de filtro aunque mi consulta asi se lo diga.

    independientemente de lo que le pase por la cadena STR siempre muestra la tabla de albaranes completa.

     Dim rpt As New reporte
            Dim formulario As New generar_reporte
            Dim conexion As New MySqlConnection("Server=localhost;Database=grupomontes;Uid=root;Pwd=;")
            Dim str As String
            str = cadena.Text
            Dim da As New MySqlDataAdapter(str, conexion)
            Dim ds As New DataSet
            da.Fill(ds)
            'Cargamos los albaranes
            da = New MySqlDataAdapter("select * from albaranes", conexion)
            da.Fill(ds, "albaranes")
            'Cargamos los clientes obras y productos
            da = New MySqlDataAdapter("select * from clientes", conexion)
            da.Fill(ds, "clientes")
            da = New MySqlDataAdapter("select * from obras", conexion)
            da.Fill(ds, "obras")
            da = New MySqlDataAdapter("select * from productos", conexion)
            da.Fill(ds, "productos")
            da = New MySqlDataAdapter("select * from empresas", conexion)
            da.Fill(ds, "empresas")
    
    
            rpt.SetDataSource(ds)
            formulario.CrystalReportViewer1.ReportSource = rpt
            formulario.CrystalReportViewer1.Dock = DockStyle.Fill
    
            Dim frmreport As New Form()
            With frmreport
                .Controls.Add(formulario.CrystalReportViewer1)
                .Text = "Generar Reporte"
                .WindowState = FormWindowState.Maximized
                .ShowDialog()
            End With
            conexion.Close()


    miércoles, 30 de mayo de 2012 10:30
  • donde es que estas filtrando los datos? porque alli no veo ningun filtro

    debrias poner un WHERE en las queries SELECT que estas definiendo para filtrar, alli no veo nada de eso, estas cargando todas las tabls directo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 30 de mayo de 2012 12:31
  • Buenas Leandro,

    la consulta que hago la paso aqui:

      str = cadena.Text
            Dim da As New MySqlDataAdapter(str, conexion)
            Dim ds As New DataSet
            da.Fill(ds)

    STR es la cadena que filtra, que es la misma que uso para cargar el GRID (esto lo hace perfecto). Un ejemplo de STR seria:

    cadena.Text = "select DATE_FORMAT(a.fecha, '%Y/%m/%d') as FECHA,a.hora, a.num_albaran, e.razon_social_empresa as Empresa, c.razon_social as Cliente, a.obra, a.matricula, p.nombre, a.bruto, a.tara, a.neto from albaranes a, clientes c, empresas e, productos p where a.id_cliente=c.id_clientes and a.id_empresa=e.id_empresa and a.id_producto= p.id_producto and e.id_empresa=1"

    miércoles, 30 de mayo de 2012 22:26
  • nadie? Es medio Urgente!!! que tengo que presentar la practica mañana como fin de proyecto!!!!
    jueves, 31 de mayo de 2012 10:23
  • Hola, Gustavo Enriquez:

    Decirte que de MySQL y de Crystal Reports no tengo ni idea. De Access y de SQL Server, algo conozco, por lo que te voy a comentar lo que yo haría si utilizara alguno de éstos dos motores de datos.

    Si quieres consultar datos de varias tablas donde existan campos comunes, lo correcto sería utilizar una consulta de selección de datos combinados (INNER JOIN), que me imagino soportará el lenguaje SQL de MySQL.

    No quiere decir que esté mal la consulta SQL que estás ejecutando, siempre y cuando te devuelva los registros solicitados, ni más ni menos, es decir los correspondientes a la condición especificada en la cláusula WHERE:

        "... where a.id_cliente=c.id_clientes and
                   a.id_empresa=e.id_empresa and
                   a.id_producto= p.id_producto and
                   e.id_empresa=1"

    A mí personalmente me gusta más una consulta INNER JOIN.

    > Ahora me muestra toda la informacion de la tabla albaranes
    > pero sin hacerme ningun tipo de filtro aunque mi consulta
    > asi se lo diga.

    Fíjate cómo estás rellenando en el objeto DataSet un objeto DataTable llamado tabla Albaranes:

    > Cargamos los albaranes
    > da = New MySqlDataAdapter("select * from albaranes", conexion)
    > da.Fill(ds, "albaranes")

    Yo no observo ningún filtro, por tanto, se cargarán todos los registros de la tabla Albaranes. Y otro tanto de lo mismo haces con los objetos DataTable llamados Clientes, Obras, Productos y Empresas.

    Si quieres filtrar un número de registros determinado, tienes que especificar, sí o sí, una cláusula WHERE:

       "select * from albaranes where idAlbaran = 82938"

    Por supuesto, antes que llegue alguien diciéndolo, te comento que utilices una consulta con parámetros:

    Dim cmd As MySqlCommand = conexion.CreateCommand() cmd.CommandText = "select * from albaranes where idAlbaran = @idAlbaran"

    ' Añadimos el parámetro al comando cmd.Parameters.AddWithValue("@idAlbaran", 82938)

    Dim da As New MySqlDataAdapter(cmd) Dim ds As New DataSet() da.Fill(ds, "albaranes")

    No sé si el proveedor de datos .net para MySQL admite parámetros con nombre (@idAlbaran) o por posición. Deberías de informarte.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    jueves, 31 de mayo de 2012 10:48
  • Soft Jaen,

    me has puesto lo mismo que Leandro y no me sirve. Mi consulta esta correcta por que el grid me lo llegan con los datos que necesito. Pero si te fijas esa misma consulta es la que necesito para el reporte.

    No le puedo decir que me filtre por el albaran=785 asi está claro que funciona. Pero el problema es que me tiene que sacar en el reporte por ejemplo.

    Todos los albaranes entre una fecha, de un cliente determinado y de un producto determinado cada uno de estos filtros va sobre una base de datos determinada.

    Esta busqueda:

    cadena.text="select DATE_FORMAT(a.fecha, '%Y/%m/%d') as FECHA,a.hora, a.num_albaran, e.razon_social_empresa as Empresa, c.razon_social as Cliente, a.obra, a.matricula, p.nombre, a.bruto, a.tara, a.neto from albaranes a, clientes c, empresas e, productos p where a.id_cliente=c.id_clientes and a.id_empresa=e.id_empresa and a.id_producto= p.id_producto and e.id_empresa=1"

    es diferente segun filtre por unos datos u otros esa la puse a modo de ejemplo. Cada vez que filtro el grid haciendo una busqueda la cadena que filtra la copio en cadena.text y esta sentencia es la que tiene que usar luego el crystal report para el reporte. Como ves en este caso tendria que filtrar solo por empresa, pero alguna vez seran empresas y clientes, otra vez fechas y productos...

    No hay forma de que le pase la cadena que le pase la tome como datos de entrada para el reporte? Eso es lo que pretendo con esto:

     str = cadena.Text
            Dim da As New MySqlDataAdapter(str, conexion)
            Dim ds As New DataSet
            da.Fill(ds)

    GRacias!

    jueves, 31 de mayo de 2012 11:05
  • Por supuesto, antes que llegue alguien diciéndolo, te comento que utilices una consulta con parámetros:

    Me has quitado uno de los placeres que me quedan en la vida :-P jajaja

    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    jueves, 31 de mayo de 2012 11:10
  • "Gustavo Enriquez" preguntó:

    > No hay forma de que le pase la cadena que le pase la
    > tome como datos de entrada para el reporte? Eso es lo
    > que pretendo con esto:
    >
    > str = cadena.Text
    > Dim da As New MySqlDataAdapter(str, conexion)
    > Dim ds As New DataSet
    > da.Fill(ds)

    Ya te he comentado antes que desconozco el método de trabajo de Crystal Reports. Pero sí te puedo decir que los objetos DataTable que has añadido al objeto DataSet, según las consultas de selección utilizadas para rellenarlos, NO ESTÁN FILTRADOS.

    Lo único que filtras es el primer objeto DataTable que rellenas mediante:

       str = cadena.Text
       Dim da As New MySqlDataAdapter(str, conexion)
       Dim ds As New DataSet
       da.Fill(ds)

    Siempre y cuando cadena.Text contenga la consulta SQL de selección que has indicado a modo de ejemplo.

    > Todos los albaranes entre una fecha, de un cliente determinado
    > y de un producto determinado cada uno de estos filtros va sobre
    > una base de datos determinada.

    Si tu rellenas el objeto DataTable llamado Albaranes de la siguiente manera:

       select * from albaranes

    te repito que los datos en el objeto DataTable estarán SIN FILTRAR.

    ¿A ver cómo los filtras para pasárselo al informe de Crystal Reports?

    Puedes filtrar un objeto DataTable mediante su método Select, obteniendo un array de objetos DataRow con aquellos registros que cumplan una condición:

           ' Tabla albaranes
           '
           Dim dt As DataTable = ds.Tables("albaranes")
           
           Dim rows As DataRow() = dt.Select("IdAlbaran = 785")
           
           For Each row As DataRow In rows
            MessageBox.Show(Convert.ToString(row("ImporteTotal")))
           Next

    Ahora, no sé si un array de objetos DataRow se lo puedes pasar a los objetos de Crystal Reports. ¿?


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.



    jueves, 31 de mayo de 2012 11:27
  • Nada... así no se consigue nada.

    Dime como lo harias tu. Teniendo en cuenta que:

    Lo que muestre el reporte son datos filtrados de 4 tablas en una sola consulta. 

    Que los datos que muestra el reporte no son siempre los mismos (aunque si lo son los campos que parecen pero no asi los datos) ya que dependen de las opciones que tengas marcadas para la consulta.

    Como harias tu eso? 

    jueves, 31 de mayo de 2012 16:26
  • "Gustavo Enriquez" preguntó:

    > Dime como lo harias tu. Teniendo en cuenta que:
    >
    > Lo que muestre el reporte son datos filtrados de
    > 4 tablas en una sola consulta.
    >
    > Que los datos que muestra el reporte no son siempre
    > los mismos (aunque si lo son los campos que parecen
    > pero no asi los datos) ya que dependen de las
    > opciones que tengas marcadas para la consulta.

    De lo que he comprendido del contenido de tus mensajes, yo lo haría de la siguiente manera:

    1º) Una vez que conozca las opciones marcadas, construiría con las mismas una consulta SQL de selección de datos combinados (INNER JOIN o JOIN) con los campos de las cuatro tablas de la base de datos, siempre que existan entre ellas campos comunes, y filtraría los registros utilizando la corespondiente cláusula WHERE.

    2º) Con esa consulta SQL de combinación, rellenaría un objeto DataTable, no un objeto DataSet.

    3º) Si los objetos de Crystal Reports admiten un objeto DataTable para mostrar el informe, le pasaría directamente el objeto DataTable rellenado anteriormente. ¿Que sólo aceptan objetos DataSet? Entonces crearía un objeto DataSet temporal para añadir el objeto DataTable rellenado con la consulta SQL de datos combinados:

        Dim ds As New DataSet()

        ' Le añadimos el objeto DataTable rellenado
        '
        ds.Tables.Add(objetoDataTable)

    De ésta manera no me haría falta tener en memoria cinco objetos DataTable llamados Albarantes, Clientes, Obras, Productos y Empresas, sin filtrar, es decir, con todos los registros existentes en sus correspondientes tablas físicas.

    Pero según he entendido, lo que tú estás queriendo hacer es crear una "base de datos en memoria" (el objeto DataSet) con cinco tablas sin filtrar (los objetos DataTable), y deseas hacer una combinación de datos entre los objetos DataTable existentes, y eso es complicado de hacer. Desde luego, directamente no lo vas a poder hacer.

    Podrás filtrar objetos DataTable individuales mediante su método Select, tal y como te expliqué ayer, o combinar objetos DataTable con esquemas casi idénticos mediante su método Merge, y hasta utilizar una consulta LINQ para combinar datos mediante una cláusula Join. Pero serían métodos que a lo mejor conllevaría tener que escribir más código para adaptarlo a tus propóstos.

    Si lo deseas hacer de una manera fácil, la consulta de combinación (INNER JOIN) habría que ejecutarla directamente en la base de datos física, obteniendo su correspondiente objeto DataReader, o en éste caso, un objeto DataTable.

    Al menos, así es cómo lo haría yo. ;-)


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.


    viernes, 1 de junio de 2012 5:53
  • Si por casualidad deseas hacer una prueba de lo que te he comentado anteriormente, obtendríamos un objeto DataTable como resultado de ejecutar una consulta SQL de combinación de la siguiente manera:

        Private Function GetDataTable(idEmpresa As Integer) As DataTable
         
         Try
          Using cnn As New OleDbConnection(cadenaConexion)
           
           Dim cmd As OleDbCommand = cnn.CreateCommand()
           
           cmd.CommandText = _
            "SELECT a.Fecha, a.Hora, a.Num_Albaran," & _
            "e.Razon_social_empresa, c.Razon_Social, p.Nombre " & _
            "FROM Productos AS p INNER JOIN (Empresas AS e " & _
            "INNER JOIN (Clientes AS c INNER JOIN Albaranes AS a " & _
            "ON c.IdCliente = a.IdCliente) ON e.IdEmpresa = a.IdEmpresa) " & _
            "ON p.IdProducto = a.IdProducto " & _
            "WHERE e.IdEmpresa=@idEmpresa;"
           
           cmd.Parameters.AddWithValue("@idEmpresa", idEmpresa)
           
           Dim da As New OleDbDataAdapter(cmd)
           
           Dim dt As New DataTable("Albaranes")
           
           da.Fill(dt)
           
           Return dt
           
          End Using
          
         Catch
          ' Devolvemos la excepción al procedimiento llamador
          Throw
          
         End Try
         
        End Function

    Añade a la consulta de selección los campos que necesites. Eso sí, respeta las cláusulas INNER JOIN y ON tal y como se muestran en el ejemplo. Por supuesto, tendrás que adaptar los objetos al proveedor de datos .net para MySQL.

    Cuando desees obtener el objeto DataTable, llamarías a la función pasándole el identificador de la empresa cuyos datos deseas obtener:

         Try
          Dim idEmpresa As Integer
          Dim bln As Boolean = Integer.TryParse(TextBox1.Text, idEmpresa)
          
          If (Not (bln)) Then
           ' El valor no se puede convertir a Integer
           TextBox1.Clear
           TextBox1.Focus()
           DataGridView1.DataSource = Nothing
           Return
          End If
          
          ' Obtenemos el objeto DataTable.
          '
          Dim dt As DataTable = Me.GetDataTable(idEmpresa)
          
          DataGridView1.DataSource = dt
          
         Catch ex As Exception
          MessageBox.Show(ex.Message) 
         
         End Try

    No se me ocurre otro cosa, siempre y cuando yo haya entendido bien lo que deseas hacer: combinar los datos de cuatro tablas filtrados por el campo IdEmpresa de la tabla Empresas, para mostrar el resultado en un informe.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    viernes, 1 de junio de 2012 8:19
  • Buenos dias SoftJaen,

    estoy intentando tu solucion pero tengo algunas preguntas.

    Si tengo que poner mas parametros ademas de @idalbaran , por ejemplo @id_alumno ademas del albaran como lo haria? En misma sentencia esa que me has puesto de los inner Join?

    cmd.CommandText = _ "SELECT a.Fecha, a.Hora, a.Num_Albaran," & _ "e.Razon_social_empresa, c.Razon_Social, p.Nombre " & _ "FROM Productos AS p INNER JOIN (Empresas AS e " & _ "INNER JOIN (Clientes AS c INNER JOIN Albaranes AS a " & _ "ON c.IdCliente = a.IdCliente) ON e.IdEmpresa = a.IdEmpresa) " & _ "ON p.IdProducto = a.IdProducto " & _ "WHERE e.IdEmpresa=@idEmpresa and a.id_cliente=@idcliente;" cmd.Parameters.AddWithValue("@idEmpresa", idEmpresa)

    cmd.parameters.addwithvalue("@idcliente",idcliente)

    Dim da As New OleDbDataAdapter(cmd) Dim dt As New DataTable("Albaranes") ----------- > Como asigno esto? a que datatable? da.Fill(dt)

    Por otro lado crystal report solo acepta dataset. He intentado asignar el datatable al data set como me has puesto.. pero donde tengo que ponerlo? en la funcion? detras de la llamada a la funcion? Por que donde lo ponga no esta accesible "la otra parte".

    Estado actual, me filtra solo por @id_albaran que es la unica condicion que le pongo y no me imprime nada por que no le puedo pasar el dataset al crystal report.

    viernes, 1 de junio de 2012 9:23
  • ESte es el boton que lanza la funcion: EL reporte me sale vacio, en el grid si que sale correcto.

     Public Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
            Dim rpt As New reporte
            Try
                Dim idEmpresa As Integer
                If RadioButton1.Checked Then
                    idEmpresa = 1
                Else
                    idEmpresa = 2
                End If
    
                ' Obtenemos el objeto DataTable.
                '
                Dim dt As DataTable = Me.GetDataTable(idEmpresa)
    
                DataGridView1.DataSource = dt
    
                Dim formulario As New generar_reporte
                rpt.SetDataSource(dt)
                formulario.CrystalReportViewer1.ReportSource = rpt
                formulario.CrystalReportViewer1.Dock = DockStyle.Fill
    
                Dim frmreport As New Form()
                With frmreport
                    .Controls.Add(formulario.CrystalReportViewer1)
                    .Text = "Generar Reporte"
                    .WindowState = FormWindowState.Maximized
                    .ShowDialog()
                End With
    
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
    
            End Try
    end sub

    viernes, 1 de junio de 2012 9:36
  • Lo que debes tener claro es que los filtros que apliques para el DataGrid no afectan nunca el contenido del Dataset (entre otras cosas porque los filtros se aplican sobre un DataView y no sobre los datos en si) y por lo tanto no se reflejan en el reporte.

    Lo que yo haría sería crear OTRO dataset para pasárselo al reporte:

    Dim filteredDataset as DataSet
    
    filteredDataset.Tables.Add(ds.Tables("clientes").DefaultView.ToTable())
    
    filteredDataset.Tables.Add(ds.Tables("obras").DefaultView.ToTable())
    
    ...
    
    filteredDataset.Relations.Add(...)

    http://msdn.microsoft.com/en-us/library/73kk32zz.aspx

    http://msdn.microsoft.com/en-us/library/bb386921.aspx


    logo osoft
    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    viernes, 1 de junio de 2012 9:41
  • "Gustavo Enriquez" preguntó:

    > Si tengo que poner mas parametros ademas de @idalbaran,
    > por ejemplo @id_alumno ademas del albaran como lo haria?
    > En misma sentencia esa que me has puesto de los inner Join?

    Tras la cláusula WHERE puedes definir tantos parámetros como criterios desees aplicar al filtro:

      ... WHERE e.IdEmpresa=@idEmpresa AND a.id_cliente=@idcliente
          AND Alumnos.id_alumno=@idalumno

    Y después los añadirías a la colección Parameters del objeto Command, bien por posición (Access), bien por nombre (SQL Server). Ya te comenté que ignoro si MySQL admite parámetros por nombre o por posición. Si es por posición, los tendrás que añadir en el mismo orden en que se declaran en la consulta SQL.

      cmd.Parameters.AddWithValue("@idEmpresa", idEmpresa)
      cmd.Parameters.AddWithValue("@idcliente", idcliente)
      cmd.Parameters.AddWithValue("@idalumno", idalumno)

    > ----------- > Como asigno esto? a que datatable?
    >
    >   Dim da As New OleDbDataAdapter(cmd)
    >     
    >   Dim dt As New DataTable("Albaranes") 

    Pero, ¿a qué DataTable se lo vas a asignar, si precisamente estás CREANDO UN NUEVO OBJETO DATATABLE? :-D

    > Por otro lado crystal report solo acepta dataset. He
    > intentado asignar el datatable al data set como me
    > has puesto.. pero donde tengo que ponerlo?
    > en la funcion? detras de la llamada a la funcion?

    Detrás de la llamada a la función tienes que crear el objeto DataSet temporal:

    ' Obtenemos el objeto DataTable. ' Dim dt As DataTable = Me.GetDataTable(idEmpresa) ' Creamos el objeto DataSet temporal ' Dim ds As New DataSet() ' Añadimos el objeto DataTable al objeto DataSet ' ds.Tables.Add(dt)

    ' Mostrar el informe de Crystal Reports

    Y aquí, en lugar de mostrar los datos en un control DataGridView, llamarías al objeto correspondiente de Crystal Reports pasándole el objeto DataSet que contiene el objeto DataTable llamado Albaranes (el que hemos creado en la función GetDataTable).

    > Estado actual, me filtra solo por @id_albaran que es
    > la unica condicion que le pongo y no me imprime nada
    > por que no le puedo pasar el dataset al crystal report.

    De ésto no me entero. Yo te he puesto un ejemplo para filtrar por el campo IdEmpresa de la tabla Empresas. Ahora es tu obligación ADAPTAR EL EJEMPLO A TUS NECESIDADES, y filtrar por los campos que estimes oportuno.

    Si una vez obtenido el objeto DataTable con los registros filtrados, y añadido éste al objeto Dataset temporal creado, continúas sin ver los datos en el informe de Crystal Reports, ignoro por completo a qué se puede deber, por lo que sería conveniente que buscaras información en la ayuda de Crystal Reports o en los foros propios dedicados a Crystal Reports.

    Yo te puedo explicar cómo obtener datos desde un origen de datos, filtrados, sin filtrar o como deseemos, rellenar objetos DataTable y trabajar con sus objetos DataRow. Pero no te puedo explicar a qué se puede deber que tras pasarle un objeto DataSet con un objeto DataTable no puedas ver los datos en el informe, porque "no tengo el gusto de conocer" Crystal Reports. ¡Lo siento!

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    viernes, 1 de junio de 2012 9:48
  • Bueno ya tengo un poco mas claro por que no funciona.

    Este es el codigo que tengo actualmente en la funcion de obtener los datos.

       Private Function GetDataTable(ByVal idEmpresa As Integer) As DataTable
    
            Try
                Using cnn As New MySqlConnection("Server=localhost;Database=grupomontes;Uid=root;Pwd=;")
    
                    Dim cmd As MySqlCommand = cnn.CreateCommand()
    
                    cmd.CommandText = _
                     "SELECT a.Fecha, a.Num_Albaran," & _
                     "e.Razon_social_empresa, c.Razon_Social, p.Nombre, a.neto " & _
                     "FROM Productos AS p INNER JOIN (Empresas AS e " & _
                     "INNER JOIN (Clientes AS c INNER JOIN Albaranes AS a " & _
                     "ON c.Id_Clientes = a.Id_Cliente) ON e.Id_Empresa = a.Id_Empresa) " & _
                     "ON p.Id_Producto = a.Id_Producto " & _
                     "WHERE e.Id_Empresa=@idEmpresa;"
    
                    cmd.Parameters.AddWithValue("@idEmpresa", idEmpresa)
    
                    Dim da As New MySqlDataAdapter(cmd)
    
                    Dim dt As New DataTable("Albaranes")
    
                    da.Fill(dt)
    
                    Return dt
    
                End Using
    
            Catch
                ' Devolvemos la excepción al procedimiento llamador
                Throw
    
            End Try
    
        End Function

    Si en el reporte pongo solo campos de la tabla Albaranes funciona correctamente. (poniendo en el informe el campo fecha,num_albaran y neto)

    Si por el contrario quiero poner el campo c.razon_social en el reporte que pertenece a la tabla CLIENTES (como vemos si está en la sentencia SELECT) me sale todo el informe en blanco sin datos de ningún tipo. 

    Lo mismo ocurre si en el informe añado el campo p.nombre o e.razon_social_empresa, me sale todo el informe en blanco.

    Como podría solucionar esto?




    viernes, 1 de junio de 2012 10:05
  • "Gustavo Enriquez" escribió:

    > Si en el reporte pongo solo campos de la tabla Albaranes
    > funciona correctamente. (poniendo en el informe el campo
    > fecha,num_albaran y neto)
    >
    > Si por el contrario quiero poner el campo c.razon_social
    > en el reporte que pertenece a la tabla CLIENTES (como
    > vemos si está en la sentencia SELECT) me sale todo el
    > informe en blanco sin datos de ningún tipo.
    >
    > Como podría solucionar esto?

    Prueba a ponerle un ALIAS a los nombres de los campos en la consulta SQL de selección que ejecutas para rellenar el objeto DataTable en la función GetDataTable, tal y como haces con los nombres de las tablas:

         cmd.CommandText = _
           "SELECT a.Fecha AS Fecha, a.Num_Albaran AS Num_Albaran," & _
           "e.Razon_social_empresa AS Razon_Social_Empresa," & _
           "c.Razon_Social As Razon_Social, p.Nombre As Nombre," & _
           "a.neto As Neto " & _
           "FROM Productos AS p INNER JOIN (Empresas AS e " & _
           "INNER JOIN (Clientes AS c INNER JOIN Albaranes AS a " & _
           "ON c.Id_Clientes = a.Id_Cliente) ON e.Id_Empresa = a.Id_Empresa) " & _
           "ON p.Id_Producto = a.Id_Producto " & _
           "WHERE e.Id_Empresa=@idEmpresa;"

    En negrita las modificaciones que tienes que efectuar. Modifica los nombres de los alias para que se adapten a tus necesidades.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 4 de junio de 2012 11:30
  • Sin resultados positivos. Solo muestra los datos de la tabla Albaranes. Si añado un campo de otra tabla el campo no lo rellena.
    lunes, 4 de junio de 2012 13:12
  • "Gustavo Enriquez" escribió:

    > Sin resultados positivos. Solo muestra los datos de la tabla
    > Albaranes. Si añado un campo de otra tabla el campo no lo rellena.
    >

    Me imagino que te referirás al informe de Crystal Reports, no al objeto Datatable devuelto por la función GetDataTable, porque éste último sí estará formado por todos los campos especificados en la consulta SQL de combinación (INNER JOIN).

    > Dim dt As New DataTable("Albaranes")

    Te hago la salvedad que el objeto DataTable rellenado en la función GetDataTable se llama Albaranes, porque así se lo has indicado en el constructor del objeto DataTable.

    Recuerda que me comentastes que el informe de Crystal Reports necesita un objeto DataSet, porque parece ser que no le es suficiente un objeto DataTable. ¿Añadistes el objeto DataTable devuelvo por la función GetDataTable a un objeto DataSet temporal, tal y como te comenté en unos mensajes anteriores?

    De todas maneras, si el problema es del informe de Crystal Reports, insisto en que deberías de buscar información al respeto sobre Crystal Reports acudiendo a la ayuda o a los foros de Crystal Reports, no sobre cómo obtener los datos desde tu base de MySQL, porque parece ser que los datos los obtienes correctamente.


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 4 de junio de 2012 14:44
  • El objeto datatable devuelto por la función si esta correctamente cargado. (el grid me lo rellena correctamente).

    Probé también a pasarle un dataset en vez de un data table(que también lo acepta) y me hace exactamente lo mismo.

    Ya postee el problema en el foro de crystal report pero no he tenido respuesta aun.

    Otra opción es olvidarme del Crystal report y obtener los resultados en excel y después imprimir o en otro tipo de informes, no?

    Solo necesito lo mismo que tengo en pantalla del grid sacarlo por papel....

    P.D Sigo esperando tu correo softjaen!!!

    lunes, 4 de junio de 2012 14:59
  • "Gustavo Enriquez" escribió:

    > P.D Sigo esperando tu correo softjaen!!!

    No sé de que correo me hablas. ¿?


    Enrique Martínez
      [MS MVP - VB]



    lunes, 4 de junio de 2012 16:24
  • Escribeme a guti2kk@hotmail.com y te explico, ( es para hacer un trabajo/"apoyo" en Jaen)

    Te escribi a tu correo de yahoo pero no he recibido respuesta.

    Tenemos conocidos en común aqui en Jaén y a ver si nos puedes echar una mano con unos temas pagandolos claro...

    lunes, 4 de junio de 2012 17:28