none
Hacer un Insert en dos tablas RRS feed

  • Pregunta

  • Buenas tardes, tengo una duda tengo que hacer un insert a dos tablas de ventas una es encabezado y la otra es el detalle, la duda que tengo es que en el encabezado la columna SALES_ORDER_ID es autoincremental, y al hacer el insert hacia la columna de detalle me pide este dato que lo desconozco, de que manera podría hacer los inserts para que no me de error.

    Gracias por su ayuda


    Luis Paredes

    jueves, 11 de enero de 2018 21:53

Respuestas

  • Hola, puedes recuperarlo haciendo un

    SELECT SCOPE_IDENTITY()

    luego de la inserción y asi lo puedes almacenar en una variable y lo insertas en la otra tabla , te recomendaría utilices transacciones 

    SCOPE_IDENTITY (Transact-SQL)


    Votar es agradecer.
    Saludos.
    Lima-Perú


    jueves, 11 de enero de 2018 22:16
  • hola, podrias intentar

    Declare @varidentity as int
    
    INSERT INTO TABLA_SALES_ORDER_HEADER
    (
        TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
    	...........
        LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
    )
    SELECT
        TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
    	...........
    	LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
       FROM TABLA_SALES_ORDER_HEADER ssoh
       WHERE CONVERT(date, ssoh.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)
       
       Set @varidentity=(Select scope_identity())
       
       INSERT INTO TABLA_SALES_ORDER_DETAIL
        (
        SALES_ORDER_ID,
        .......
    	)
    	SELECT 
        @varidentity,
    	.......
    	DISCOUNT_TYPE
        FROM TABLA_SALES_ORDER_DETAIL ssod
        WHERE CONVERT(date, ssod.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)


    Votar es agradecer.
    Saludos.
    Lima-Perú



    jueves, 11 de enero de 2018 23:50
  • Hola esto es lo que estoy tratando de hacer:
    INSERT INTO TABLA_SALES_ORDER_HEADER
    (
        TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
        GPS_URL,
        TOTAL_AMOUNT,
        STATUS,
        POSTED_BY,
        IMAGE_1,
        IMAGE_2,
        IMAGE_3,
        DEVICE_BATTERY_FACTOR,
        VOID_DATETIME,
        VOID_REASON,
        VOID_NOTES,
        VOIDED,
        CLOSED_ROUTE_DATETIME,
        IS_ACTIVE_ROUTE,
        GPS_EXPECTED,
        DELIVERY_DATE,
        SALES_ORDER_ID_HH,
        ATTEMPTED_WITH_ERROR,
        IS_POSTED_ERP,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_PARENT,
        REFERENCE_ID,
        WAREHOUSE,
        TIMES_PRINTED,
        DOC_SERIE,
        DOC_NUM,
        IS_VOID,
        DISCOUNT,
        SALES_ORDER_TYPE,
        IS_DRAFT,
        ASSIGNED_BY,
        TASK_ID,
        COMMENT,
        ERP_REFERENCE,
        POSTED_DB,
        PAYMENT_TIMES_PRINTED,
        PAID_TO_DATE,
        TO_BILL,
        HAVE_PICKING,
        AUTHORIZED,
        AUTHORIZED_BY,
        AUTHORIZED_DATE,
        DISCOUNT_BY_GENERAL_AMOUNT,
        IS_SENDING,
        IS_READY_TO_SEND,
        LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
    )
    SELECT
    TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
        GPS_URL,
        TOTAL_AMOUNT,
        STATUS,
        POSTED_BY,
        IMAGE_1,
        IMAGE_2,
        IMAGE_3,
        DEVICE_BATTERY_FACTOR,
        VOID_DATETIME,
        VOID_REASON,
        VOID_NOTES,
        VOIDED,
        CLOSED_ROUTE_DATETIME,
        IS_ACTIVE_ROUTE,
        GPS_EXPECTED,
        DELIVERY_DATE,
        SALES_ORDER_ID_HH,
        ATTEMPTED_WITH_ERROR,
        IS_POSTED_ERP,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_PARENT,
        REFERENCE_ID,
        WAREHOUSE,
        TIMES_PRINTED,
        DOC_SERIE,
        DOC_NUM,
        IS_VOID,
        DISCOUNT,
        SALES_ORDER_TYPE,
        IS_DRAFT,
        ASSIGNED_BY,
        TASK_ID,
        COMMENT,
        ERP_REFERENCE,
        POSTED_DB,
        PAYMENT_TIMES_PRINTED,
        PAID_TO_DATE,
        TO_BILL,
        HAVE_PICKING,
        AUTHORIZED,
        AUTHORIZED_BY,
        AUTHORIZED_DATE,
        DISCOUNT_BY_GENERAL_AMOUNT,
        IS_SENDING,
        IS_READY_TO_SEND,
        LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
    FROM TABLA_SALES_ORDER_HEADER ssoh
    WHERE CONVERT(date, ssoh.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)

    INSERT INTO TABLA_SALES_ORDER_DETAIL
    (
        SALES_ORDER_ID,----> ESTE CAMPO LO PONE AUTOINCREMENTAL EN EL PRIMER INSERT
        SKU,
        LINE_SEQ,
        QTY,
        PRICE,
        DISCOUNT,
        TOTAL_LINE,
        POSTED_DATETIME,
        SERIE,
        SERIE_2,
        REQUERIES_SERIE,
        COMBO_REFERENCE,
        PARENT_SEQ,
        IS_ACTIVE_ROUTE,
        CODE_PACK_UNIT,
        IS_BONUS,
        LONG,
        ERP_REFERENCE,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_POSTED_ERP,
        ATTEMPTED_WITH_ERROR,
        INTERFACE_OWNER,
        DISCOUNT_TYPE
    )
    SELECT 
    SALES_ORDER_ID,
        SKU,
        LINE_SEQ,
        QTY,
        PRICE,
        DISCOUNT,
        TOTAL_LINE,
        POSTED_DATETIME,
        SERIE,
        SERIE_2,
        REQUERIES_SERIE,
        COMBO_REFERENCE,
        PARENT_SEQ,
        IS_ACTIVE_ROUTE,
        CODE_PACK_UNIT,
        IS_BONUS,
        LONG,
        ERP_REFERENCE,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_POSTED_ERP,
        ATTEMPTED_WITH_ERROR,
        INTERFACE_OWNER,
        DISCOUNT_TYPE
    FROM TABLA_SALES_ORDER_DETAIL ssod
    WHERE CONVERT(date, ssod.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)

    Y ES EN ESTE INSERT EN DONDE ME DEVUELVE EL ERROR QUE NO PUEDE INSERTAR UN DUPLICADO, PARA TODO ESTO CUANDO HE INTENTADO TENGO DETENIDO EL SERVICIO QUE HACE LA MIGRACION DE MI APLICACION HACIA LA BASE DE DATOS, PERO NO SE QUE HACER.


    Luis Paredes

    jueves, 11 de enero de 2018 22:33
  • Fíjate en los dos comentarios que te hice. y el cambio.

    INSERT INTO TABLA_SALES_ORDER_DETAIL
    (
        SALES_ORDER_ID, 
        SKU,
        LINE_SEQ,
        QTY,
        PRICE,
        DISCOUNT,
        TOTAL_LINE,
        POSTED_DATETIME,
        SERIE,
        SERIE_2,
        REQUERIES_SERIE,
        COMBO_REFERENCE,
        PARENT_SEQ,
        IS_ACTIVE_ROUTE,
        CODE_PACK_UNIT,
        IS_BONUS,
        LONG,
        ERP_REFERENCE,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_POSTED_ERP,
        ATTEMPTED_WITH_ERROR,
        INTERFACE_OWNER,
        DISCOUNT_TYPE
    )
    SELECT SCOPE_IDENTITY(), -------------------------->>> Esto debes cambiar
           SKU,
           LINE_SEQ,
           QTY,
           PRICE,
           DISCOUNT,
           TOTAL_LINE,
           POSTED_DATETIME,
           SERIE,
           SERIE_2,
           REQUERIES_SERIE,
           COMBO_REFERENCE,
           PARENT_SEQ,
           IS_ACTIVE_ROUTE,
           CODE_PACK_UNIT,
           IS_BONUS,
           LONG,
           ERP_REFERENCE,
           POSTED_ERP,
           POSTED_RESPONSE,
           IS_POSTED_ERP,
           ATTEMPTED_WITH_ERROR,
           INTERFACE_OWNER,
           DISCOUNT_TYPE
    FROM TABLA_SALES_ORDER_DETAIL ssod
    -- Esta condicion es muy fea y nunca va a usar un idice si lo hubiera
    WHERE CONVERT(date, ssod.POSTED_DATETIME, 103) = CONVERT(date, GETDATE(), 103)

    Saludos


    Ing. Jose Mariano Alvarez - http://blog.josemarianoalvarez.com

    jueves, 11 de enero de 2018 23:49

Todas las respuestas

  • Hola, puedes recuperarlo haciendo un

    SELECT SCOPE_IDENTITY()

    luego de la inserción y asi lo puedes almacenar en una variable y lo insertas en la otra tabla , te recomendaría utilices transacciones 

    SCOPE_IDENTITY (Transact-SQL)


    Votar es agradecer.
    Saludos.
    Lima-Perú


    jueves, 11 de enero de 2018 22:16
  • Hola esto es lo que estoy tratando de hacer:
    INSERT INTO TABLA_SALES_ORDER_HEADER
    (
        TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
        GPS_URL,
        TOTAL_AMOUNT,
        STATUS,
        POSTED_BY,
        IMAGE_1,
        IMAGE_2,
        IMAGE_3,
        DEVICE_BATTERY_FACTOR,
        VOID_DATETIME,
        VOID_REASON,
        VOID_NOTES,
        VOIDED,
        CLOSED_ROUTE_DATETIME,
        IS_ACTIVE_ROUTE,
        GPS_EXPECTED,
        DELIVERY_DATE,
        SALES_ORDER_ID_HH,
        ATTEMPTED_WITH_ERROR,
        IS_POSTED_ERP,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_PARENT,
        REFERENCE_ID,
        WAREHOUSE,
        TIMES_PRINTED,
        DOC_SERIE,
        DOC_NUM,
        IS_VOID,
        DISCOUNT,
        SALES_ORDER_TYPE,
        IS_DRAFT,
        ASSIGNED_BY,
        TASK_ID,
        COMMENT,
        ERP_REFERENCE,
        POSTED_DB,
        PAYMENT_TIMES_PRINTED,
        PAID_TO_DATE,
        TO_BILL,
        HAVE_PICKING,
        AUTHORIZED,
        AUTHORIZED_BY,
        AUTHORIZED_DATE,
        DISCOUNT_BY_GENERAL_AMOUNT,
        IS_SENDING,
        IS_READY_TO_SEND,
        LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
    )
    SELECT
    TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
        GPS_URL,
        TOTAL_AMOUNT,
        STATUS,
        POSTED_BY,
        IMAGE_1,
        IMAGE_2,
        IMAGE_3,
        DEVICE_BATTERY_FACTOR,
        VOID_DATETIME,
        VOID_REASON,
        VOID_NOTES,
        VOIDED,
        CLOSED_ROUTE_DATETIME,
        IS_ACTIVE_ROUTE,
        GPS_EXPECTED,
        DELIVERY_DATE,
        SALES_ORDER_ID_HH,
        ATTEMPTED_WITH_ERROR,
        IS_POSTED_ERP,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_PARENT,
        REFERENCE_ID,
        WAREHOUSE,
        TIMES_PRINTED,
        DOC_SERIE,
        DOC_NUM,
        IS_VOID,
        DISCOUNT,
        SALES_ORDER_TYPE,
        IS_DRAFT,
        ASSIGNED_BY,
        TASK_ID,
        COMMENT,
        ERP_REFERENCE,
        POSTED_DB,
        PAYMENT_TIMES_PRINTED,
        PAID_TO_DATE,
        TO_BILL,
        HAVE_PICKING,
        AUTHORIZED,
        AUTHORIZED_BY,
        AUTHORIZED_DATE,
        DISCOUNT_BY_GENERAL_AMOUNT,
        IS_SENDING,
        IS_READY_TO_SEND,
        LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
    FROM TABLA_SALES_ORDER_HEADER ssoh
    WHERE CONVERT(date, ssoh.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)

    INSERT INTO TABLA_SALES_ORDER_DETAIL
    (
        SALES_ORDER_ID,----> ESTE CAMPO LO PONE AUTOINCREMENTAL EN EL PRIMER INSERT
        SKU,
        LINE_SEQ,
        QTY,
        PRICE,
        DISCOUNT,
        TOTAL_LINE,
        POSTED_DATETIME,
        SERIE,
        SERIE_2,
        REQUERIES_SERIE,
        COMBO_REFERENCE,
        PARENT_SEQ,
        IS_ACTIVE_ROUTE,
        CODE_PACK_UNIT,
        IS_BONUS,
        LONG,
        ERP_REFERENCE,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_POSTED_ERP,
        ATTEMPTED_WITH_ERROR,
        INTERFACE_OWNER,
        DISCOUNT_TYPE
    )
    SELECT 
    SALES_ORDER_ID,
        SKU,
        LINE_SEQ,
        QTY,
        PRICE,
        DISCOUNT,
        TOTAL_LINE,
        POSTED_DATETIME,
        SERIE,
        SERIE_2,
        REQUERIES_SERIE,
        COMBO_REFERENCE,
        PARENT_SEQ,
        IS_ACTIVE_ROUTE,
        CODE_PACK_UNIT,
        IS_BONUS,
        LONG,
        ERP_REFERENCE,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_POSTED_ERP,
        ATTEMPTED_WITH_ERROR,
        INTERFACE_OWNER,
        DISCOUNT_TYPE
    FROM TABLA_SALES_ORDER_DETAIL ssod
    WHERE CONVERT(date, ssod.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)

    Y ES EN ESTE INSERT EN DONDE ME DEVUELVE EL ERROR QUE NO PUEDE INSERTAR UN DUPLICADO, PARA TODO ESTO CUANDO HE INTENTADO TENGO DETENIDO EL SERVICIO QUE HACE LA MIGRACION DE MI APLICACION HACIA LA BASE DE DATOS, PERO NO SE QUE HACER.


    Luis Paredes

    jueves, 11 de enero de 2018 22:33
  • Fíjate en los dos comentarios que te hice. y el cambio.

    INSERT INTO TABLA_SALES_ORDER_DETAIL
    (
        SALES_ORDER_ID, 
        SKU,
        LINE_SEQ,
        QTY,
        PRICE,
        DISCOUNT,
        TOTAL_LINE,
        POSTED_DATETIME,
        SERIE,
        SERIE_2,
        REQUERIES_SERIE,
        COMBO_REFERENCE,
        PARENT_SEQ,
        IS_ACTIVE_ROUTE,
        CODE_PACK_UNIT,
        IS_BONUS,
        LONG,
        ERP_REFERENCE,
        POSTED_ERP,
        POSTED_RESPONSE,
        IS_POSTED_ERP,
        ATTEMPTED_WITH_ERROR,
        INTERFACE_OWNER,
        DISCOUNT_TYPE
    )
    SELECT SCOPE_IDENTITY(), -------------------------->>> Esto debes cambiar
           SKU,
           LINE_SEQ,
           QTY,
           PRICE,
           DISCOUNT,
           TOTAL_LINE,
           POSTED_DATETIME,
           SERIE,
           SERIE_2,
           REQUERIES_SERIE,
           COMBO_REFERENCE,
           PARENT_SEQ,
           IS_ACTIVE_ROUTE,
           CODE_PACK_UNIT,
           IS_BONUS,
           LONG,
           ERP_REFERENCE,
           POSTED_ERP,
           POSTED_RESPONSE,
           IS_POSTED_ERP,
           ATTEMPTED_WITH_ERROR,
           INTERFACE_OWNER,
           DISCOUNT_TYPE
    FROM TABLA_SALES_ORDER_DETAIL ssod
    -- Esta condicion es muy fea y nunca va a usar un idice si lo hubiera
    WHERE CONVERT(date, ssod.POSTED_DATETIME, 103) = CONVERT(date, GETDATE(), 103)

    Saludos


    Ing. Jose Mariano Alvarez - http://blog.josemarianoalvarez.com

    jueves, 11 de enero de 2018 23:49
  • hola, podrias intentar

    Declare @varidentity as int
    
    INSERT INTO TABLA_SALES_ORDER_HEADER
    (
        TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
    	...........
        LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
    )
    SELECT
        TERMS,
        POSTED_DATETIME,
        CLIENT_ID,
        POS_TERMINAL,
    	...........
    	LAST_UPDATE_IS_SENDING,
        SERVER_POSTED_DATETIME,
        DEVICE_NETWORK_TYPE,
        IS_POSTED_OFFLINE
       FROM TABLA_SALES_ORDER_HEADER ssoh
       WHERE CONVERT(date, ssoh.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)
       
       Set @varidentity=(Select scope_identity())
       
       INSERT INTO TABLA_SALES_ORDER_DETAIL
        (
        SALES_ORDER_ID,
        .......
    	)
    	SELECT 
        @varidentity,
    	.......
    	DISCOUNT_TYPE
        FROM TABLA_SALES_ORDER_DETAIL ssod
        WHERE CONVERT(date, ssod.POSTED_DATETIME,103) = CONVERT(date, GETDATE(),103)


    Votar es agradecer.
    Saludos.
    Lima-Perú



    jueves, 11 de enero de 2018 23:50
  • Muchas gracias por tu respuesta haré la prueba como tú me indicas.

    Luis Paredes

    viernes, 12 de enero de 2018 0:13
  • Muchas gracias por la ayuda y por tomarte el tiempo de responder, voy a probar.


    Luis Paredes

    viernes, 12 de enero de 2018 0:14
  • probaste con select @@Identity o select Ident_current(nombretabla) seria la mejor opcion de extraer el valor identity de la tabla en la que acabaas de insertar.
    martes, 16 de enero de 2018 13:02
  • EmmanuelMadrigal

    Existe una gran diferencia entre utilizar @@Identity o Ident_current(table)


    https://docs.microsoft.com/es-es/sql/t-sql/functions/identity-transact-sql
    martes, 16 de enero de 2018 16:27