none
DataGridView maestro con dos detalles en vb.net RRS feed

  • Pregunta

  • Hola buenos días espero ser comprendido con mi problema que detallo a continuación. Tengo en un  form tres datagridview, el primero me sirve para mostrar los datos principales de mi tabla "ingreso"   mediante un procedimiento almacenado llamado "listar_ingresos", el segundo me muestra el detalle de los ingresos que se almacena en mi tabla "deting" mediante un procedimiento almacenado "listar_detingreso", hasta acá todo bien, no hay problema se muestra los registros detallados de cada ingreso al cambiar la selección por registro, pero lo que deseo es que en el tercer dgv, me muestre el detalle de mi tabla "deting", que esta en mi tabla "detlote" mediante un procedimiento almacenado llamado "listar_detlote", pero no lo he logrado he intentado de varias formas pero ninguna con exito.

    el código que tengo hasta el momento que me muestra sin ningún problema hasta el segundo dgv 

     Dim conexion As New SqlConnection(My.Settings.conexJ)
            Try
                
    
                conexion.Open()
                Dim DataSet As New DataSet
                Dim Adaptador As New SqlDataAdapter()
                Dim comando As New SqlCommand
                With comando
                comando = New SqlCommand("listar_ingresos", conexion)
                comando.CommandType = CommandType.StoredProcedure
                
                End With
                With Adaptador
                    .SelectCommand = comando
                    Adaptador.Fill(DataSet, "listar_ingresos")
    
                End With
                With DgvProd
                    .DataMember = "listar_ingresos"
                    .DataSource = DataSet
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
                With comando
               comando = New SqlCommand("listar_detingreso", conexion)
                    comando.CommandType = CommandType.StoredProcedure
    
                End With
                With Adaptador
                    .SelectCommand = comando
                    
                End With
                With DataSet
                    .Relations.Add("mi_Relacion", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detingreso").Columns(campo_Relacionado))
    
                End With
                With DgvDetalle
                    .DataSource = DataSet
                    .DataMember =                 .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                End With
                With conexion
                    If .State = ConnectionState.Open Then
                        .Close()
                    End If
                    .Dispose()
                End With
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try

    para un mejor entendimiento adjunto la pantalla del form en cuestión, esperando obtener su ayuda, estoy varias semanas en el tema y no lo he podido solucionar 


    muchas gracias 

     

    J.Al

    martes, 26 de febrero de 2013 14:53

Respuestas

  • Buen día ya tengo la solución de mi problema, gracias por tu mensaje JA Reyes, también me sirvió tu mensaje, pero la solución ha estado mas fácil de lo que imaginé, acá dejo el código, he tratado de comentar cada porción de código con la intensión de  que sirva de ayuda para los interesados, yo creo que se puede aumentar los detalles según el diseño de la base de datos y la información a mostrar.

        Public Sub CargarDatosIngreso()
    
            Dim conexion As New SqlConnection(My.Settings.conexJ)
            Try
                'abrir la conexión con la base de datos   
                conexion.Open()
                ' Nuevo objeto Dataset   
                Dim DataSet As New DataSet
    
    
                '''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'DataGridView maestro   
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'Crear el sqldataadapter para cada procedimiento almacenado en mi caso
                Dim Adaptador As New SqlDataAdapter()
                Dim Addet As New SqlDataAdapter()
                Dim Adlote As New SqlDataAdapter()
    
                'Crear el comand para especificar cada objeto a incluir en mi py
                Dim comandomae As New SqlCommand
                Dim comandodet As New SqlCommand
                Dim comandolot As New SqlCommand
    
                '..................................................................................................
                With comandomae
                    ' Asignar el sql para seleccionar los datos del objeto Maestro   
                    comandomae = New SqlCommand("listar_ingresos", conexion)
                    comandomae.CommandType = CommandType.StoredProcedure
                    
                End With
                'Enlazamos el procedimiento almacenado y rellenamos el dataset
    
                '..................................................................................................
                With Adaptador
                    .SelectCommand = comandomae
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_ingresos")
    
                End With
    
                '..................................................................................................
                ' Enlazar el DataGridView al dataset   
                With DgvProd
                    .DataMember = "listar_ingresos"
                    .DataSource = DataSet
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
    
    
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'DataGridView detalles   
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'Nuevamente el mismo procedimiento como con el ob. maestro
                'pero independiente por cada objeto detalle
                With comandodet
                    ' cadena sql para cargar el objeto detalle de ingresos   
                    comandodet = New SqlCommand("listar_detingreso", conexion)
                    comandodet.CommandType = CommandType.StoredProcedure
                End With
                With comandolot
                    ' cadena sql para cargar el segundo objeto detalle de ingresos   
                    comandolot = New SqlCommand("listar_detlote", conexion)
                    comandolot.CommandType = CommandType.StoredProcedure
                End With
    
                '..................................................................................................
                'rellenamos nuestro dataset con cada objeto especificado anteriormente en el comand
                With Adaptador
                    .SelectCommand = comandodet
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_detingreso")
                End With
                With Adaptador
                    .SelectCommand = comandolot
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_detlote")
                End With
                '..................................................................................................
    
                ' Agregar la relación ( campo en común : campo_Relacionado = coding )   
                'creando una nueva relacion desde el objeto maestro con el 2 detalle
                With DataSet
                    .Relations.Add("mi_Relacion", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detingreso").Columns(campo_Relacionado))
                    .Relations.Add("mi_Relacion1", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detlote").Columns(campo_Relacionado), False)
                End With
                '..................................................................................................
    
                'Enlazar cada dgv al dataset alimentado anteriormente con los datos de cada ob. especificado con el sqldataadapter
                With DgvDetalle
                    .DataSource = DataSet
                    .DataMember = "listar_ingresos.mi_Relacion"
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
    
                With DgvDetLote
                    .DataSource = DataSet
                    .DataMember = "listar_ingresos.mi_Relacion1"
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
                '..................................................................................................
    
                'cerrar la conexíón   
                With conexion
                    If .State = ConnectionState.Open Then
                        .Close()
                    End If
                    .Dispose()
                End With
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try
            '..................................................................................................
        End Sub

    Gracias ahora estoy en el problema de guardar los datos usando transacciones, seguro q estaremos comunicando nuevamente.

    atte

     

    J.Al

    • Marcado como respuesta jhAlex miércoles, 27 de febrero de 2013 13:19
    miércoles, 27 de febrero de 2013 13:18

Todas las respuestas

  • Hola,

    Así a primera vista se hace complicado poder detectar el problema concreto sin poder debuggar el código, aunque normalmente estos problemas son debidos al establecimiento de los DataSources o a la hora de crear la relación en el Dataset.

    En cualquier caso, prueba a realizar el binding del detalle del siguiente modo:

                With DgvDetalle
                    .DataSource = DgvProd
                    .DataMember = "mi_Relacion"
    
                End With

    O sino, puedes comparar tu caso con este otro ejemplo del msdn:

    http://msdn.microsoft.com/en-us/library/y8c0cxey.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

    Saludos.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.



    • Editado JA Reyes miércoles, 27 de febrero de 2013 13:27 Syntaxis
    martes, 26 de febrero de 2013 15:24
  • Buen día ya tengo la solución de mi problema, gracias por tu mensaje JA Reyes, también me sirvió tu mensaje, pero la solución ha estado mas fácil de lo que imaginé, acá dejo el código, he tratado de comentar cada porción de código con la intensión de  que sirva de ayuda para los interesados, yo creo que se puede aumentar los detalles según el diseño de la base de datos y la información a mostrar.

        Public Sub CargarDatosIngreso()
    
            Dim conexion As New SqlConnection(My.Settings.conexJ)
            Try
                'abrir la conexión con la base de datos   
                conexion.Open()
                ' Nuevo objeto Dataset   
                Dim DataSet As New DataSet
    
    
                '''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'DataGridView maestro   
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'Crear el sqldataadapter para cada procedimiento almacenado en mi caso
                Dim Adaptador As New SqlDataAdapter()
                Dim Addet As New SqlDataAdapter()
                Dim Adlote As New SqlDataAdapter()
    
                'Crear el comand para especificar cada objeto a incluir en mi py
                Dim comandomae As New SqlCommand
                Dim comandodet As New SqlCommand
                Dim comandolot As New SqlCommand
    
                '..................................................................................................
                With comandomae
                    ' Asignar el sql para seleccionar los datos del objeto Maestro   
                    comandomae = New SqlCommand("listar_ingresos", conexion)
                    comandomae.CommandType = CommandType.StoredProcedure
                    
                End With
                'Enlazamos el procedimiento almacenado y rellenamos el dataset
    
                '..................................................................................................
                With Adaptador
                    .SelectCommand = comandomae
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_ingresos")
    
                End With
    
                '..................................................................................................
                ' Enlazar el DataGridView al dataset   
                With DgvProd
                    .DataMember = "listar_ingresos"
                    .DataSource = DataSet
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
    
    
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'DataGridView detalles   
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'Nuevamente el mismo procedimiento como con el ob. maestro
                'pero independiente por cada objeto detalle
                With comandodet
                    ' cadena sql para cargar el objeto detalle de ingresos   
                    comandodet = New SqlCommand("listar_detingreso", conexion)
                    comandodet.CommandType = CommandType.StoredProcedure
                End With
                With comandolot
                    ' cadena sql para cargar el segundo objeto detalle de ingresos   
                    comandolot = New SqlCommand("listar_detlote", conexion)
                    comandolot.CommandType = CommandType.StoredProcedure
                End With
    
                '..................................................................................................
                'rellenamos nuestro dataset con cada objeto especificado anteriormente en el comand
                With Adaptador
                    .SelectCommand = comandodet
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_detingreso")
                End With
                With Adaptador
                    .SelectCommand = comandolot
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_detlote")
                End With
                '..................................................................................................
    
                ' Agregar la relación ( campo en común : campo_Relacionado = coding )   
                'creando una nueva relacion desde el objeto maestro con el 2 detalle
                With DataSet
                    .Relations.Add("mi_Relacion", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detingreso").Columns(campo_Relacionado))
                    .Relations.Add("mi_Relacion1", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detlote").Columns(campo_Relacionado), False)
                End With
                '..................................................................................................
    
                'Enlazar cada dgv al dataset alimentado anteriormente con los datos de cada ob. especificado con el sqldataadapter
                With DgvDetalle
                    .DataSource = DataSet
                    .DataMember = "listar_ingresos.mi_Relacion"
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
    
                With DgvDetLote
                    .DataSource = DataSet
                    .DataMember = "listar_ingresos.mi_Relacion1"
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
                '..................................................................................................
    
                'cerrar la conexíón   
                With conexion
                    If .State = ConnectionState.Open Then
                        .Close()
                    End If
                    .Dispose()
                End With
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try
            '..................................................................................................
        End Sub

    Gracias ahora estoy en el problema de guardar los datos usando transacciones, seguro q estaremos comunicando nuevamente.

    atte

     

    J.Al

    • Marcado como respuesta jhAlex miércoles, 27 de febrero de 2013 13:19
    miércoles, 27 de febrero de 2013 13:18
  • Perfecto!

    Me alegro que la respuesta te haya podido ser de utilidad.

    Saludos.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.

    miércoles, 27 de febrero de 2013 13:30
  • Buen día ya tengo la solución de mi problema, gracias por tu mensaje JA Reyes, también me sirvió tu mensaje, pero la solución ha estado mas fácil de lo que imaginé, acá dejo el código, he tratado de comentar cada porción de código con la intensión de  que sirva de ayuda para los interesados, yo creo que se puede aumentar los detalles según el diseño de la base de datos y la información a mostrar.

        Public Sub CargarDatosIngreso()
    
            Dim conexion As New SqlConnection(My.Settings.conexJ)
            Try
                'abrir la conexión con la base de datos   
                conexion.Open()
                ' Nuevo objeto Dataset   
                Dim DataSet As New DataSet
    
    
                '''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'DataGridView maestro   
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'Crear el sqldataadapter para cada procedimiento almacenado en mi caso
                Dim Adaptador As New SqlDataAdapter()
                Dim Addet As New SqlDataAdapter()
                Dim Adlote As New SqlDataAdapter()
    
                'Crear el comand para especificar cada objeto a incluir en mi py
                Dim comandomae As New SqlCommand
                Dim comandodet As New SqlCommand
                Dim comandolot As New SqlCommand
    
                '..................................................................................................
                With comandomae
                    ' Asignar el sql para seleccionar los datos del objeto Maestro   
                    comandomae = New SqlCommand("listar_ingresos", conexion)
                    comandomae.CommandType = CommandType.StoredProcedure
                    
                End With
                'Enlazamos el procedimiento almacenado y rellenamos el dataset
    
                '..................................................................................................
                With Adaptador
                    .SelectCommand = comandomae
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_ingresos")
    
                End With
    
                '..................................................................................................
                ' Enlazar el DataGridView al dataset   
                With DgvProd
                    .DataMember = "listar_ingresos"
                    .DataSource = DataSet
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
    
    
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'DataGridView detalles   
                ' ''''''''''''''''''''''''''''''''''''''''''''''''''''   
                'Nuevamente el mismo procedimiento como con el ob. maestro
                'pero independiente por cada objeto detalle
                With comandodet
                    ' cadena sql para cargar el objeto detalle de ingresos   
                    comandodet = New SqlCommand("listar_detingreso", conexion)
                    comandodet.CommandType = CommandType.StoredProcedure
                End With
                With comandolot
                    ' cadena sql para cargar el segundo objeto detalle de ingresos   
                    comandolot = New SqlCommand("listar_detlote", conexion)
                    comandolot.CommandType = CommandType.StoredProcedure
                End With
    
                '..................................................................................................
                'rellenamos nuestro dataset con cada objeto especificado anteriormente en el comand
                With Adaptador
                    .SelectCommand = comandodet
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_detingreso")
                End With
                With Adaptador
                    .SelectCommand = comandolot
                    ' llenar el dataset   
                    Adaptador.Fill(DataSet, "listar_detlote")
                End With
                '..................................................................................................
    
                ' Agregar la relación ( campo en común : campo_Relacionado = coding )   
                'creando una nueva relacion desde el objeto maestro con el 2 detalle
                With DataSet
                    .Relations.Add("mi_Relacion", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detingreso").Columns(campo_Relacionado))
                    .Relations.Add("mi_Relacion1", .Tables("listar_ingresos").Columns(campo_Relacionado), .Tables("listar_detlote").Columns(campo_Relacionado), False)
                End With
                '..................................................................................................
    
                'Enlazar cada dgv al dataset alimentado anteriormente con los datos de cada ob. especificado con el sqldataadapter
                With DgvDetalle
                    .DataSource = DataSet
                    .DataMember = "listar_ingresos.mi_Relacion"
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
    
                With DgvDetLote
                    .DataSource = DataSet
                    .DataMember = "listar_ingresos.mi_Relacion1"
                    .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
                    '.DefaultCellStyle.BackColor = Color.AliceBlue
                End With
                '..................................................................................................
    
                'cerrar la conexíón   
                With conexion
                    If .State = ConnectionState.Open Then
                        .Close()
                    End If
                    .Dispose()
                End With
            Catch ex As Exception
                MsgBox(ex.Message.ToString)
            End Try
            '..................................................................................................
        End Sub

    Gracias ahora estoy en el problema de guardar los datos usando transacciones, seguro q estaremos comunicando nuevamente.

    atte

     

    J.Al

    Hola, queria preguntarte si pudiste resolver el tema guardar los datos usando las transacciones. Tengo que Guardar datos con store procedure de tablas Maestro detalles, donde los detalles a su vez son Maestros de otras tablas y no se como hacerlo.
    Ejemplo tengo una tabla recibo que tiene su tabla detalle "ReciboDetalle" que a su ves tiene una tabla detalle "ReciboDetallePago" que a su vez tiene una Tabla "Cheques". El problema es que si inserto un cheque y luego el usuario cancela el recibo, el cheque ya esta grabado.
    sábado, 21 de enero de 2017 13:39