Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Una de las consultas comúnmente solicitadas a través del Blog, tiene que ver con la actualización de datos de dos tablas relacionadas en una BD de SQL, o sea actualizar una vista maestro-detalle vinculadas a sendas tablas.

Aunque por obvio y sencillo, las explicaciones acostumbran a ser de lo más diversas y finalmente te das cuenta que la mayoría de ejemplos se inician con un "desparrame" de jergas incomprensivas para la mayoría. Me decido postearos el ejemplo más básico posible, para que a partir de este punto podáis hacerlo crecer a vuestra necesidad.

Espero que os sea útil y despeje vuestras jaquecas cuando se trata de lidiar con diversas tablas.
PepLluis,

 (Para ejecutar el ejemplo, iniciar Visual Studio y crear un nuevo proyecto 'Winform', añadir dos DataGridView y un Button, copiar / pegar codigo y por supuesto F5)

Imports System.Data.SqlClient

Public Class Form1

    Private Maestro As SqlDataAdapter
    Private Detalle As SqlDataAdapter
    Private ConjuntoDeDatos As DataSet

    Private Sub Form1_Load() Handles MyBase.Load

        Dim miConexion As New SqlConnection("Data Source=.\SQLExpress;Initial Catalog=MaestroDetalle;Integrated Security=True")

        Maestro = New SqlDataAdapter("Select * From Maestro", miConexion)
        Dim MaestroCmdBuilder As New SqlCommandBuilder(Maestro)

        Detalle = New SqlDataAdapter("Select * From Detalle", miConexion)
        Dim DetalleCmdBuilder As New SqlCommandBuilder(Detalle)

        ConjuntoDeDatos = New DataSet
        Maestro.Fill(ConjuntoDeDatos, "Maestro")
        Me.DataGridView1.DataSource = ConjuntoDeDatos
        Me.DataGridView1.DataMember = "Maestro"

        Detalle.Fill(ConjuntoDeDatos, "Detalle")
        Me.DataGridView2.DataSource = ConjuntoDeDatos

        ConjuntoDeDatos.Relations.Add("Fk", ConjuntoDeDatos.Tables("Maestro").Columns("IdMaestro"),
                                            ConjuntoDeDatos.Tables("Detalle").Columns("IdDetalle"))

        Me.DataGridView2.DataMember = "Maestro.Fk"
    End Sub

    Private Sub Actualizar() Handles Button1.Click
        If ConjuntoDeDatos.HasChanges Then
            Maestro.Update(ConjuntoDeDatos, "Maestro")
            Detalle.Update(ConjuntoDeDatos, "Detalle")
        End If
    End Sub
End Class

Comments

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Tuesday, August 31, 2010 5:50 AM by bumbala

after update master data on grid, then press button, it throws an exception, what can i do ??

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Tuesday, August 31, 2010 9:47 AM by peplluis

Hi Bunbala,

Problably you have a problem with keys, you must verify and define the primary keys in every table.

Please give the message error or contact with me to explain better and continue this conversation.

Regards,

Pep Lluis,

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Wednesday, September 01, 2010 4:59 AM by bumbala

thanks for your reply, i think i define the primary keys correctly, the error message is: "The UPDATE statement conflicted with the REFERENCE constraint "FK_Detail_Master". The conflict occurred in database "MasterDetail", table "dbo.Detail", column 'm_id'. The statement has been terminated."

or you can download the code and data from this link: rapidshare.com/.../bumbala.zip

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Wednesday, September 01, 2010 8:20 AM by peplluis

Bunbala,

Your m_id in detail used as relation is defined for "allow null values", try with uncheck allow option.

Regards,

Pep Lluis,

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Wednesday, September 01, 2010 9:57 AM by bumbala

so, no need for relationship on database, thank you very much, it is ok now

# re: caracteristicas de las formas y reportes maestro-detalle

Monday, October 25, 2010 6:03 PM by zintya

ayudame x favor

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Tuesday, October 26, 2010 1:40 AM by peplluis

zintya,

En todo caso dinos como te podemos ayudar.

PepLluis,

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Wednesday, November 10, 2010 5:03 AM by Ivan

Hola, hacer esto así, con dos DataGrid es sencillo, lo complicado está en hacerlo cuando muestras datos del maestro y detalle en el mismo DataGrid. ¿Tienes algún ejemplo de ello? Gracias de antemano.

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Friday, November 12, 2010 12:00 PM by peplluis

Hola Ivan,

Este blog intenta ayudar con ejemplos sencillos, tambien dependiendo del tema de interes publicamos alguno que otro mas complejo, pero lamentablemente no dispongo en estos momentos de ninguno como el que necesitas. Has probado en lanzar esta peticion en los foros de MSDN, seguro que alguien ya ha tratado el tema con anterioridad.

Saludos,

Pep Lluis,

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Wednesday, January 11, 2012 6:18 AM by David

Hola Pep, ¿qué tal? Buscando por Google, acabo de encontrarme con este post tuyo y me parece muy bueno.

El caso es que necesito hacer algo similar, pero me gustaría ampliar en varias cosas y me he atrevido a solicitarte ayuda, por supuesto, si tienes disponibilidad y te parece bien prestármela. Es lo siguiente:

- Me gustaría permitir que el usuario modificase, añadiese y eliminara registros directamente en los datagridview... ¿Con qué eventos puedo controlar que los datos cumplan las restricciones oportunas, así como acciones posteriores a la actualización de un registro, etc...?

- Para un entorno multiusuario, ¿es posible gestionar la concurrencia con esa edición directa en los grid? ¿Puedes orientarme cómo hacerlo?

- Me gustaría usar modo desconectado (así me basta con las 5 conexiones de SQL Express), pero no sé si los dataadapter abren y cierran la conexión cuando la usan o la mantienen abierta todo el tiempo que están instanciados. ¿Puedes orientarme?

Muchas gracias por adelantado, como he dicho antes, entenderé que no puedas ayudarme... hoy en día todos vamos algo estresados.

Saludos

David Montesa

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Thursday, January 12, 2012 5:36 PM by peplluis

Hola David,

Para responderte rapido, pues quizas es mas apropiado postear estas preguntas/respuestas en los foros para que sean utiles a otras personas.

- Los adaptadores siempre funcionan en modo desconectado.

- Tiempo atras tenia un ejemplo para controlar concurrencia... pero no dispongo de tiempo para componerlo.

Si te parece y lo necesitas contactame directamente o pasamos a los foros para postear algo sobre concurrencia.

Saludos,

PepLluis,

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Monday, March 19, 2012 8:57 AM by Paulo AG

la verdad... que muy bien explicado....  muy sencillo...  no sabes la ayuda me diste con este ejemplo..

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Saturday, December 08, 2012 4:58 AM by Andres

Hola Pep:

Gracias por el post,Tengo un problema, y es que no me carga el segundo Datagrid, he utilizado una base en la que tengo clientes(esos ls carga sin problema)y codigos postales ya enlazada en mysql,en la relación, los hago por campo común, lo único que se me ocurre es que tengo 3 campos en la tabla de codigos postales, y por eso no los carga,si me echaras una mano te lo agradecería, y si no ,pues también.

un saludo

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Tuesday, December 11, 2012 2:43 AM by peplluis

Hola Andres,

No puedo echarte una mano... pues me quedaria sin ella jajajajaja.

Dime como puedo ayudarte.

PepLluis,

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Tuesday, December 11, 2012 8:02 AM by Juan Carlos

Muchas gracias por tu aportacion, segui el ejemplo que esta posteado adaptado ami base de datos de acces y funciona bien pero el momento de guardar los cambios que hago en el Datagridvie "Detalle" me marca eror:

"La generación SQL dinámica para UpdateCommand no es compatible con SelectCommand, que no devuelve ninguna información sobre columnas clave." Me puede ayudar que se deba este eror..? gracias

# re: Actualizar dos tablas vinculadas en una vista Maestro-Detalle

Wednesday, December 12, 2012 9:06 AM by peplluis

Hola Juan Carlos,

Según la información que incluyes y a simple vista te estaria indicando que debes tener bien definida las "claves primarias" es por eso que el "commandbuilder" no puede completar la generación dinamica del "UpdateCommand".

Espero que esto te ayude.

PepLluis,

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: