none
borrar maestro detalle RRS feed

  • Pregunta

  • cordial saludo,

     

    los molesto copn lo siguiente lo cual me esta causando un problema y no se por que .

    trabajo un formulario con un maestro - detalle, el problema es en el momento de darle eliminar, que solo me elimina el maestro pero el detalle no y me genera un error, trabajo con bindingsource, el codigo que utiliso es el siguiente:

     Public Function EliminarDatosGenerales()
            With FormaDatosGenerales
                If (MessageBox.Show("¿Desea Eliminar este Registro?", "Eliminar Registro", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2) = DialogResult.Yes) Then
                    Try
                        .TablaPersonasBindingSource.RemoveCurrent()
                        .TablaPersonasTableAdapter.Update(.DatosGeneralesDataSet.TablaPersonas)
                        .TablaDocumentosBindingSource.RemoveCurrent()
                        .TablaDocumentosTableAdapter.Update(.DatosGeneralesDataSet.TablaDocumentos)
                        .TablaTarjetasBindingSource.RemoveCurrent()
                        .TablaTarjetasTableAdapter.Update(.DatosGeneralesDataSet.TablaTarjetas)
                    Catch ex As Exception
                        MessageBox.Show(ex.Message)
                    End Try
                End If
                Validar_DatosGenerales()
            End With
            Return 0
        End Function

    cuando le dopy click a esta funcion me elimina el detalle y me bota una excecion, quie dice que no me puede quitar el elemento de la lista por que no exixte tal elemento,

    al mirar la tabla en la base de datos en sql observo que no me lo ha quitado de las tablas del detalle, la verda no se por que sucede esto si me pueden ayudar muchas gracias.

    martes, 9 de agosto de 2011 14:01

Respuestas

  • "Rafilla13" preguntó:

    > trabajo un formulario con un maestro - detalle, el problema es
    > en el momento de darle eliminar, que solo me elimina el maestro
    > pero el detalle no y me genera un error,

    ¡Vamos a ver, Rafael! ¿Por qué cuesta tanto trabajo indicar desde un primer momento los siguientes datos?

    1º) ¿Están las tablas maestro y detalle relacionadas en la propia base de datos de SQL Server?

    2º) Si existe alguna relación entre ellas, ¿las reglas de eliminación y actualización son en "cascada"?

    Si en la propia base de datos se pemiten las eliminaciones y actualizaciones en cascada, cuando desde tu aplicación envíes a la base de datos el registro maestro que deseas eliminar, el propio motor se encargará de eliminar aquellos registros existentes en la tabla detalle relacionados.

    Pero si en la base de datos no están relacionadas las tablas, menos aún existirán reglas de actualización y eliminación en "cascada", por tanto, éstas relaciones y reglas las tienes que implementar en el propio Origen de datos que has creado en tu aplicación de Visual Basic, y todo ésto se configura desde el propio Diseñador del origen de datos.

    Abre el origen de datos de tu proyecto en el Diseñador, y haz doble clic en la relación creada. Si en la base de datos de SQL Server no existe relación alguna entre las tablas, tienes que establecer el siguiente valor:

        - Tanto relación como restricción Foreing Key

    tal y como aparece en la siguiente imagen:

    Insisto en que estos son temas más relacionados con el diseño de la propia base de datos que con Visual Basic.

     

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 9 de agosto de 2011 15:24
    Moderador
  • "Rafilla13" escribió:

    > le entendi a softjaen y me falta ba modificar lo de cascada, pero
    > me imagino que tendria que configurar otra vez el maestro detalle,

    ¿Has leído mi última respuesta a ésta? Te vuelvo a repetir la pregunta:

    Estarán relacionadas, pero ¿las reglas de eliminación y actualización están en cascada?

    Si en la clave foránea tienes establecidas dichas reglas, no hace falta que hagas nada en el origen de datos de tu proyecto, porque será el propio motor el que se encargará de eliminar los registros relacionados con el registro de la tabla maestra que deseas eliminar.

    > pero tambien pienso en una consulta en donde pueda eliminar los registros de la tabla.

    Primero tendrías que eliminar los registros de la tabla Detalle que se correspondan con el identificador único de la tabla Maestra:

      DELETE FROM Detalle
      WHERE Campo_Tabla_Detalle = valor_campo_tabla_maestra

    Y después eliminar el registro de la tabla Maestra:

      DELETE FROM Maestra
      WHERE Campo_Tabla_Maestra = valor_campo_tabla_maestra

    Me imagino que sabrás cómo ejecutar éstas consultas T-SQL de acción desde tu proyecto de Visual Basic. Simplemente tienes que llamar al método ExecuteNonQuery de un objeto SqlCommand debidamente configurado.

     


    Enrique Martínez
      [MS MVP - VB]


    martes, 9 de agosto de 2011 17:09
    Moderador
  • "Rafilla13" escribió:

    > las tablas en sql server estan hechas cada una con su lave principal,
    > ademas el maestro tiene su lav principal y sus dos llaves foraneas
    > correspondientes a cada detalle, entonces si estan relacionadas
    > desde la sql,

    Estarán relacionadas, pero ¿las reglas de eliminación y actualización están en cascada?

    > lo que yo veo en tu imagen es que yo si lo tengo diferente, ya que
    > yo hago la relacion pero lo dejo en donde dice solo relacion,

    Yo te he indicado que establezcas el valor "Tanto relación como restricción Foreing Key", por si no están establecidas las reglas de eliminación y actualización en cascada en la PROPIA BASE DE DATOS. Si no están establecidas dichas reglas en la base de datos, tienes que establecerlas en el origen de datos de tu proyecto.

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 9 de agosto de 2011 15:51
    Moderador

Todas las respuestas

  • hola

    pero no es correcto esto que planteas si eliminas el maestro por logica el detalle pierde sentido y deberia eliminarse

     

    ademas imagino en la tabla mantiene una relacion de integridad, por lo tanto no podras eliminar sin que esta salte y genere un error

    consejo elimina priemro el detalle a partir del id del maestro y luego este

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 9 de agosto de 2011 14:06
  • si tienes toda la razon, en lo que mencionas pero es que me sucede el siguiente problema, te pongo el ejemplo

     

    en el maestro tengo el registro numero 1 en el idmaestro esta el numero 1 logicamente, ahora en el detalle tengo dos registros entonces quedaria asi idmaestro 1 iddetalle 1, idmaestro 1 iddetalle2,

    listo cuando elimino el maestro solo aja logicamente el detalle pierde sentido por que ya no esta su mnaestro, pero cuando le doy click al boton agregar el maestro en su id me vuelve a traer el idmaestro1 y logicamente como en las tablas de detalles esta guardado iidmaestro 1 iddetalle 1, idmaestro 1 iddetalle2, pues me lo muestra en  pantalla esto,

    entonces por eso digo que me gustaria tambien eliminar el detalle, o me gustaria que me diern alguna sugerencia, para que se me arreglara este problema

    gracias por su ayudas

     

    martes, 9 de agosto de 2011 14:36
  • cuando elimino el maestro solo aja logicamente el detalle pierde sentido por que ya no esta su mnaestro

    pero esto no deberia suceder, si tienes integradad en als tablas deberias tenr un error al hacer esto

    por lo que veo entonces integridad en la tabla no tienes

    deberias priemro eliminar los registros del detalle, todos los relacionados con el idmaestro=1 y luego que eliminas estos recine ahi el maestro

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 9 de agosto de 2011 14:39
  • gracias por tu ayuda,

    la verdad no se que sucede

    ya coloque los detalles primero y me sucede lo siguiente que si tengo dos registros en el detalle solo me esta eliminado uno y luego me elimina el maestro

    entonces a l darle click en el boton nuevo o agregar, me le pone el id1 al maestro y me sigue llevando los detalles que tienen al idmaestro 1

    la verdad no se que hacer voy a verificar.

     

    martes, 9 de agosto de 2011 14:52
  • sabes que query se aplica al eliminar el detalle ?

    o sea recuerda que deberia filtrar por el id del maestro

    DELETE FROM detalle WHERE idmaestro = @id

     

    si filtras por el id del detalle es logico que borre solo uno

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 9 de agosto de 2011 14:59
  • si muchas gracias por tu ayuda, si es logico lo que dices y yo lo se,

    lo que me queda ahora es buscar y tratar de construir una consulta o query para que me elimine todo lo que necesite.

    martes, 9 de agosto de 2011 15:11
  • "Rafilla13" preguntó:

    > trabajo un formulario con un maestro - detalle, el problema es
    > en el momento de darle eliminar, que solo me elimina el maestro
    > pero el detalle no y me genera un error,

    ¡Vamos a ver, Rafael! ¿Por qué cuesta tanto trabajo indicar desde un primer momento los siguientes datos?

    1º) ¿Están las tablas maestro y detalle relacionadas en la propia base de datos de SQL Server?

    2º) Si existe alguna relación entre ellas, ¿las reglas de eliminación y actualización son en "cascada"?

    Si en la propia base de datos se pemiten las eliminaciones y actualizaciones en cascada, cuando desde tu aplicación envíes a la base de datos el registro maestro que deseas eliminar, el propio motor se encargará de eliminar aquellos registros existentes en la tabla detalle relacionados.

    Pero si en la base de datos no están relacionadas las tablas, menos aún existirán reglas de actualización y eliminación en "cascada", por tanto, éstas relaciones y reglas las tienes que implementar en el propio Origen de datos que has creado en tu aplicación de Visual Basic, y todo ésto se configura desde el propio Diseñador del origen de datos.

    Abre el origen de datos de tu proyecto en el Diseñador, y haz doble clic en la relación creada. Si en la base de datos de SQL Server no existe relación alguna entre las tablas, tienes que establecer el siguiente valor:

        - Tanto relación como restricción Foreing Key

    tal y como aparece en la siguiente imagen:

    Insisto en que estos son temas más relacionados con el diseño de la propia base de datos que con Visual Basic.

     

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 9 de agosto de 2011 15:24
    Moderador
  • gracias por tu respuesta,

    las tablas en sql server estan hechas cada una con su lave principal, ademas el maestro tiene su lav principal y sus dos llaves foraneas correspondientes a cada detalle, entonces si estan relacionadas desde la sql,

    lo que yo veo en tu imagen es que yo si lo tengo diferente, ya que yo hago la relacion pero lo dejo en donde dice solo relacion,

    ahora procedere a colocar tanto relñacion como restriccion FK y a cambiarlo a cascada.

     

    Muchas gracias por sus grandes ayudas.

    martes, 9 de agosto de 2011 15:39
  • "Rafilla13" escribió:

    > las tablas en sql server estan hechas cada una con su lave principal,
    > ademas el maestro tiene su lav principal y sus dos llaves foraneas
    > correspondientes a cada detalle, entonces si estan relacionadas
    > desde la sql,

    Estarán relacionadas, pero ¿las reglas de eliminación y actualización están en cascada?

    > lo que yo veo en tu imagen es que yo si lo tengo diferente, ya que
    > yo hago la relacion pero lo dejo en donde dice solo relacion,

    Yo te he indicado que establezcas el valor "Tanto relación como restricción Foreing Key", por si no están establecidas las reglas de eliminación y actualización en cascada en la PROPIA BASE DE DATOS. Si no están establecidas dichas reglas en la base de datos, tienes que establecerlas en el origen de datos de tu proyecto.

     


    Enrique Martínez
      [MS MVP - VB]

    martes, 9 de agosto de 2011 15:51
    Moderador
  • me perdi, pero entonces quieres eliminar los registro controlando tu la operacion, o que se encargue la db automaticamente ?

    yo habia pensado que querias hacerlo desde codigo controlando las acciones, pero bueno puede que hayas considerado otro camino

     

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 9 de agosto de 2011 15:55
  • muchas gracias leandro,

    la verdad quiero eliminarlos de cualquier forma

    le entendi a softjaen y me falta ba modificar lo de cascada, pero me imagino que tendria que configurar otra vez el maestro detalle,

    pero tambien pienso en una consulta en donde pueda eliminar los registros de la tabla.

    martes, 9 de agosto de 2011 16:59
  • "Rafilla13" escribió:

    > le entendi a softjaen y me falta ba modificar lo de cascada, pero
    > me imagino que tendria que configurar otra vez el maestro detalle,

    ¿Has leído mi última respuesta a ésta? Te vuelvo a repetir la pregunta:

    Estarán relacionadas, pero ¿las reglas de eliminación y actualización están en cascada?

    Si en la clave foránea tienes establecidas dichas reglas, no hace falta que hagas nada en el origen de datos de tu proyecto, porque será el propio motor el que se encargará de eliminar los registros relacionados con el registro de la tabla maestra que deseas eliminar.

    > pero tambien pienso en una consulta en donde pueda eliminar los registros de la tabla.

    Primero tendrías que eliminar los registros de la tabla Detalle que se correspondan con el identificador único de la tabla Maestra:

      DELETE FROM Detalle
      WHERE Campo_Tabla_Detalle = valor_campo_tabla_maestra

    Y después eliminar el registro de la tabla Maestra:

      DELETE FROM Maestra
      WHERE Campo_Tabla_Maestra = valor_campo_tabla_maestra

    Me imagino que sabrás cómo ejecutar éstas consultas T-SQL de acción desde tu proyecto de Visual Basic. Simplemente tienes que llamar al método ExecuteNonQuery de un objeto SqlCommand debidamente configurado.

     


    Enrique Martínez
      [MS MVP - VB]


    martes, 9 de agosto de 2011 17:09
    Moderador