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

Preguntas similare

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




.

Respuesta Responder a este mensaje
#2 Julio
05/12/2003 - 20:48 | Informe spam
Trato de crear el trigger de esta manera

CREATE TRIGGER Ordencancelada1 ON ordendecompra INSTEAD OF INSERT
AS
IF EXISTS (SELECT ordennumero FROM ordencancelada WHERE ordennumero IN (
SELECT ordennumero FROM inserted ) )
RAISERROR ('Esta orden fue cancelada.',16,1)
ELSE
INSERT INTO ordencancelada SELECT ordennumero,RequisicionNumero FROM
inserted

y me sale este error


Server: Msg 213, Level 16, State 4, Procedure Ordencancelada1, Line 7
Insert Error: Column name or number of supplied values does not match table
definition.





"ulises" wrote in message
news:0bca01c3bb51$ccc7b110$
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




.

Respuesta Responder a este mensaje
#3 ulises
05/12/2003 - 20:56 | Informe spam
Según veo tu tabla OrdenCancelada tiene tres campos y solo
le estás pasando dos, falta la fecha; pero en todo caso
creo que la idea es insertarlo en la tabla OrdenDeCompra
no en la tabla OrdenCancelada.

Saludos,
Ulises

Trato de crear el trigger de esta manera

CREATE TRIGGER Ordencancelada1 ON ordendecompra INSTEAD


OF INSERT
AS
IF EXISTS (SELECT ordennumero FROM ordencancelada WHERE


ordennumero IN (
SELECT ordennumero FROM inserted ) )
RAISERROR ('Esta orden fue cancelada.',16,1)
ELSE
INSERT INTO ordencancelada SELECT


ordennumero,RequisicionNumero FROM
inserted

y me sale este error


Server: Msg 213, Level 16, State 4, Procedure


Ordencancelada1, Line 7
Insert Error: Column name or number of supplied values


does not match table
definition.
Respuesta Responder a este mensaje
#4 Julio
05/12/2003 - 21:29 | Informe spam
Lo que pasa es que la fecha la paso de manera automatica Getdate ()
"ulises" wrote in message
news:011a01c3bb69$eec872a0$
Según veo tu tabla OrdenCancelada tiene tres campos y solo
le estás pasando dos, falta la fecha; pero en todo caso
creo que la idea es insertarlo en la tabla OrdenDeCompra
no en la tabla OrdenCancelada.

Saludos,
Ulises

Trato de crear el trigger de esta manera

CREATE TRIGGER Ordencancelada1 ON ordendecompra INSTEAD


OF INSERT
AS
IF EXISTS (SELECT ordennumero FROM ordencancelada WHERE


ordennumero IN (
SELECT ordennumero FROM inserted ) )
RAISERROR ('Esta orden fue cancelada.',16,1)
ELSE
INSERT INTO ordencancelada SELECT


ordennumero,RequisicionNumero FROM
inserted

y me sale este error


Server: Msg 213, Level 16, State 4, Procedure


Ordencancelada1, Line 7
Insert Error: Column name or number of supplied values


does not match table
definition.
Respuesta Responder a este mensaje
#5 ulises
05/12/2003 - 22:11 | Informe spam
Sí pero la sentencia INSERT no sabe a cual de los tres
campos aplicar los dos campos que estas leyendo, en el
caso que la fecha ya tiene un DEFAULT tendrias que
especificar los campos que estás insertando.

INSERT INTO tabla ( campo1, campo2 ) SELECT ...

Pero me sigue quedando la duda, ya que este trigger
INSTEAD OF INSERT es en la tabla OrdenDeCompra y por lo
tanto le tienes que indicar que se llene esta tabla y no
la de OrdenCancelada.

Saludos,
Ulises

Lo que pasa es que la fecha la paso de manera automatica


Getdate ()
"ulises" wrote in message
news:011a01c3bb69$eec872a0$
Según veo tu tabla OrdenCancelada tiene tres campos y solo
le estás pasando dos, falta la fecha; pero en todo caso
creo que la idea es insertarlo en la tabla OrdenDeCompra
no en la tabla OrdenCancelada.

Saludos,
Ulises
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida