none
Instrucción INSERT en conflicto con la restricción FOREIGN KEY RRS feed

  • Pregunta

  • Tengo un procedimiento almacenado que me insert en 3 tablas, pero me sale este error al ejecutarlo, la pregunta es como evitar este conflicto con los id's de las tablas:

    ////////////////////////////////////////////////////////////////////////////

    ALTER PROCEDURE [dbo].[GuardarContratoFacturaDetalle]
    --DATOS DE CONTRATO
    @IdFactura int,
    @NumContrato int,
    @InicialPrima float,
    @LugarRealizarPago varchar(10),
    @NumCuotas int,
    @FormaPago varchar(10),
    @FechaEntrega datetime,
    @LugarEntrega varchar(10),
    -- DATOS DE FACTURA
    @IdUsuario int,
    @IdCliente int,
    @NumFactura int,
    @Iva float,
    @Fecha datetime,
    --DATOS DE DETALLE DE FACTURA
    @IdProducto int,
    @Cantidad int,
    @Monto float,
    @Descuento float
    AS
    BEGIN
    INSERT INTO CONTRATO 
    VALUES (@IdFactura,@NumContrato,@InicialPrima,@LugarRealizarPago,@NumCuotas,@FormaPago,@FechaEntrega,@LugarEntrega)
    INSERT INTO FACTURA 
    VALUES (@IdUsuario,@IdCliente,@NumFactura,@Iva,@Fecha)
    INSERT INTO Detalle_Factura 
    VALUES (@IdFactura,@IdProducto,@Cantidad,@Monto,@Descuento)
    END
    RETURN 0

    ////////////////////////////////////////////////////////////////////////////////////// Les agradeceria que me ayuden

    domingo, 3 de diciembre de 2017 20:24

Respuestas

  • la pregunta es como evitar este conflicto con los id's de las tablas

    ¿Cómo evitarlo? Pues poniendo los IDs correctos. Por ejemplo, si tienes un foreign key desde la tabla de contratos a la de facturas, ese foreign key significa que no puedes poner un contrato sobre una factura que no existe. Si por ejemplo, intentas insertar un contrato con el IdFactura = 234, y resulta que en la tabla de facturas no existe la 234, pues te da un error. Para evitarlo, tienes que poner el id correcto: una de dos, o bien primero grabas la factura 234, o bien si no es esa, buscas la factura correcta, tomas su ID (que tiene que existir ya en la tabla), y grabas éste en el contrato. Nótese que según tu procedimiento, ese ID viene como parámetro pasado al procedimiento desde fuera, así que esa operación de buscar el ID correcto y/o crear antes la factura tiene que hacerla previamente el código que invoca a tu procedimiento.
    domingo, 3 de diciembre de 2017 21:02
  • Si, perfectamente, pero como te mencionaba al inicio, debes invertir el orden de inserción y de esta forma solventaras el problema.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    domingo, 3 de diciembre de 2017 21:28
  • Te agradezco hermano, Así lo haré... Saludos
    domingo, 3 de diciembre de 2017 22:15

Todas las respuestas

  • Tengo un procedimiento almacenado que me insert en 3 tablas, pero me sale este error al ejecutarlo, la pregunta es como evitar este conflicto con los id's de las tablas:

    ////////////////////////////////////////////////////////////////////////////

    ALTER PROCEDURE [dbo].[GuardarContratoFacturaDetalle]
    --DATOS DE CONTRATO
    @IdFactura int,
    @NumContrato int,
    @InicialPrima float,
    @LugarRealizarPago varchar(10),
    @NumCuotas int,
    @FormaPago varchar(10),
    @FechaEntrega datetime,
    @LugarEntrega varchar(10),
    -- DATOS DE FACTURA
    @IdUsuario int,
    @IdCliente int,
    @NumFactura int,
    @Iva float,
    @Fecha datetime,
    --DATOS DE DETALLE DE FACTURA
    @IdProducto int,
    @Cantidad int,
    @Monto float,
    @Descuento float
    AS
    BEGIN
    INSERT INTO CONTRATO 
    VALUES (@IdFactura,@NumContrato,@InicialPrima,@LugarRealizarPago,@NumCuotas,@FormaPago,@FechaEntrega,@LugarEntrega)
    INSERT INTO FACTURA 
    VALUES (@IdUsuario,@IdCliente,@NumFactura,@Iva,@Fecha)
    INSERT INTO Detalle_Factura 
    VALUES (@IdFactura,@IdProducto,@Cantidad,@Monto,@Descuento)
    END
    RETURN 0

    ////////////////////////////////////////////////////////////////////////////////////// Les agradeceria que me ayuden

    Este es el diagrama que uso
    domingo, 3 de diciembre de 2017 20:38
  • Básicamente ese mensaje de error indica que se esta intentando insertar una fila dentro de una tabla que posee una restricción del tipo Foreign Key, aunque no posteas las estructuras de tus tables (incluyendo las restricciones de tipo FK y PK), pero viendo el código que estas posteando asumo que el problema es que estas intentando insertar una fila en la tabla CONTRATO la cuál incluye un @IdFactura que posiblemente no existe, puesto que el registro en la tabla FACTURA es insertado después del intento de inserción en la tabla CONTRATO, invierte el orden y realiza la inserción de la fila CONTRATO al final.



    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    domingo, 3 de diciembre de 2017 20:39
  • Entiendo lo que dices, pero como puedo evitar eso; si trato de hacer una inserción aparte con contrato y las otras 2 juntas? Lo que pasa es que lo voy a hacer desde un solo formulario--- Ese es el objetivo
    domingo, 3 de diciembre de 2017 20:56
  • la pregunta es como evitar este conflicto con los id's de las tablas

    ¿Cómo evitarlo? Pues poniendo los IDs correctos. Por ejemplo, si tienes un foreign key desde la tabla de contratos a la de facturas, ese foreign key significa que no puedes poner un contrato sobre una factura que no existe. Si por ejemplo, intentas insertar un contrato con el IdFactura = 234, y resulta que en la tabla de facturas no existe la 234, pues te da un error. Para evitarlo, tienes que poner el id correcto: una de dos, o bien primero grabas la factura 234, o bien si no es esa, buscas la factura correcta, tomas su ID (que tiene que existir ya en la tabla), y grabas éste en el contrato. Nótese que según tu procedimiento, ese ID viene como parámetro pasado al procedimiento desde fuera, así que esa operación de buscar el ID correcto y/o crear antes la factura tiene que hacerla previamente el código que invoca a tu procedimiento.
    domingo, 3 de diciembre de 2017 21:02
  • Ah ya entiendo... O sea que primero tengo que guardar una Factura para luego realizar e insertar un contrato??? 

    domingo, 3 de diciembre de 2017 21:15
  • Ah ya entiendo... O sea que primero tengo que guardar una Factura para luego realizar e insertar un contrato??? 

    Y siempre podria hacer dos inserciones en 1 solo SP y la otra inserción en 1 solo
    domingo, 3 de diciembre de 2017 21:16
  • Si, perfectamente, pero como te mencionaba al inicio, debes invertir el orden de inserción y de esta forma solventaras el problema.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    domingo, 3 de diciembre de 2017 21:28
  • Te agradezco hermano, Así lo haré... Saludos
    domingo, 3 de diciembre de 2017 22:15