none
Crear una condicional mi Stored Procedure de insertar RRS feed

  • Pregunta

  • Hola comunidad

    Tengo mi Query de insertar de un stored Procedure sin embargo deseo ponerle una condicional en donde me permita que si ya existe lo actulice.

    Dejo mi codigo aqui abajo favor su apoyo.

    ALTER PROCEDURE [dbo].[XSF_SP_REEMBOLSOVARIOS_INSERTAR] (@scia char(2) ,@ssede char(2) ,@sid_motivo char(2) ,@iid_transaccion int ,@iitem int ,@sid_motivo_det char(2) ,@sreferencia varchar(20) ,@dfecha datetime ,@sid_tipo_analitica char(2) ,@sid_analitica varchar(20) ,@sid_moneda varchar(2) ,@fmonto float ,@sflag_facturable char(2) ,@sid_centro_costo varchar(20) ,@sid_actividad varchar(20) ,@sglosa varchar(100) ,@scx_salesland_tipo_gasto varchar(20) ,@sid_estado char(2) ,@sflag_envio char(2) ,@suc varchar(10)) AS BEGIN IF EXISTS() BEGIN

    ----- aqui va la logica del codigo actualizar

    END ELSE BEGIN INSERT INTO reembolso_varios (cia, sede, id_motivo, id_transaccion, item, id_motivo_det, referencia, fecha, id_tipo_analitica, id_analitica,id_moneda, monto, flag_facturable --, id_cuenta , id_centro_costo, id_actividad, glosa, cx_salesland_tipo_gasto,id_estado, flag_envio, se, fc, uc) VALUES(@scia, @ssede,@sid_motivo, @iid_transaccion, @iitem, @sid_motivo_det, @sreferencia,@dfecha , @sid_tipo_analitica,@sid_analitica , @sid_moneda,@fmonto, @sflag_facturable --, @sid_cuenta ,@sid_centro_costo, @sid_actividad, @sglosa, @scx_salesland_tipo_gasto, '01', '1',@ssede, getdate(), @suc) END END GO



    Boris travi Ing.Software


    • Editado Boris Travi jueves, 5 de septiembre de 2019 18:00
    jueves, 5 de septiembre de 2019 17:59

Respuestas

  • Veamos, ¿no lo unico que debes colocar es el UPDATE como tal?

    IIslas Master Consultant SQL Server

    jueves, 5 de septiembre de 2019 19:02
  • Deleted
    jueves, 5 de septiembre de 2019 20:59
  • Hola Boris Travi:

    Una posible opción es utilizar la sentencia Merge, que se utiliza para esto precisamente. Algo que se conoce como UPSERT

    Merge

    https://docs.microsoft.com/es-es/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

    Como de lo que has expuesto, has omitido un par de detalles importantes, yo he realizado mi escenario, que será casi igual, pero hay un par de ajustes que tienes que tener en cuenta.

    CREATE TABLE reembolso_Varios
    (cia                     CHAR(2), 
     sede                    CHAR(2), 
     id_motivo               CHAR(2), 
     id_transaccion          INT, 
     item                    INT, 
     id_motivo_det           CHAR(2), 
     referencia              VARCHAR(20), 
     fecha                   DATETIME, 
     id_tipo_analitica       CHAR(2), 
     id_analitica            VARCHAR(20), 
     id_moneda               VARCHAR(2), 
     monto                   FLOAT, 
     flag_facturable         CHAR(2), 
     id_centro_costo         VARCHAR(20), 
     id_actividad            VARCHAR(20), 
     glosa                   VARCHAR(100), 
     cx_salesland_tipo_gasto VARCHAR(20), 
     id_estado               CHAR(2), 
     flag_envio              CHAR(2), 
     se                      CHAR(2), 
     fc                      DATETIME, 
     uc                      VARCHAR(10)
    );
    GO
    
      
    Tu ya tienes la tabla. Yo he supuesto que la tabla son solo estas columnas, y que la clave principal, que más tarde necesito es la combinación de cia y sede. Es un detalle muy importante.

    CREATE PROCEDURE  [dbo].[XSF_SP_REEMBOLSOVARIOS_INSERTAR]  
    (
    @scia CHAR(2), @ssede CHAR(2), @sid_motivo CHAR(2), @iid_transaccion INT, @iitem INT, @sid_motivo_det CHAR(2), @sreferencia VARCHAR(20), @dfecha DATETIME, @sid_tipo_analitica CHAR(2), @sid_analitica VARCHAR(20), @sid_moneda VARCHAR(2), @fmonto FLOAT, @sflag_facturable CHAR(2), @sid_centro_costo VARCHAR(20), @sid_actividad VARCHAR(20), @sglosa VARCHAR(100), @scx_salesland_tipo_gasto VARCHAR(20), @sid_estado CHAR(2), @sflag_envio CHAR(2), @suc VARCHAR(10)
    )
    AS
    BEGIN
    /* merge sobre tabla reembolso_varios. a partir de aquí Target */
    MERGE REEMBOLSO_VARIOS AS TARGET
    USING
    (
        SELECT @scia, 
               @ssede, 
               @sid_motivo, 
               @iid_transaccion, 
               @iitem, 
               @sid_motivo_det, 
               @sreferencia, 
               @dfecha, 
               @sid_tipo_analitica, 
               @sid_analitica, 
               @sid_moneda, 
               @fmonto, 
               @sflag_facturable, 
               @sid_centro_costo, 
               @sid_actividad, 
               @sglosa, 
               @scx_salesland_tipo_gasto, 
               '01', 
               '1', 
               @ssede, 
               GETDATE(), 
               @suc
    ) 
    /* los parámetros del procedure como SOURCE, pero los identifico, como si fueran alias de columna. por tanto GETDATE() es =  fc */
    AS SOURCE(cia, sede, id_motivo, id_transaccion, item, id_motivo_det, referencia, 
        fecha, id_tipo_analitica, id_analitica, id_moneda, monto, flag_facturable, 
        id_centro_costo, id_actividad, glosa, cx_salesland_tipo_gasto, id_estado, 
        flag_envio, se, fc, uc)
    /* Aquí he supuesto que cia y sede son la clave primaria, porque merge va a comprobar la clave primaria, para saber si un registro existe. Esta parte tienes que retocarla */
    ON TARGET.CIA = SOURCE.CIA
       AND TARGET.SEDE = SOURCE.SEDE
        WHEN MATCHED
        THEN
    /* Si el registro existe porque su clave primaria, existe, entonces updatea el resto de columnas que no son clave primaria, y pones en ella, lo que lleva como parámetros */
     UPDATE SET 
                        ID_MOTIVO = SOURCE.ID_MOTIVO, 
                        ID_TRANSACCION = SOURCE.ID_TRANSACCION, 
                        item = SOURCE.item, 
                        id_motivo_det = SOURCE.id_motivo_det, 
                        referencia = SOURCE.referencia, 
                        fecha = SOURCE.fecha, 
                        id_tipo_analitica = SOURCE.id_tipo_analitica, 
                        id_analitica = SOURCE.id_analitica, 
                        id_moneda = SOURCE.id_moneda, 
                        monto = SOURCE.monto, 
                        flag_facturable = SOURCE.flag_facturable, 
                        id_centro_costo = SOURCE.id_centro_costo, 
                        id_actividad = SOURCE.id_actividad, 
                        glosa = SOURCE.glosa, 
                        cx_salesland_tipo_gasto = SOURCE.cx_salesland_tipo_gasto, 
                        id_estado = SOURCE.id_estado, 
                        flag_envio = SOURCE.flag_envio, 
                        se = SOURCE.se, 
                        fc = SOURCE.fc, 
                        uc = SOURCE.uc
        WHEN NOT MATCHED
        THEN
    /* si el registro no existe lo inserta */
          INSERT(cia, 
                 sede, 
                 id_motivo, 
                 id_transaccion, 
                 item, 
                 id_motivo_det, 
                 referencia, 
                 fecha, 
                 id_tipo_analitica, 
                 id_analitica, 
                 id_moneda, 
                 monto, 
                 flag_facturable, 
                 id_centro_costo, 
                 id_actividad, 
                 glosa, 
                 cx_salesland_tipo_gasto, 
                 id_estado, 
                 flag_envio, 
                 se, 
                 fc, 
                 uc)
          VALUES
    (SOURCE.CIA, 
     SOURCE.SEDE, 
     SOURCE.ID_MOTIVO, 
     SOURCE.ID_TRANSACCION, 
     SOURCE.item, 
     SOURCE.id_motivo_det, 
     SOURCE.referencia, 
     SOURCE.fecha, 
     SOURCE.id_tipo_analitica, 
     SOURCE.id_analitica, 
     SOURCE.id_moneda, 
     SOURCE.monto, 
     SOURCE.flag_facturable, 
     SOURCE.id_centro_costo, 
     SOURCE.id_actividad, 
     SOURCE.glosa, 
     SOURCE.cx_salesland_tipo_gasto, 
     SOURCE.id_estado, 
     SOURCE.flag_envio, 
     SOURCE.se, 
     SOURCE.fc, 
     SOURCE.uc
    );
    END
    GO
    Si tienes cualquier duda, puedes preguntar sin problems.


    jueves, 5 de septiembre de 2019 21:06
  • Hola a todos;

    gracias a todos por su apoyo pero acabo de solucionarlo aquí dejo mi query de la siguiente solución:

    ALTER PROCEDURE  [dbo].[XSF_SP_REEMBOLSOVARIOS_INSERTAR]  
    (@scia char(2), @ssede char(2), @sid_motivo char(2), @iid_transaccion int, @iitem int  
    ,@sid_motivo_det char(2)  
    ,@sreferencia varchar(20)  
    ,@dfecha datetime  
    ,@sid_tipo_analitica char(2)  
    ,@sid_analitica varchar(20)  
    ,@sid_moneda varchar(2)  
    ,@fmonto float  
    ,@sflag_facturable char(2) 
    ,@sid_centro_costo varchar(20)  
    ,@sid_actividad varchar(20)  
    ,@sglosa varchar(100)  
    ,@scx_salesland_tipo_gasto varchar(20)  
    ,@sid_estado char(2)  
    ,@sflag_envio char(2)  
    ,@suc varchar(10))
    AS
    BEGIN
    
    --sp_help REEMBOLSO_VARIOS
    
    IF EXISTS
    (select * from REEMBOLSO_VARIOS
     where cia=@scia and sede=@ssede and id_motivo=@sid_motivo and id_transaccion=@iid_transaccion and item=@iitem)
     BEGIN
    UPDATE reembolso_varios  
    SET id_motivo_det=@sid_motivo_det  
     ,referencia = @sreferencia  
     ,fecha=@dfecha  
     ,id_tipo_analitica = @sid_tipo_analitica  
     ,id_analitica=@sid_analitica  
     ,id_moneda =@sid_moneda  
     ,monto = @fmonto  
     ,flag_facturable =@sflag_facturable  
     , id_centro_costo =@sid_centro_costo  
     , id_actividad = @sid_actividad, glosa = @sglosa  
     ,cx_salesland_tipo_gasto = @scx_salesland_tipo_gasto,
     id_estado='01', fm = getdate(), um=@suc   
    Where CIA=@scia and SEDE = @ssede and  ID_MOTIVO = @sid_motivo and  ID_TRANSACCION = @iid_transaccion and ITEM = @iitem  
     END
    ELSE
     BEGIN
    INSERT INTO reembolso_varios  
    (cia, sede, id_motivo, id_transaccion, item, id_motivo_det, referencia, fecha, id_tipo_analitica,  
    id_analitica,id_moneda, monto, flag_facturable
    , id_centro_costo, id_actividad, glosa,  
    cx_salesland_tipo_gasto,
     id_estado, flag_envio, se, fc, uc)  
    VALUES(@scia, @ssede,@sid_motivo, @iid_transaccion, @iitem, @sid_motivo_det, @sreferencia,@dfecha  
    , @sid_tipo_analitica,@sid_analitica , @sid_moneda,@fmonto, @sflag_facturable  
    ,@sid_centro_costo, @sid_actividad, @sglosa, @scx_salesland_tipo_gasto,
     '01', '1',@ssede, getdate(), @suc)
     END
    
    END
    
    GO


    Boris travi Ing.Software

    jueves, 5 de septiembre de 2019 22:22

Todas las respuestas

  • Veamos, ¿no lo unico que debes colocar es el UPDATE como tal?

    IIslas Master Consultant SQL Server

    jueves, 5 de septiembre de 2019 19:02
  • Deleted
    jueves, 5 de septiembre de 2019 20:59
  • Hola Boris Travi:

    Una posible opción es utilizar la sentencia Merge, que se utiliza para esto precisamente. Algo que se conoce como UPSERT

    Merge

    https://docs.microsoft.com/es-es/sql/t-sql/statements/merge-transact-sql?view=sql-server-2017

    Como de lo que has expuesto, has omitido un par de detalles importantes, yo he realizado mi escenario, que será casi igual, pero hay un par de ajustes que tienes que tener en cuenta.

    CREATE TABLE reembolso_Varios
    (cia                     CHAR(2), 
     sede                    CHAR(2), 
     id_motivo               CHAR(2), 
     id_transaccion          INT, 
     item                    INT, 
     id_motivo_det           CHAR(2), 
     referencia              VARCHAR(20), 
     fecha                   DATETIME, 
     id_tipo_analitica       CHAR(2), 
     id_analitica            VARCHAR(20), 
     id_moneda               VARCHAR(2), 
     monto                   FLOAT, 
     flag_facturable         CHAR(2), 
     id_centro_costo         VARCHAR(20), 
     id_actividad            VARCHAR(20), 
     glosa                   VARCHAR(100), 
     cx_salesland_tipo_gasto VARCHAR(20), 
     id_estado               CHAR(2), 
     flag_envio              CHAR(2), 
     se                      CHAR(2), 
     fc                      DATETIME, 
     uc                      VARCHAR(10)
    );
    GO
    
      
    Tu ya tienes la tabla. Yo he supuesto que la tabla son solo estas columnas, y que la clave principal, que más tarde necesito es la combinación de cia y sede. Es un detalle muy importante.

    CREATE PROCEDURE  [dbo].[XSF_SP_REEMBOLSOVARIOS_INSERTAR]  
    (
    @scia CHAR(2), @ssede CHAR(2), @sid_motivo CHAR(2), @iid_transaccion INT, @iitem INT, @sid_motivo_det CHAR(2), @sreferencia VARCHAR(20), @dfecha DATETIME, @sid_tipo_analitica CHAR(2), @sid_analitica VARCHAR(20), @sid_moneda VARCHAR(2), @fmonto FLOAT, @sflag_facturable CHAR(2), @sid_centro_costo VARCHAR(20), @sid_actividad VARCHAR(20), @sglosa VARCHAR(100), @scx_salesland_tipo_gasto VARCHAR(20), @sid_estado CHAR(2), @sflag_envio CHAR(2), @suc VARCHAR(10)
    )
    AS
    BEGIN
    /* merge sobre tabla reembolso_varios. a partir de aquí Target */
    MERGE REEMBOLSO_VARIOS AS TARGET
    USING
    (
        SELECT @scia, 
               @ssede, 
               @sid_motivo, 
               @iid_transaccion, 
               @iitem, 
               @sid_motivo_det, 
               @sreferencia, 
               @dfecha, 
               @sid_tipo_analitica, 
               @sid_analitica, 
               @sid_moneda, 
               @fmonto, 
               @sflag_facturable, 
               @sid_centro_costo, 
               @sid_actividad, 
               @sglosa, 
               @scx_salesland_tipo_gasto, 
               '01', 
               '1', 
               @ssede, 
               GETDATE(), 
               @suc
    ) 
    /* los parámetros del procedure como SOURCE, pero los identifico, como si fueran alias de columna. por tanto GETDATE() es =  fc */
    AS SOURCE(cia, sede, id_motivo, id_transaccion, item, id_motivo_det, referencia, 
        fecha, id_tipo_analitica, id_analitica, id_moneda, monto, flag_facturable, 
        id_centro_costo, id_actividad, glosa, cx_salesland_tipo_gasto, id_estado, 
        flag_envio, se, fc, uc)
    /* Aquí he supuesto que cia y sede son la clave primaria, porque merge va a comprobar la clave primaria, para saber si un registro existe. Esta parte tienes que retocarla */
    ON TARGET.CIA = SOURCE.CIA
       AND TARGET.SEDE = SOURCE.SEDE
        WHEN MATCHED
        THEN
    /* Si el registro existe porque su clave primaria, existe, entonces updatea el resto de columnas que no son clave primaria, y pones en ella, lo que lleva como parámetros */
     UPDATE SET 
                        ID_MOTIVO = SOURCE.ID_MOTIVO, 
                        ID_TRANSACCION = SOURCE.ID_TRANSACCION, 
                        item = SOURCE.item, 
                        id_motivo_det = SOURCE.id_motivo_det, 
                        referencia = SOURCE.referencia, 
                        fecha = SOURCE.fecha, 
                        id_tipo_analitica = SOURCE.id_tipo_analitica, 
                        id_analitica = SOURCE.id_analitica, 
                        id_moneda = SOURCE.id_moneda, 
                        monto = SOURCE.monto, 
                        flag_facturable = SOURCE.flag_facturable, 
                        id_centro_costo = SOURCE.id_centro_costo, 
                        id_actividad = SOURCE.id_actividad, 
                        glosa = SOURCE.glosa, 
                        cx_salesland_tipo_gasto = SOURCE.cx_salesland_tipo_gasto, 
                        id_estado = SOURCE.id_estado, 
                        flag_envio = SOURCE.flag_envio, 
                        se = SOURCE.se, 
                        fc = SOURCE.fc, 
                        uc = SOURCE.uc
        WHEN NOT MATCHED
        THEN
    /* si el registro no existe lo inserta */
          INSERT(cia, 
                 sede, 
                 id_motivo, 
                 id_transaccion, 
                 item, 
                 id_motivo_det, 
                 referencia, 
                 fecha, 
                 id_tipo_analitica, 
                 id_analitica, 
                 id_moneda, 
                 monto, 
                 flag_facturable, 
                 id_centro_costo, 
                 id_actividad, 
                 glosa, 
                 cx_salesland_tipo_gasto, 
                 id_estado, 
                 flag_envio, 
                 se, 
                 fc, 
                 uc)
          VALUES
    (SOURCE.CIA, 
     SOURCE.SEDE, 
     SOURCE.ID_MOTIVO, 
     SOURCE.ID_TRANSACCION, 
     SOURCE.item, 
     SOURCE.id_motivo_det, 
     SOURCE.referencia, 
     SOURCE.fecha, 
     SOURCE.id_tipo_analitica, 
     SOURCE.id_analitica, 
     SOURCE.id_moneda, 
     SOURCE.monto, 
     SOURCE.flag_facturable, 
     SOURCE.id_centro_costo, 
     SOURCE.id_actividad, 
     SOURCE.glosa, 
     SOURCE.cx_salesland_tipo_gasto, 
     SOURCE.id_estado, 
     SOURCE.flag_envio, 
     SOURCE.se, 
     SOURCE.fc, 
     SOURCE.uc
    );
    END
    GO
    Si tienes cualquier duda, puedes preguntar sin problems.


    jueves, 5 de septiembre de 2019 21:06
  • Hola a todos;

    gracias a todos por su apoyo pero acabo de solucionarlo aquí dejo mi query de la siguiente solución:

    ALTER PROCEDURE  [dbo].[XSF_SP_REEMBOLSOVARIOS_INSERTAR]  
    (@scia char(2), @ssede char(2), @sid_motivo char(2), @iid_transaccion int, @iitem int  
    ,@sid_motivo_det char(2)  
    ,@sreferencia varchar(20)  
    ,@dfecha datetime  
    ,@sid_tipo_analitica char(2)  
    ,@sid_analitica varchar(20)  
    ,@sid_moneda varchar(2)  
    ,@fmonto float  
    ,@sflag_facturable char(2) 
    ,@sid_centro_costo varchar(20)  
    ,@sid_actividad varchar(20)  
    ,@sglosa varchar(100)  
    ,@scx_salesland_tipo_gasto varchar(20)  
    ,@sid_estado char(2)  
    ,@sflag_envio char(2)  
    ,@suc varchar(10))
    AS
    BEGIN
    
    --sp_help REEMBOLSO_VARIOS
    
    IF EXISTS
    (select * from REEMBOLSO_VARIOS
     where cia=@scia and sede=@ssede and id_motivo=@sid_motivo and id_transaccion=@iid_transaccion and item=@iitem)
     BEGIN
    UPDATE reembolso_varios  
    SET id_motivo_det=@sid_motivo_det  
     ,referencia = @sreferencia  
     ,fecha=@dfecha  
     ,id_tipo_analitica = @sid_tipo_analitica  
     ,id_analitica=@sid_analitica  
     ,id_moneda =@sid_moneda  
     ,monto = @fmonto  
     ,flag_facturable =@sflag_facturable  
     , id_centro_costo =@sid_centro_costo  
     , id_actividad = @sid_actividad, glosa = @sglosa  
     ,cx_salesland_tipo_gasto = @scx_salesland_tipo_gasto,
     id_estado='01', fm = getdate(), um=@suc   
    Where CIA=@scia and SEDE = @ssede and  ID_MOTIVO = @sid_motivo and  ID_TRANSACCION = @iid_transaccion and ITEM = @iitem  
     END
    ELSE
     BEGIN
    INSERT INTO reembolso_varios  
    (cia, sede, id_motivo, id_transaccion, item, id_motivo_det, referencia, fecha, id_tipo_analitica,  
    id_analitica,id_moneda, monto, flag_facturable
    , id_centro_costo, id_actividad, glosa,  
    cx_salesland_tipo_gasto,
     id_estado, flag_envio, se, fc, uc)  
    VALUES(@scia, @ssede,@sid_motivo, @iid_transaccion, @iitem, @sid_motivo_det, @sreferencia,@dfecha  
    , @sid_tipo_analitica,@sid_analitica , @sid_moneda,@fmonto, @sflag_facturable  
    ,@sid_centro_costo, @sid_actividad, @sglosa, @scx_salesland_tipo_gasto,
     '01', '1',@ssede, getdate(), @suc)
     END
    
    END
    
    GO


    Boris travi Ing.Software

    jueves, 5 de septiembre de 2019 22:22