none
Guardar datos de una tabla a otra tabla usuando cursores en sql server RRS feed

  • Pregunta

  • Hola, tengo un problema tengo 2 tablas (DATA  y Justificar_Incidencias), quisiera saber como guardar (Id_Usuario, Fecha y Hora) de mi tabla DATA a mi tabla Justificar_Incidencias Por medio de un cursor.

    nota: al guardar en la tabla DATA tome esos 3 campos y los guarde en la otra tabla.

    tabla data              

    tabla autorizar incidencias

    viernes, 24 de febrero de 2017 16:39

Respuestas

  • Eduardo_Ramirez,

    Te sugiero -una vez mas- escribir el requerimiento completo desde un inicio para evitar darle tantas vueltas, ¿es posible?

    CREATE PROCEDURE dbo.Grid
        @Condicion numeric(10,0),
        @Id_Data int,
        @Id_Usuario int,
        @Fecha varchar(100),
        @Hora varchar(100)
    AS
    BEGIN
        --Insertar en la tabla [DATA]
        SET @Id_Data = (SELECT MAX(Id_Data) + 1 FROM DATA);
        
        INSERT INTO dbo.DATA
    	   (Id_Data, Id_Usuario, Fecha, Hora)
        SELECT
    	   @Id_Data, @Id_Usuario, @Fecha, @Hora
        WHERE
    	   (@Condicion = 1);
        
        --Insertar en la tabla [Justificar_Incidencias] sólo si hay 4 registros
        WITH RegistroIngresos AS
        (
    	   SELECT
    		  d.Id_Usuario, d.Fecha, d.Hora AS [Hora],
    		  ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha 
    			 ORDER BY CONVERT(time(0), d.Hora)) AS [Fila]
    	   FROM DATA d
    	   WHERE
    		  (Id_Usuario = @Id_Usuario) AND (Fecha = @Fecha)		  
        )
        INSERT INTO Justificar_Incidencias 
    	   (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida)
        SELECT
    	   i.Id_Usuario, i.Fecha, 
    	   MAX(CASE WHEN i.Fila = 1 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 2 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 3 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 4 THEN i.Hora END)
        FROM
    	   RegistroIngresos i
        WHERE
    	   NOT EXISTS (SELECT 1 FROM Justificar_Incidencias 
    					WHERE (i.Id_Usuario = Id_Usuario) AND (i.Fecha = Fecha))
        GROUP BY
    	   i.Id_Usuario, i.Fecha
        HAVING
    	   COUNT(*) = 4;
    END
    



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Eduardo_Ramirez viernes, 24 de febrero de 2017 22:40
    viernes, 24 de febrero de 2017 22:00

Todas las respuestas

  • Eduardo_Ramirez,

    ¿Cursores? No entiendo que aplicación le quieres dar en este caso.

    • ¿Quieres insertar -una o varias filas- en la tabla [Justificar_Incidencias] por cada nueva fila en la tabla [DATA]? ¿Lo que requieres no es un trigger que actúe sobre una operación de INSERT? ¿Y por qué no insertas en ambas tablas desde la aplicación?
    • ¿Quieres copiar los datos de la tabla [DATA] a la tabla [Justificar_Incidencias]? ¿No basta con la instrucción INSERT INTO?

    Te recomiendo des mayores detalles de lo que deseas realizar.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 24 de febrero de 2017 16:56
  • hola

    >>tengo un problema tengo 2 tablas (DATA

    porque el nombre "DATA"  uno menos significativo no tenias

    defiens algo mejor que represente a los datos que persiste alli

    >>de mi tabla DATA a mi tabla Justificar_Incidencias Por medio de un cursor.

    porque no usas un SELECT INTO ?

    podrias volcar los datos sin necesidad de ningun cursor


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 24 de febrero de 2017 17:07
  • Perdón por no explicarme bien.

    1 - quiero insertar en la tabla Autorizar_Incidencias solo 1 vez  (Id_Usuario y Fecha) , que las fechas estén acomodadas (8:00:00 Hora_Entrada, 2:00:00 Hora_SComer, 3:30:00 Hora_EComer y 6:30:00 Hora_Salida) tomando los datos de la tabla DATA , espero darme a entender.

    viernes, 24 de febrero de 2017 17:10
  • Eduardo_Ramirez,

    De acuerdo, la resolución es simple sin embargo te dejo dos consideraciones:

    - ¿La columna [Hora] es de tipo time? En los datos que muestras no especificas AM/PM, también podrías especificar el tiempo basado en un reloj de 24 horas, algo como:

    (17, '2017-02-05', '8:01:21 am'),
    (17, '2017-02-05', '2:00:05 pm'),

    - En el ejemplo adjunto muestras cinco registros por usuario/día, ¿hay marcaciones que se duplican?, debes de resolver ese caso para obtener los resultados esperados.

    Resolviendo los puntos anteriores la consulta para insertar los datos es simple:

    WITH RegistroIngresos AS
    (
        SELECT
    	   d.Id_Usuario, d.Fecha, CONVERT(time(0), d.Hora) AS [Hora],
    	   ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY d.Hora) AS [Fila]
        FROM DATA d    
    )
    INSERT INTO Justificar_Incidencias 
        (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida)
    SELECT
        i.Id_Usuario, i.Fecha, 
        MAX(CASE WHEN i.Fila = 1 THEN i.Hora END),
        MAX(CASE WHEN i.Fila = 2 THEN i.Hora END),
        MAX(CASE WHEN i.Fila = 3 THEN i.Hora END),
        MAX(CASE WHEN i.Fila = 4 THEN i.Hora END)
    FROM
        RegistroIngresos i
    GROUP BY
        i.Id_Usuario, i.Fecha;

    Deberías tener el siguiente resultado:


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 24 de febrero de 2017 17:49
  • El id_Usuario es del tipo entero , todos los demas son de tipo varchar , deben de ser 4 registros  por id_usuario.

    Conforme al codigo podria ponerlo en un SP o en el cursor?

    viernes, 24 de febrero de 2017 18:02
  • Eduardo_Ramirez,

    Indicas que deben ser cuatro registros por id_usuario pero en el ejemplo que adjuntas muestras cinco registros.

    ¿Cómo distingues -por ejemplo- que la hora 2:00 es AM o PM?, se puede hacer algo con los datos que tienes pero desde ya te adelanto que no esperes que los resultados sean predecibles si insistes en no diferenciar la hora (AM/PM).

    --Insertar datos
    WITH RegistroIngresos AS
    (
        SELECT
    	   d.Id_Usuario, d.Fecha, d.Hora AS [Hora],
    	   ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha ORDER BY (SELECT NULL)) AS [Fila]
        FROM DATA d    
    )
    INSERT INTO Justificar_Incidencias 
        (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida)
    SELECT
        i.Id_Usuario, i.Fecha, 
        MAX(CASE WHEN i.Fila = 1 THEN i.Hora END),
        MAX(CASE WHEN i.Fila = 2 THEN i.Hora END),
        MAX(CASE WHEN i.Fila = 3 THEN i.Hora END),
        MAX(CASE WHEN i.Fila = 4 THEN i.Hora END)
    FROM
        RegistroIngresos i
    GROUP BY
        i.Id_Usuario, i.Fecha;
    
    --Revisar datos insertados
    SELECT * FROM Justificar_Incidencias

    {...} Conforme al codigo podria ponerlo en un SP o en el cursor?

    ¿Cursor?. Depura y ejecuta la consulta que te he proporcionado y coméntanos los resultados.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 24 de febrero de 2017 18:44
  • Conforme sobre distinguir el AM o PM, las horas viene en formato 24 hrs. La hora que muestro en las tablas es ejemplo pero en realidad vienen en ese formato.

    este es el resultado de la consulta


    Las hora están desacomodadas
    viernes, 24 de febrero de 2017 18:59
  • Eduardo_Ramirez,

    En un próximo hilo procura colocar los datos de ejemplo lo mas real posible para evitar especulaciones. 

    Define el procedimiento almacenado con los siguientes cambios:

    CREATE PROCEDURE dbo.InsertarRegistroIngresos
    AS
    BEGIN
        --Insertar datos
        WITH RegistroIngresos AS
        (
    	   SELECT
    		  d.Id_Usuario, d.Fecha, d.Hora AS [Hora],
    		  ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha 
    			 ORDER BY CONVERT(time(0), d.Hora)) AS [Fila]
    	   FROM DATA d    
        )
        INSERT INTO Justificar_Incidencias 
    	   (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida)
        SELECT
    	   i.Id_Usuario, i.Fecha, 
    	   MAX(CASE WHEN i.Fila = 1 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 2 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 3 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 4 THEN i.Hora END)
        FROM
    	   RegistroIngresos i
        WHERE
    	   NOT EXISTS (SELECT 1 FROM Justificar_Incidencias 
    					WHERE (i.Id_Usuario = Id_Usuario) AND (i.Fecha = Fecha))
        GROUP BY
    	   i.Id_Usuario, i.Fecha;
    END
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 24 de febrero de 2017 19:53
  • USE [Ejemplo]
    GO

    ALTER PROCEDURE [dbo].[Grid]

    @Condicion numeric(10,0)
    ,@Id_Data int
    ,@Id_Usuario int
    ,@Fecha varchar(100)
    ,@Hora varchar(100)

    AS

    if @Condicion = 1

    BEGIN
    set @Id_Data = (Select Top (1) Id_Data FROM DATA Order BY Id_Data DESC )+1 
    INSERT INTO [dbo].[DATA]

    ([Id_Data]
    ,[Id_Usuario]
    ,[Fecha]
    ,[Hora]

    VALUES
    (@Id_Data,@Id_Usuario,@Fecha,@Hora)

    END

    Este es el SP que uso para guardar los datos en mi tabla DATA.

    Mi duda es si tengo que eliminarlo o incorporar el código del SP que pusiste?

    viernes, 24 de febrero de 2017 21:30
  • Eduardo_Ramirez,

    Te sugiero -una vez mas- escribir el requerimiento completo desde un inicio para evitar darle tantas vueltas, ¿es posible?

    CREATE PROCEDURE dbo.Grid
        @Condicion numeric(10,0),
        @Id_Data int,
        @Id_Usuario int,
        @Fecha varchar(100),
        @Hora varchar(100)
    AS
    BEGIN
        --Insertar en la tabla [DATA]
        SET @Id_Data = (SELECT MAX(Id_Data) + 1 FROM DATA);
        
        INSERT INTO dbo.DATA
    	   (Id_Data, Id_Usuario, Fecha, Hora)
        SELECT
    	   @Id_Data, @Id_Usuario, @Fecha, @Hora
        WHERE
    	   (@Condicion = 1);
        
        --Insertar en la tabla [Justificar_Incidencias] sólo si hay 4 registros
        WITH RegistroIngresos AS
        (
    	   SELECT
    		  d.Id_Usuario, d.Fecha, d.Hora AS [Hora],
    		  ROW_NUMBER() OVER(PARTITION BY d.Id_Usuario, d.Fecha 
    			 ORDER BY CONVERT(time(0), d.Hora)) AS [Fila]
    	   FROM DATA d
    	   WHERE
    		  (Id_Usuario = @Id_Usuario) AND (Fecha = @Fecha)		  
        )
        INSERT INTO Justificar_Incidencias 
    	   (Id_Usuario, Fecha, Hora_Entrada, Hora_SComer, Hora_EComer, Hora_Salida)
        SELECT
    	   i.Id_Usuario, i.Fecha, 
    	   MAX(CASE WHEN i.Fila = 1 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 2 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 3 THEN i.Hora END),
    	   MAX(CASE WHEN i.Fila = 4 THEN i.Hora END)
        FROM
    	   RegistroIngresos i
        WHERE
    	   NOT EXISTS (SELECT 1 FROM Justificar_Incidencias 
    					WHERE (i.Id_Usuario = Id_Usuario) AND (i.Fecha = Fecha))
        GROUP BY
    	   i.Id_Usuario, i.Fecha
        HAVING
    	   COUNT(*) = 4;
    END
    



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Eduardo_Ramirez viernes, 24 de febrero de 2017 22:40
    viernes, 24 de febrero de 2017 22:00
  • Muchas gracias funciono. 


    viernes, 24 de febrero de 2017 22:51