SQL - Trigger + AFTER UPDATE

 
Vista:

Trigger + AFTER UPDATE

Publicado por SirSocket (13 intervenciones) el 18/08/2010 19:14:44
Buenas.

He creado un trigger para que cuando en la tabla 1 me actualizen unos campos ,lo que quiero que haga es que en otra tabla vaya a mirar si existe el registro que se acaba de actualizar.
1.-Se existe debe actualizar los campos modificados en la tabla 1
2.-No existe debe insertar el registro actualizado.

Bien parece que todo claro el problema que tengo es que no se como obtener el valor de los campos actualizados.
M' explico

Me han actualizado el campo precio,como puedo coger el valor Identificativo de la tabla1 para realizar una comparación??

*Inicio codigo trigger----------------------------------------------------------------------------

CREATE TRIGGER UpdateLinhasDoc ON LinhasDoc
AFTER UPDATE
AS

DECLARE @Exists VARCHAR

SET NOCOUNT ON

IF UPDATE(PrecUnit) or UPDATE(Quantidade)
BEGIN

SELECT @Exists = IdCabecDoc
FROM MiddleLinhasDoc
WHERE IdCabecDoc = deleted.IdCabecDoc and
NumLinha = deleted.NumLinha

IF (@Exists = 0)
INSERT INTO MiddleLinhasDoc(IdCabecDoc, NumLinha, PrecUnit, Quantidade)
SELECT IdCabecDoc, NumLinha, PrecUnit, Quantidade
FROM deleted

ELSE
UPDATE MiddleLinhasDoc
SET PrecUnit = deleted.PrecUnit,
Quantidade = deleted.Quantidade
WHERE IdCabecDoc = deleted.IdCabecDoc and
NumLinha = deleted.NumLinha

END

*fin codigo trigger----------------------------------------------------------------------------

Explico lo que hago para que se entienda todo ok

Creo un trigger para cuando se actualize la tabla linhasDoc me salte este este trigger
Compruebo si se ha actualizado alguno de los campos que me interesa
IF UPDATE(PrecUnit) or UPDATE(Quantidade)

Primer problema

SELECT @Exists = IdCabecDoc
FROM MiddleLinhasDoc
WHERE IdCabecDoc = deleted.IdCabecDoc and
NumLinha = deleted.NumLinha

en este select lo que intento hacer es mirar en una tabla intermedia ("MiddleLinhasDoc") si existe un registro con el numero de cabecera y numero de lineas igual a los actualizados (esto creo que lo debo hacer mediante la tabla (deleted, que es una tabla que guarda sql donde estan los valores anteriores a la actualizacion)) ,pues bien la expresion deleted.id....no es correcta no se puede hacer deleted punto lo que sea....como debo de hacerlo??
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Trigger + AFTER UPDATE

Publicado por SirSocket (13 intervenciones) el 19/08/2010 11:43:09
Buenas.

Bien encontre la solución

SELECT @Exists = IdCabecDoc
FROM MiddleLinhasDoc m
join deleted d
WHERE IdCabecDoc = d.IdCabecDoc and
NumLinha = d.NumLinha

esto funciona perfectamente , ahora estaba haciendo algo mas complejo y me da error de sintaxis cerca de '='

concretamente :

Mens 102, Nivel 15, Estado 1, Procedimiento DeleteLinhasDoc, Línea 14
Sintaxis incorrecta cerca de '='.


IF EXISTS (SELECT @Status = m.StatusLinha,
@IdCabecDoc = m.IdCabecDoc,
@NumLinha = m.NumLinha,
@PrecUnit = m.PrecUnit,
@Quantidade = m.Quantidade
FROM MiddleLinhasDoc m
JOIN deleted d
ON m.IdCabecDoc = d.IdCabecDoc and
m.NumLinha = d.NumLinha)
No se puede asignar distintas variables a la vez en un select??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Trigger + AFTER UPDATE

Publicado por SirSocket (13 intervenciones) el 19/08/2010 12:57:59
Buenas..pues visto lo visto he hecho pruebas

y select @variable = loquesea,@variable2 = prueba

funciona perfectamente pero

con un if exists(select @variable = loquesea,@variable2 = prueba

esto no funciona..

conste que solo me devuelve un registro la tabla pero no funciona.

Lo dejo asi como que no tiene solucion si alguien se lo encuentra que me lo cuente :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Trigger + AFTER UPDATE

Publicado por Leopoldo Taylhardat (93 intervenciones) el 19/08/2010 14:03:40
Saludos...
En el foro "FORO - Sybase SQL Anywhere " hay una explicación bastante completa de como se escriben los trigger (está basado en Anywhere) que puedes adaptar facilmente para cualquier bd...
Inclusive escribí un ejemplo para auditoría...
Espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Trigger + AFTER UPDATE

Publicado por SirSocket (13 intervenciones) el 19/08/2010 14:18:15
Te lo agradezco, ya me lo he mirado pero el mio es un poco mas complejo si consigo finalizarlo lo colgare para que lo veas :D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Trigger + AFTER UPDATE

Publicado por SirSocket (13 intervenciones) el 19/08/2010 21:37:09
Bueno consegui lo que queria por si a alguien le interesa lo posteo

CREATE TRIGGER UpdateLinhasDoc ON LinhasDoc
AFTER UPDATE
AS

DECLARE @IdCabecDoc Uniqueidentifier
DECLARE @NumLinha SMALLINT
DECLARE @PrecUnit FLOAT
DECLARE @Quantidade SMALLINT
DECLARE @QuantidadeDel SMALLINT
DECLARE @QuantidadeOrig SMALLINT
DECLARE @Status CHAR(3)

SET NOCOUNT ON

IF UPDATE(PrecUnit) or UPDATE(Quantidade)
BEGIN

SELECT @PrecUnit = PrecUnit, @Quantidade = Quantidade, @IdCabecDoc = IdCabecDoc, @NumLinha = NumLinha
FROM inserted

SELECT @QuantidadeDel = Quantidade
FROM deleted

IF EXISTS (SELECT *
FROM MiddleLinhasDoc m
JOIN inserted i
ON m.IdCabecDoc = i.IdCabecDoc and
m.NumLinha = i.NumLinha)
BEGIN

SELECT @Status = m.StatusLinha, @QuantidadeOrig = m.Quantidade
FROM MiddleLinhasDoc m
JOIN inserted i
ON m.IdCabecDoc = i.IdCabecDoc and
m.NumLinha = i.NumLinha

IF (@Status LIKE 'INS')

BEGIN
UPDATE MiddleLinhasDoc
SET PrecUnit = @PrecUnit,
Quantidade = @Quantidade
WHERE IdCabecDoc = @IdCabecDoc and
NumLinha = @NumLinha
END

IF (@Status LIKE 'UPD')
BEGIN

BEGIN
UPDATE MiddleLinhasDoc
SET PrecUnit = @PrecUnit,
Quantidade = (@Quantidade - @QuantidadeDel) + @QuantidadeOrig
WHERE IdCabecDoc = @IdCabecDoc and
NumLinha = @NumLinha
END

END
END

ELSE
BEGIN
SELECT @PrecUnit = PrecUnit, @Quantidade = Quantidade, @IdCabecDoc = IdCabecDoc, @NumLinha = NumLinha
FROM inserted

INSERT INTO MiddleLinhasDoc(IdCabecDoc, NumLinha, PrecUnit, Quantidade, StatusLinha)
VALUES (@IdCabecDoc, @NumLinha, @PrecUnit, @Quantidade - @QuantidadeDel, 'UPD')
END

END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Trigger + AFTER UPDATE

Publicado por Jose (1 intervención) el 29/03/2013 21:28:04
Oye Disculpa Esta Interesante el trigger podrias pasarme el codigo de la tablas por favor te lo agradeceria
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar