Insertead OF

05/12/2003 - 16:37 por Julio | Informe spam
Hola grupo

Tengo una tabla llamada 'ordendecompra' y otra llamada 'ordencancelada' lo
que sucede es que cuando se borra una odendecompra se copia en
ordencancelada.
Lo que quiero es que si vuelven a poner el mismo numero de orden, le de un
error ya que ese numero de orden fue cancelado.
Tengo un trigger que se dispara cuando borran el numero de orden y lo copia
en la tabla ordencancelada.

Tablas

Odendecompra
Compraid ordennumero requisicionnumero fecha
1 03-88 01-11 02/02/08


Ordencancelada
Ordennumero requisicionnumero fecha actual
03-88 01-11 28/03/2003

He probado con trigger pero no me sale.

create view ordenview
as
select ordendecompra.ordennumero as ordencompras,ordencancelada.ordennumero
as ordencancelada from ordendecompra inner join ordencancelada
on ordendecompra.ordennumero=ordencancelada.ordennumero
go
create trigger Error
on ordenview
instead of insert
as
if
select * from ordenview
where ordencompras=ordencancelada
begin
Raiserror ('Esta orden fue cancelada.',16,1)
rollback transaction
end
 

Leer las respuestas

#1 ulises
05/12/2003 - 18:04 | Informe spam
Te adjunto un ejemplo que te puede ayudar :

CREATE TABLE base ( clave int not null, valor01 char(01),
valor02 char(02) )
go
CREATE TABLE borrados ( clave int not null, fecha
datetime )
go
INSERT INTO base VALUES ( 1, 'A', 'A1' )
INSERT INTO base VALUES ( 2, 'B', 'B1' )
INSERT INTO base VALUES ( 3, 'C', 'C1' )
INSERT INTO base VALUES ( 4, 'D', 'D1' )
INSERT INTO base VALUES ( 5, 'E', 'E1' )
go
CREATE TRIGGER tr_delbase ON base AFTER DELETE
AS
INSERT INTO borrados
SELECT clave, GETDATE() FROM deleted
go
CREATE TRIGGER tr_addbase ON base INSTEAD OF INSERT
AS
IF EXISTS ( SELECT clave FROM borrados WHERE clave IN (
SELECT clave FROM inserted ) )
RAISERROR ('Esta orden fue cancelada.',16,1)
ELSE
INSERT INTO base SELECT * FROM inserted
GO
SELECT * FROM base
SELECT * FROM borrados
GO
DELETE FROM base WHERE clave = 3
DELETE FROM base WHERE clave = 4
INSERT INTO base VALUES ( 6, 'F','F1')
INSERT INTO base VALUES ( 3, 'G','G1')
go
SELECT * FROM base
SELECT * FROM borrados

Si lo ejecutas obtendrás lo siguiente :

clave valor01 valor02
1 A A1
2 B B1
3 C C1
4 D D1
5 E E1

y luego de las adiciones y eliminaciones :

clave valor01 valor02
1 A A1
2 B B1
6 F F1
5 E E1

(4 row(s) affected)

clave fecha
3 2003-12-05 11:59:31.533
4 2003-12-05 11:59:31.533

Como verás no se pudo grabar nuevamente el registro 3
dando el siguiente mensaje :

Server: Msg 50000, Level 16, State 1, Procedure
tr_addbase, Line 4
Esta orden fue cancelada.

Saludos,
Ulises

Hola grupo

Tengo una tabla llamada 'ordendecompra' y otra


llamada 'ordencancelada' lo
que sucede es que cuando se borra una odendecompra se


copia en
ordencancelada.
Lo que quiero es que si vuelven a poner el mismo numero


de orden, le de un
error ya que ese numero de orden fue cancelado.
Tengo un trigger que se dispara cuando borran el numero


de orden y lo copia
en la tabla ordencancelada.

Tablas

Odendecompra
Compraid ordennumero requisicionnumero fecha
1 03-88 01-


11 02/02/08


Ordencancelada
Ordennumero requisicionnumero fecha actual
03-88 01-11 28/03/2003

He probado con trigger pero no me sale.

create view ordenview
as
select ordendecompra.ordennumero as


ordencompras,ordencancelada.ordennumero
as ordencancelada from ordendecompra inner join


ordencancelada
on ordendecompra.ordennumero=ordencancelada.ordennumero
go
create trigger Error
on ordenview
instead of insert
as
if
select * from ordenview
where ordencompras=ordencancelada
begin
Raiserror ('Esta orden fue cancelada.',16,1)
rollback transaction
end




.

Preguntas similares