none
Relacion entre tablas con datos similares RRS feed

  • Pregunta

  • Buen dia compañeros tengo 2 tablas ambas tienen casi los mismo datos y estan relacionados con una fk_idprueba, para existir una subprueba, primero debe existir una prueba queria saber si hay forma en que al momento de que se crea la primer subprueba de una prueba en mi campo fecha_subprueba1 pueda actualizarse la fecha automaticamente

    La fecha de la primer subprueba y la fecha_subprueba1 deben ser la misma estoy utilizando un campo datetime en las fechas y sql server 2014

    idprueba	name	encargado	fecha		fecha_subprueba1
    1		c422	roman		12/07/17	17/07/17
    2		n77	ernesto		15/07/17	19/07/17
    3		k311	roman		12/08/17
    
    
    tablasubprueba
    
    idprueba 	idsub		name	encargado	fechA			compuesto	
    1		1		c422	roman		17/07/17		k43
    1		2		c422	roman		18/07/17		K55
    1		3		n77	ernesto		19/08/17		K44
    2		4		n77	ernesto		19/07/17		h56
    2		5		n77	ernesto		23/07/17		k47
    2		6		n77	ernesto		12/08/17		h77



    • Editado Emma Grz martes, 25 de julio de 2017 17:58
    martes, 25 de julio de 2017 17:56

Respuestas

  • Entonces tienes que escribir dos operaciones: inserción y actualización.

    --Insertar una fila de la tabla dbo.subprueba
    INSERT INTO dbo.subprueba(idprueba, fechA) VALUES (@idprueba, @Fecha);
    
    --Actualizar la columna fecha_subprueba1
    UPDATE p
    SET p.fecha_subprueba1 = sp.Fecha
    FROM
        dbo.prueba p
        INNER JOIN
        (
    	   SELECT idprueba, MIN(fechA) AS Fecha FROM dbo.subprueba WHERE idprueba = @idprueba 
    	   GROUP BY idprueba HAVING COUNT(*) = 1
        ) sp ON p.idprueba = sp.idprueba;
    GO

    Considera de que cuando se elimine o actualice "la primera fila" de un grupo de 'idprueba' de la tabla 'dbo.subprueba' se tenga que extender el cambio a la columna 'fecha_subprueba1'. Quizá pueda resultarte mas simple si lo haces mediante un trigger que se ejecute para las operaciones de: INSERT, UPDATE y DELETE.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Emma Grz jueves, 27 de julio de 2017 14:53
    martes, 25 de julio de 2017 18:25
  • Hola que tal.

    Al no conocer como es el proceso que realiza los inserts en la tabla "tablasubprueba", se me ocurre que una alternativa podría ser utilizar un TRIGGER que al insertar un nuevo registro, verifique que este insert es la primer subprueba y consecuentemente actualice el campo fecha_subprueba1 en la tabla "prueba".

    Podría ser algo así:

    CREATE TRIGGER [dbo].[TR_SubPrueba]
    ON [dbo].[SubPrueba]
    AFTER INSERT
    
    AS 
    
    DECLARE @INS int
    DECLARE @IDSUBP int
    
    SELECT @INS = COUNT(*) FROM INSERTED
    select @IDSUBP = idsub FROM INSERTED 
    
    IF @INS > 0 and @IDSUBP = 1 
    BEGIN
    
        -- a record got inserted, update Prueba.
    
        UPDAT Prueba
        SET fecha_subprueba1 = SELECT FechA  FROM INSERTED
    
    END
    

    Saludos.


    Mariano K.

    • Marcado como respuesta Emma Grz jueves, 27 de julio de 2017 14:53
    martes, 25 de julio de 2017 19:00

Todas las respuestas

  • Entonces tienes que escribir dos operaciones: inserción y actualización.

    --Insertar una fila de la tabla dbo.subprueba
    INSERT INTO dbo.subprueba(idprueba, fechA) VALUES (@idprueba, @Fecha);
    
    --Actualizar la columna fecha_subprueba1
    UPDATE p
    SET p.fecha_subprueba1 = sp.Fecha
    FROM
        dbo.prueba p
        INNER JOIN
        (
    	   SELECT idprueba, MIN(fechA) AS Fecha FROM dbo.subprueba WHERE idprueba = @idprueba 
    	   GROUP BY idprueba HAVING COUNT(*) = 1
        ) sp ON p.idprueba = sp.idprueba;
    GO

    Considera de que cuando se elimine o actualice "la primera fila" de un grupo de 'idprueba' de la tabla 'dbo.subprueba' se tenga que extender el cambio a la columna 'fecha_subprueba1'. Quizá pueda resultarte mas simple si lo haces mediante un trigger que se ejecute para las operaciones de: INSERT, UPDATE y DELETE.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Emma Grz jueves, 27 de julio de 2017 14:53
    martes, 25 de julio de 2017 18:25
  • Hola que tal.

    Al no conocer como es el proceso que realiza los inserts en la tabla "tablasubprueba", se me ocurre que una alternativa podría ser utilizar un TRIGGER que al insertar un nuevo registro, verifique que este insert es la primer subprueba y consecuentemente actualice el campo fecha_subprueba1 en la tabla "prueba".

    Podría ser algo así:

    CREATE TRIGGER [dbo].[TR_SubPrueba]
    ON [dbo].[SubPrueba]
    AFTER INSERT
    
    AS 
    
    DECLARE @INS int
    DECLARE @IDSUBP int
    
    SELECT @INS = COUNT(*) FROM INSERTED
    select @IDSUBP = idsub FROM INSERTED 
    
    IF @INS > 0 and @IDSUBP = 1 
    BEGIN
    
        -- a record got inserted, update Prueba.
    
        UPDAT Prueba
        SET fecha_subprueba1 = SELECT FechA  FROM INSERTED
    
    END
    

    Saludos.


    Mariano K.

    • Marcado como respuesta Emma Grz jueves, 27 de julio de 2017 14:53
    martes, 25 de julio de 2017 19:00
  • Hola compañero intente ponerlo en un trigger pero me sale que el campo idprueba no existe podrias poner por favor la sintaxis de como quedaria en un trigger
    jueves, 27 de julio de 2017 15:25
  • Hola, podrías copiar el código que utilizaste? Así es más fácil ayudar.

    Saludos!


    Mariano K.

    jueves, 27 de julio de 2017 15:32
  • Hola lo puse exactamente igual a como lo pusiste pero sale error cerca del select y es lo unico que me dice

    CREATE TRIGGER actfecha ON SubPrueba AFTER INSERT AS DECLARE @INS int DECLARE @IDSUBP int SELECT @INS = COUNT(*) FROM INSERTED select @IDSUBP = idsub FROM INSERTED IF @INS > 0 and @IDSUBP = 1 BEGIN UPDATe Prueba SET fecha_subprueba1 = SELECT FechA FROM INSERTED END

    Intente con el codigo de Williams pero me sale que no existe el campo idprueba

    create trigger tgActualizarsubprueba1
    on Prueba
    after insert
    as
    begin
    update p
    set p.fecha_subprueba1=sp.Fecha
    from prueba p
    inner join
    (
    select idprueba,min(Fecha) as Fecha from subprueba where idprueba=idprueba
    GROUP BY idprueba HAVING COUNT(*)=1
    )sp on p.idprueba=idprueba;
    end


    jueves, 27 de julio de 2017 16:30
  • Ahora si, lo acabo de probar:

    CREATE TRIGGER actfecha
    ON datain.SubPrueba
    AFTER INSERT
    
    AS 
    
    DECLARE @INS int
    DECLARE @IDSUBP int
    DECLARE @valor date
    SELECT @INS = COUNT(*) FROM INSERTED
    select @IDSUBP = idsub FROM INSERTED 
    
    IF @INS > 0 and @IDSUBP = 1 
    BEGIN
    
        SELECT @valor = FechaA  FROM INSERTED
        UPDATe Prueba
        SET fecha_subprueba1 = @valor
    
    END


    Mariano K.

    jueves, 27 de julio de 2017 17:49
  • Entiendo que el sentido del TRIGGER es reaccionar no sólo ante las inserciones, sino también ante actualizaciones o eliminaciones que se produzcan "en la primera fila del grupo", de no ser así bastaría con el código que inicialmente te propuse.

    En tal sentido entiendo que el trigger debería ser implementado de la siguiente manera:

    CREATE TRIGGER dbo.NombreTrigger
        ON dbo.subprueba
        AFTER INSERT, UPDATE, DELETE
    AS
    BEGIN
        /*INSERT/UPDATE*/
        WITH T AS
        (
    	   SELECT i.idprueba, MIN(sp.fechA) AS Fecha
    	   FROM inserted i INNER JOIN dbo.subprueba sp ON i.idprueba = sp.idprueba 
    	   GROUP BY i.idprueba
        )
        UPDATE p
        SET p.fecha_subprueba1 = t1.Fecha
        FROM
    	   dbo.prueba p INNER JOIN T t1 ON p.idprueba = t1.idprueba
        WHERE p.fecha_subprueba1 <> t1.Fecha;
    
        /*DELETE*/
        WITH T AS
        (
    	   SELECT d.idprueba, MIN(sp.fechA) AS Fecha
    	   FROM deleted d INNER JOIN dbo.subprueba sp ON d.idprueba = sp.idprueba 
    	   WHERE NOT EXISTS (SELECT 1 FROM inserted i WHERE i.idprueba = d.idprueba)
    	   GROUP BY d.idprueba
        )
        UPDATE p
        SET p.fecha_subprueba1 = t1.Fecha
        FROM
    	   dbo.prueba p INNER JOIN T t1 ON p.idprueba = t1.idprueba
        WHERE p.fecha_subprueba1 <> t1.Fecha;
    END


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 27 de julio de 2017 18:15