none
Hacer una búsqueda en dos DatagridView que están relacionados

    Pregunta

  • Buenas, me gustaría un poco de su apoyo en este problema que tengo si son tan amables, tengo un datagrid donde están las "cuentas por cobrar" y otro donde se almacena cada pago que X cliente haga "No.Pagos", esas tablas están relacionadas, entonces como resultado cuando le doy click a una cuenta por cobrar en el primer datagrid me despliega automáticamente los pagos que ese cliente haya hecho en el segundo datagrid (No.Pagos) esto es por que ese datagrid(No.Pagos) extrae los datos de un DatabindingSource que es la relación de tablas.  así: "CuentasPorCobrar_NoPagos" 

    hago la busqueda en el tableAdapter de la tabla cuentasPorCobrar asi: 

    SELECT        ID, NombreC, Apellidos, TOTALaPagar, Pendiente, FechaVentas, IDRelacion
    FROM            CuentasPorCobrar
    WHERE        (NombreC LIKE + @Valor + '%') OR
                             (Apellidos LIKE + @Valor + '%') OR
                             (IDRelacion LIKE + @Valor + '%')

    y no me funciona como deseo, necesito ayuda en esa parte.


    Renzo Rivera

    sábado, 3 de diciembre de 2016 3:58

Respuestas

  • Renzo19,

    ¿En que tabla se encuentra los abonos realizados?

    Pienso que lo simple es -por cada cuenta por cobrar seleccionada- consultar la tabla respectiva y recuperar todos los pagos realizados por el cliente en lugar de contener todos los pagos en un objeto en memoria, algo como:

    - Cada vez que se seleccione una cuenta por cobrar:

    Private Sub dgvCuentasPorCobrar_SelectionChanged(sender As Object, e ...
    
    	Dim dgv As DataGridView = DirectCast(sender, DataGridView)
    
    	'Se obtiene una referencia a la fila seleccionada
    	Dim Row As DataGridViewRow = dgv.CurrentRow
    
    	If Row IsNot Nothing Then 'Si la referencia es válida se actualiza el origen de datos
    		dgvCuotas.DataSource = CuotasPagadas(Row.Cells("ColCliente").Value.ToString)
    	End If
    
    End Sub


    - El procedimiento Function CuotasPagadas

    Private Function CuotasPagadas(Cliente As String) As DataTable
    
    	Try
    		Using cn As New SqlConnection("Cadena de conexión")
    			Dim ConsultaSQL As String = "SELECT * FROM Cuotas WHERE Cliente = @Cliente"
    
    			Dim da As New SqlDataAdapter(ConsultaSQL, cn)
    			Dim dt As New DataTable
    
    			da.SelectCommand.Parameters.AddWithValue("@Cliente", Cliente)
    			da.Fill(dt)
    
    			Return dt
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    
    End Function

    Nota que por cada fila seleccionada se invoca al procedimiento 'CuotasPagas' que retorna un objeto de tipo DataTable conteniendo las cuptas pagadas del cliente seleccionado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Renzo19 sábado, 3 de diciembre de 2016 4:50
    sábado, 3 de diciembre de 2016 4:30
  • Renzo19,

    Desconozco la estructura de tus tablas, el ejemplo adjunto es sólo un acercamiento, si necesitas reforzar el filtro para evitar obtener datos incorrectos entonces queda en ti realizar los ajustes pertinentes, básicamente es agregar condiciones a la expresión de filtro:

    Dim ConsultaSQL As String = "SELECT * FROM Cuotas 
                        WHERE Cliente = @Cliente AND idCuenta = @idCuenta"

    Y de hecho la firma del procedimiento también debería cambiar:

    Private Function CuotasPagadas(Cliente As String, idCuenta As Integer) As DataTable


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo19 sábado, 3 de diciembre de 2016 14:51
    sábado, 3 de diciembre de 2016 4:58

Todas las respuestas

  • Renzo19,

    ¿En que tabla se encuentra los abonos realizados?

    Pienso que lo simple es -por cada cuenta por cobrar seleccionada- consultar la tabla respectiva y recuperar todos los pagos realizados por el cliente en lugar de contener todos los pagos en un objeto en memoria, algo como:

    - Cada vez que se seleccione una cuenta por cobrar:

    Private Sub dgvCuentasPorCobrar_SelectionChanged(sender As Object, e ...
    
    	Dim dgv As DataGridView = DirectCast(sender, DataGridView)
    
    	'Se obtiene una referencia a la fila seleccionada
    	Dim Row As DataGridViewRow = dgv.CurrentRow
    
    	If Row IsNot Nothing Then 'Si la referencia es válida se actualiza el origen de datos
    		dgvCuotas.DataSource = CuotasPagadas(Row.Cells("ColCliente").Value.ToString)
    	End If
    
    End Sub


    - El procedimiento Function CuotasPagadas

    Private Function CuotasPagadas(Cliente As String) As DataTable
    
    	Try
    		Using cn As New SqlConnection("Cadena de conexión")
    			Dim ConsultaSQL As String = "SELECT * FROM Cuotas WHERE Cliente = @Cliente"
    
    			Dim da As New SqlDataAdapter(ConsultaSQL, cn)
    			Dim dt As New DataTable
    
    			da.SelectCommand.Parameters.AddWithValue("@Cliente", Cliente)
    			da.Fill(dt)
    
    			Return dt
    		End Using
    	Catch ex As Exception
    		MessageBox.Show(ex.Message)
    	End Try
    
    End Function

    Nota que por cada fila seleccionada se invoca al procedimiento 'CuotasPagas' que retorna un objeto de tipo DataTable conteniendo las cuptas pagadas del cliente seleccionado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    • Marcado como respuesta Renzo19 sábado, 3 de diciembre de 2016 4:50
    sábado, 3 de diciembre de 2016 4:30
  • Amigo tu procedimiento me funciono muy bien, pero hay un problema y es que puede ser que el mismo cliente tenga dos cuentas por cobrar diferentes por lo tanto cada vez que haga un abono a una de las cuentas va a parecer en la tabla de abonos todos junto, por eso es mejor hacerlo en forma de búsqueda, y preferiblemente con un ID y el Nombre como referencia. Muchas gracias por responder y espero una respuesta. saludos!

    Renzo Rivera

    sábado, 3 de diciembre de 2016 4:46
  • Renzo19,

    Desconozco la estructura de tus tablas, el ejemplo adjunto es sólo un acercamiento, si necesitas reforzar el filtro para evitar obtener datos incorrectos entonces queda en ti realizar los ajustes pertinentes, básicamente es agregar condiciones a la expresión de filtro:

    Dim ConsultaSQL As String = "SELECT * FROM Cuotas 
                        WHERE Cliente = @Cliente AND idCuenta = @idCuenta"

    Y de hecho la firma del procedimiento también debería cambiar:

    Private Function CuotasPagadas(Cliente As String, idCuenta As Integer) As DataTable


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Renzo19 sábado, 3 de diciembre de 2016 14:51
    sábado, 3 de diciembre de 2016 4:58