none
Store Procedure: Ciclo de tiempo trimestral RRS feed

  • Pregunta

  • Hola¡

    Tengo un SP que hace la función de copiar información de tablas y las pasa a esa mismas tablas pero guardándolas como una versión Congelada (Así le llamo yo, al ser una imagen de datos que se queda guardada y no se toca mas para consultar datos de tiempo hacia atrás). El ese se ejecuta de la siguiente manera:

    SPCopiaBorraVersiones 1,401201906,201501,201906,'C','USUARIO' 

    VerOrigen : Donde 1 Es la versión actual o de trabajo. (versión fija)

    VerDestino : 401+el periodo hace referencia a la versión congelada o copiada

    FechaIni : 201501 Fecha que se tomara siempre como inicial

    FechaFin : 201906 Trimestre hasta donde se quiere copiar información

    Acción : C es la acción que hara C =Copiar

    User : Y por ultimo el usuario.

    ALTER PROC [dbo].[SPCopiaVersiones] (@VerOrigen int,@VerDestino int,@FechaIni int,@FechaFin int,@Accion nvarchar(1),@User nvarchar(100)) AS
    BEGIN

    DELETE [RR7].[dbo].[FACT_AUXILIAR]
    WHERE [VERSION_ID] = @VerDestino
      AND [MONTHID] BETWEEN @FechaIni AND @FechaFin

    if @Accion = 'C'
    BEGIN
      INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
      SELECT [ANIO_PARTICION]
         ,@VerDestino AS [VERSION_ID]
         ,[ID_COMPA]
         ,[MONTHID]
         ,[ID_NIVEL]
         ,[MONEDA]
         ,[IMPORTE]
         ,[ETAPA]
         ,[CALCULO]
         ,[PONDERADO]
         ,[ID_OPERACION]
         ,[MA_ID]
         ,[FECHA_CARGA]
        FROM [RR7].[dbo].[FACT_AUXILIAR]
        WHERE [VERSION_ID] = @VerOrigen
        AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
      END

      IF @Accion = 'C'
      BEGIN
        INSERT INTO [dbo].[LOG_ADMIN_VERSION]
        VALUES(@VerOrigen,@VerDestino,@FechaIni,@FechaFin,'Copiado',@User,GETDATE())
      END
      ELSE
      BEGIN
        INSERT INTO [dbo].[LOG_ADMIN_VERSION]
        VALUES(@VerOrigen,@VerDestino,@FechaIni,@FechaFin,'Borrado',@User,GETDATE())
      END

      END

    Ahora busco hacer un Ciclo sin poner tantas variables y solo con una variable: @Variable_unica INT '201906' de acuerdo al trimestre que se quiere congelar la información logre hacer lo siguiente:

    • Marzo (201903): desde: enero 15           hasta: marzo 19
    • Junio (201906): enero 15                       hasta: junio 19
    • Septiembre (201909) : enero 15           hasta: septiembre 19
    • Diciembre (201912): enero 15                hasta: diciembre 19

    Es posible esto? Lo veo muy elaborado pero si alguien tiene una idea de como lograr esto seria GENIAL¡


    Mgm




    • Editado Slafco lunes, 17 de junio de 2019 23:01
    lunes, 17 de junio de 2019 16:04

Respuestas

  • Hola Sfalco:

    No te hacen falta tampoco los ifs de @accion, ya que puede ser una parte del where de las insert.

    Obviando los parámetros @verOrigen y @verDestino, que ya sabes como ponerlos por defecto, puede ser algo parecido a esto.

    BEGIN
        DECLARE @VerOrigen INT;
        DECLARE @VerDestino INT;
        DECLARE @FechaIni INT;
        DECLARE @FechaFin INT= 201912;
        DECLARE @Accion NVARCHAR(1);
        SET @VerOrigen = 1;
        SET @VerDestino = 2;
        DECLARE @ACCIONVARCHAR VARCHAR(10);
        IF(@Accion = 'C')
            SET @ACCIONVARCHAR = 'Copiado';
            ELSE
            SET @ACCIONVARCHAR = 'Borrado';
        DECLARE @FECHAHASTA DATE= (CAST(CONCAT(CAST(@FECHAfIn AS VARCHAR(6)), '01') AS DATE));
    
        DECLARE @FECHADESDE DATE= DATEADD(YEAR, -4, (CAST(CONCAT(YEAR(@FECHAHASTA), '0101') AS VARCHAR(8))));
        SET @fechaini = (CAST(CONCAT((CAST((YEAR(@FECHADESDE) * 10) AS VARCHAR(6))), (CAST(MONTH(@FECHADESDE) AS VARCHAR(2)))) AS INT));
        SELECT @FECHADESDE, 
               @FECHAHASTA;
        SET @Accion = 'C';
        DELETE [RR7].[dbo].[FACT_AUXILIAR]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
               SELECT [ANIO_PARTICION], 
                      @VerDestino AS [VERSION_ID], 
                      [ID_COMPA], 
                      [MONTHID], 
                      [ID_NIVEL], 
                      [MONEDA], 
                      [IMPORTE], 
                      [ETAPA], 
                      [CALCULO], 
                      [PONDERADO], 
                      [ID_OPERACION], 
                      [MA_ID], 
                      [FECHA_CARGA]
               FROM [RR7].[dbo].[FACT_AUXILIAR]
               WHERE [VERSION_ID] = @VerOrigen
                     AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @ACCION = 'C';
        DELETE [RR7].[dbo].[FACT_CNSF]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[FACT_CNSF]
               SELECT [ANIO_PARTICION], 
                      @VerDestino AS [VERSION_ID], 
                      [ID_COMPA], 
                      [MONTHID], 
                      [ID_NIVEL], 
                      [MONEDA], 
                      [IMPORTE], 
                      [ETAPA], 
                      [CALCULO], 
                      [PONDERADO], 
                      [ID_OPERACION], 
                      [MA_ID], 
                      [FECHA_CARGA]
               FROM [RR7].[dbo].[FACT_CNSF]
               WHERE [VERSION_ID] = @VerOrigen
                     AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @Accion = 'C';
        DELETE [RR7].[dbo].[FACT_MACRO]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[FACT_MACRO]
               SELECT @VerDestino AS [VERSION_ID], 
                      [MONTHID], 
                      [ID_NIVEL], 
                      [MA_ID], 
                      [IMPORTE]
               FROM [RR7].[dbo].[FACT_MACRO]
               WHERE [VERSION_ID] = @VerOrigen
                     AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @Accion = 'C';
    
        /*BORRADO E INSERTADO DEL INFORME GLOBAL*/
    
        --COMENTARIOS
        DELETE FROM [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
               SELECT [NIVEL_4], 
                      [MONTHID], 
                      [ID_COMPA], 
                      [FECHA_ULTIMA], 
                      [USER], 
                      [TIPO_COMENTARIO], 
                      [COMENTARIO], 
                      [ETAPA], 
                      [RESPONSABLE], 
                      @VerDestino AS [VERSION_ID]
               FROM [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
               WHERE [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @ACCION = 'C';
        DELETE FROM [RR7].[dbo].[T_COMENTARIOS_MULTIPLES_INDICADORES]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[T_COMENTARIOS_MULTIPLES_INDICADORES]
               SELECT [NIVEL_4], 
                      [MONTHID], 
                      [ID_COMPA], 
                      [FECHA_ULTIMA], 
                      [USER], 
                      [TIPO_COMENTARIO], 
                      [COMENTARIO], 
                      [ETAPA], 
                      [RESPONSABLE], 
                      @VerDestino AS [VERSION_ID]
               FROM [RR7].[dbo].[T_COMENTARIOS_MULTIPLES_INDICADORES]
               WHERE [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @ACCION = 'C';
        INSERT INTO [dbo].[LOG_ADMIN_VERSION]
        VALUES
        (@VerOrigen, 
         @VerDestino, 
         @FechaIni, 
         @FechaFin, 
         @ACCIONVARCHAR, 
         @User, 
         GETDATE()
        );
    END;

    • Marcado como respuesta Slafco lunes, 1 de julio de 2019 22:54
    martes, 18 de junio de 2019 3:37

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/while-transact-sql?view=sql-server-2017

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/if-else-transact-sql?view=sql-server-2017

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/else-if-else-transact-sql?view=sql-server-2017

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/end-begin-end-transact-sql?view=sql-server-2017

    https://social.msdn.microsoft.com/Forums/es-ES/a62d645a-3312-4208-8f15-78f2e8ef513c/como-crear-ciclos-en-sql-forwhile

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    lunes, 17 de junio de 2019 18:59
  • Hola Sfalco:

    No te hacen falta tampoco los ifs de @accion, ya que puede ser una parte del where de las insert.

    Obviando los parámetros @verOrigen y @verDestino, que ya sabes como ponerlos por defecto, puede ser algo parecido a esto.

    BEGIN
        DECLARE @VerOrigen INT;
        DECLARE @VerDestino INT;
        DECLARE @FechaIni INT;
        DECLARE @FechaFin INT= 201912;
        DECLARE @Accion NVARCHAR(1);
        SET @VerOrigen = 1;
        SET @VerDestino = 2;
        DECLARE @ACCIONVARCHAR VARCHAR(10);
        IF(@Accion = 'C')
            SET @ACCIONVARCHAR = 'Copiado';
            ELSE
            SET @ACCIONVARCHAR = 'Borrado';
        DECLARE @FECHAHASTA DATE= (CAST(CONCAT(CAST(@FECHAfIn AS VARCHAR(6)), '01') AS DATE));
    
        DECLARE @FECHADESDE DATE= DATEADD(YEAR, -4, (CAST(CONCAT(YEAR(@FECHAHASTA), '0101') AS VARCHAR(8))));
        SET @fechaini = (CAST(CONCAT((CAST((YEAR(@FECHADESDE) * 10) AS VARCHAR(6))), (CAST(MONTH(@FECHADESDE) AS VARCHAR(2)))) AS INT));
        SELECT @FECHADESDE, 
               @FECHAHASTA;
        SET @Accion = 'C';
        DELETE [RR7].[dbo].[FACT_AUXILIAR]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
               SELECT [ANIO_PARTICION], 
                      @VerDestino AS [VERSION_ID], 
                      [ID_COMPA], 
                      [MONTHID], 
                      [ID_NIVEL], 
                      [MONEDA], 
                      [IMPORTE], 
                      [ETAPA], 
                      [CALCULO], 
                      [PONDERADO], 
                      [ID_OPERACION], 
                      [MA_ID], 
                      [FECHA_CARGA]
               FROM [RR7].[dbo].[FACT_AUXILIAR]
               WHERE [VERSION_ID] = @VerOrigen
                     AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @ACCION = 'C';
        DELETE [RR7].[dbo].[FACT_CNSF]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[FACT_CNSF]
               SELECT [ANIO_PARTICION], 
                      @VerDestino AS [VERSION_ID], 
                      [ID_COMPA], 
                      [MONTHID], 
                      [ID_NIVEL], 
                      [MONEDA], 
                      [IMPORTE], 
                      [ETAPA], 
                      [CALCULO], 
                      [PONDERADO], 
                      [ID_OPERACION], 
                      [MA_ID], 
                      [FECHA_CARGA]
               FROM [RR7].[dbo].[FACT_CNSF]
               WHERE [VERSION_ID] = @VerOrigen
                     AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @Accion = 'C';
        DELETE [RR7].[dbo].[FACT_MACRO]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[FACT_MACRO]
               SELECT @VerDestino AS [VERSION_ID], 
                      [MONTHID], 
                      [ID_NIVEL], 
                      [MA_ID], 
                      [IMPORTE]
               FROM [RR7].[dbo].[FACT_MACRO]
               WHERE [VERSION_ID] = @VerOrigen
                     AND [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @Accion = 'C';
    
        /*BORRADO E INSERTADO DEL INFORME GLOBAL*/
    
        --COMENTARIOS
        DELETE FROM [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
               SELECT [NIVEL_4], 
                      [MONTHID], 
                      [ID_COMPA], 
                      [FECHA_ULTIMA], 
                      [USER], 
                      [TIPO_COMENTARIO], 
                      [COMENTARIO], 
                      [ETAPA], 
                      [RESPONSABLE], 
                      @VerDestino AS [VERSION_ID]
               FROM [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
               WHERE [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @ACCION = 'C';
        DELETE FROM [RR7].[dbo].[T_COMENTARIOS_MULTIPLES_INDICADORES]
        WHERE [VERSION_ID] = @VerDestino
              AND [MONTHID] BETWEEN @FechaIni AND @FechaFin;
        INSERT INTO [RR7].[dbo].[T_COMENTARIOS_MULTIPLES_INDICADORES]
               SELECT [NIVEL_4], 
                      [MONTHID], 
                      [ID_COMPA], 
                      [FECHA_ULTIMA], 
                      [USER], 
                      [TIPO_COMENTARIO], 
                      [COMENTARIO], 
                      [ETAPA], 
                      [RESPONSABLE], 
                      @VerDestino AS [VERSION_ID]
               FROM [RR7].[dbo].[T_COMENTARIOS_MULTIPLES_INDICADORES]
               WHERE [MONTHID] BETWEEN @FechaIni AND @FechaFin
                     AND @ACCION = 'C';
        INSERT INTO [dbo].[LOG_ADMIN_VERSION]
        VALUES
        (@VerOrigen, 
         @VerDestino, 
         @FechaIni, 
         @FechaFin, 
         @ACCIONVARCHAR, 
         @User, 
         GETDATE()
        );
    END;

    • Marcado como respuesta Slafco lunes, 1 de julio de 2019 22:54
    martes, 18 de junio de 2019 3:37
  • Hola de nuevo Javier¡

    Primero agradezco la enorme pista que me das para poder encontrar la solución a lo que quiero hacer.

    Regresando rápido al tema lo que yo hice es generara ya una fecha de inicio fija:

    SET @FechaIni = SUBSTRING(CONVERT(VARCHAR,DATEADD(MONTH,1,'20141231'),112) ,1,6)

    SET @VerOrigen = 1

    Como bien dices  fecha inicial y versión origen estarán por defecto, pero la versión destino no y esto por que de acuerdo a mi variable única inicial del SP será:@FechaFin INT = '201906' por citar el trimestre actual, cuando se genere la acción de copia, esto que llamaste versión 2 debe ser mas bien una nomenclatura (nose si se diga asi) tipo 401+201906. Y lograr ese resultado no estoy encontrando el como deba ser.

    Saludos¡¡¡


    Mgm

    martes, 18 de junio de 2019 15:08