none
Actualizar una clave primaria de una tabla con dos primarias

    Question

  • Hola a todos,

    Tengo una consulta y voy a plantear un caso muy sencillo para que no haya ambigüedades.
    Imaginemos un tabla con un solo campo, que es la identidad i autoincremental: Tabla 'presupuesto', campo IDpresupuesto.
    Ahora imaginemos otra tabla con una clave primaria compuesta por dos campos y un campo normal: Tabla 'presupuesto_partida', campos: IDpresupuesto, IDpartida, valor.

    Bien, en un formulario se representa la tabla presupuesto y en un datagridview de este formulario la tabla presupuesto_partida (el típico subformulario de access).

    Tengo una clase 'helper' que se encarga de crear las conexiones con la bdd y mantener ésta actualizada, creando los dataadapters correspondientes y commands parametrizados para insert, update y delete.

    La consulta es la siguiente:

    como o de qué manera se debe crear el command del update para la tabla 'presupuesto_partida', para que cuando en el datagridview se cambie el campo IDpartida no de ningun error, debido a que el command que se ha creado en la clase helper para esta acción es el siguiente:

    "UPDATE presupuesto_partida SET IDpresupuesto=@pIDpresupuesto, IDpartida=@pIDpartida, valor=@pvalor WHERE IDpresupuesto=@pIDpresupuesto AND IDpartida=@pIDpartida".

    Se puede observar que si el parámetro que cambiamos en el datagridview es 'valor' funcionara todo correctamente, pero en el momento en que queramos cambiar 'IDpartida' nos encontraremos con esta incongruencia:
    Por ejemplo imaginemos que estamos en el presupuesto 1, y en el grid tenemos selecionada la IDpartida 3 que tiene un valor de 100 y queremos cambiar a la partida 25, pasa lo siguiente.

    "UPDATE presupuesto_partida SET IDpresupuesto=1, IDpartida=25, valor=100 WHERE IDpresupuesto=1 AND IDpartida=25".

    quiere cambiar IDpartida a 25 pero en la cláusula WHERE lo busca en el índice 25 y no en el 3 que es donde está...claro, error.

    En la clase helper se crean los commands antes de saber qué cambio voy a hacer, por lo tanto tiene que haber alguna manera de poder cambiar   'IDpartida' de la tabla 'presupuesto_partida a través de unos commands generados por la clase helper.

    Espero que se haya entendido, alguien puede ayudar-me por favor?

    muchas gracias.






    • Edited by Kaliand Sunday, December 02, 2012 10:33 PM
    Sunday, December 02, 2012 11:17 AM

All replies

  • Hola,

    Si no entendi mal vos lo que queres es cambiar el valor de un campo que a su vez forma parte de la clave principal.

    Para el ejemplo que diste tu sentencia de update deberia ser la siguiente:

    "UPDATE presupuesto_partida SET IDpartida=25, valor=100 WHERE IDpresupuesto=1 AND IDpartida=3"

    Esto traducido al español seria:

    Actualizame el campo IDpartida con 25, el campo valor con 100 para el registro cuyo campo IDpresupuesto es igual a 1 y el campo IDpartida es 3. 

    Victor Koch.

    Tuesday, December 04, 2012 2:41 PM
  • si la key de la tabla es identity lo que quieres hacer no se puede, o mejor no se deberia

    lo que haces es eliminar el registro anterior y crear uno nuevo con eso crearias un nuevo id, nos e puede ahcer un UPDATE sobre un campo clave y menos aun si es identity

    en resumen elimina y vuelve a insertar, no vayas por el update

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Tuesday, December 04, 2012 3:00 PM
  • Hola Leandro,

    Efectivamente, un campo identity no es ni debería ser actualizable, y contemplé la solución que me propones, pero he optado por una solución que me parece más acorde como funciona los objetos dataadapter de .net.

    He planteado un nuevo disseñoo para las tablas que funcionan como subformularios y que estan formadas por ID's relacionados de otras tablas, de la siguiente manera:

    Tomando el ejemplo de arriba para la tabla presupuesto_partida:

    Creo una clave UNIQUE identity (autoincremental) como referencia inequivoca de cada row, por ejemplo IDPrePar.
    Creo una clave primaria compuesta por los dos ID's relacionados: IDpresupuesto y IDpartida.

    De esta manera refuerzo la integridad de los datos y tengo una única clave (no bussines) para realizar las acciones update del dataadapter, quedando de la siguiente manera:

    "UPDATE presupuesto_partida SET IDpresupuesto=@pIDpresupuesto, IDpartida=@pIDpartida, valor=@pvalor WHERE IDPrePar=@pIDPrePar"

    Me parece una manera elegante de plantear este problema y de reforzar la integridad de los datos.

    que te parece?

    Un saludo y gracias por tus aportaciones.

     

    Wednesday, December 05, 2012 11:15 AM