Re: Trigger

23/02/2004 - 21:24 por Rodriguez | Informe spam
He creado algo como esto pero no me funciona

create trigger Item
on detallederequisicion
for delete

as
update detallederequisicion
set detallederequisicion.Item = detallederequisicion.Item-1
from detallederequisicion
detallederequisicion inner join deleted
on detallederequisicion.requisicionID = Deleted.requisicionID
where Deleted.item < detallederequisicion.item



"Julio" <espaillat@hotmail.com> wrote in message news:...


"Julio" <espaillat@hotmail.com> wrote in message
news:OIKogvi%23DHA.3820@tk2msftngp13.phx.gbl...
> Hola Grupo
>
> Como puedo crear un trigger para la siguiente necesidad:
>
> Tengo una requisicion en la cual se insertan articulos y en ella tengo


un

> campo llamado Item
> que se va incrementando cuando se agrega un nuevo item (1,2,3,4)
>
> El problema esta en que cuando borran un detalle de la requisicion yo
> quisiera que los numeros de los item que estan debajo de ese de
descrementen
> en uno.
>
> Ejemplo
>
> Requisicion Original
> Requisicion_ID Item Detalle
> 1 1 Carro
> 1 2 Ropa
> 1 3 Cama
> 1 4 Puerta
>
> Resultado cuando Borren el Item 2
>
> Requisicion_ID Item Detalle
> 1 1 Carro
> 1 2 Cama
> 1 3 Puerta
>
> Gracias de antes manos
>
>
>


Preguntas similare

Leer las respuestas

#1 Javier Loria
23/02/2004 - 22:18 | Informe spam
Hola Julio:
Esto setencia es medio LOCO!!!, pero prueba a ver:
UPDATE DetalleRequisicion
SET DetalleRequisicion.Item=Nuevo.NuevoItem
FROM DetalleRequisicion
JOIN (SELECT DISTINCT RequisicionID
FROM Deleted) AS Borrados
ON DetalleRequisicion.RequisicionID=Borrados.RequisicionID
JOIN (SELECT COUNT(*) AS NuevoItem
, D1.Item
, D1.RequisicionID
FROM DetalleRequisicion AS D1
JOIN DetalleRequisicion AS D2
ON D1.RequisionIDÒ.RequisicionID
AND D1.Item>Ò.Item
GROUP BY D1.Item) AS Nuevo
ON DetalleRequisicion.RequisicionID=Nuevo.RequisicionID
AND DetalleRequisicion.Item=Nuevo.Item
AND Nuevo.RequisicionID=Deleted.RequisicionID
Esta sin probar y podria tener problemas de sintaxis, pero debe hacer el
trabajo adecuado.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Rodriguez escribio:
He creado algo como esto pero no me funciona

create trigger Item
on detallederequisicion
for delete

as
update detallederequisicion
set detallederequisicion.Item = detallederequisicion.Item-1
from detallederequisicion
detallederequisicion inner join deleted
on detallederequisicion.requisicionID = Deleted.requisicionID
where Deleted.item < detallederequisicion.item



"Julio" wrote in message news:...

"Julio" wrote in message
news:OIKogvi%
Hola Grupo

Como puedo crear un trigger para la siguiente necesidad:

Tengo una requisicion en la cual se insertan articulos y en ella
tengo un campo llamado Item
que se va incrementando cuando se agrega un nuevo item (1,2,3,4)

El problema esta en que cuando borran un detalle de la requisicion
yo quisiera que los numeros de los item que estan debajo de ese de
descrementen en uno.

Ejemplo

Requisicion Original
Requisicion_ID Item Detalle
1 1 Carro
1 2 Ropa
1 3 Cama
1 4 Puerta

Resultado cuando Borren el Item 2

Requisicion_ID Item Detalle
1 1 Carro
1 2 Cama
1 3 Puerta

Gracias de antes manos
Respuesta Responder a este mensaje
#2 Horacio
24/02/2004 - 16:36 | Informe spam
No manejo bien los triggers, pero este sp se encarga de todo (se puede adaptar

CREATE PROCEDURE zz (@Req as int, @Item as int,@Borrar as int) A

declare @temp as in
if @Borrar = 1
begi
delete tabla where req=@req and item=@ite
en

select @temp = count(item) from tabla where req=@req and item=@item+

if @tempbegi
update tabla set item=item-1 where req=@req and item=@item+
set @Item = @Item +
exec zz @req, @Item ,
en
G

Saludo

Horaci

PD: ¿Es adecuado usar este tipo de recursividad?
Respuesta Responder a este mensaje
#3 Javier Loria
24/02/2004 - 22:16 | Informe spam
Hola Horacio:
Si vas ha manejar la situacion en un Procedimiento (que dicho sea de
paso es MUCHO MUCHO MEJOR). Podrias probar con algo como:
==CREATE Procedure zzBorrar(@Req as int, @Item as int,@Borrar as int)
AS
SET NOCOUNT ON
BEGIN TRAN
DELETE Tabla
WHERE Req=@Req AND Item=@Item
UPDATE Tabla
SET Item=Item-1
WHERE Req=@Req Item>@Item

COMMIT
== En cuanto a tu postdata, la recursividad es un recurso totalmente
valido, pero en este caso no veo la necesidad. Tienes que cambiar un poco la
forma de pensar, el UPDATE trabaja sobre un conjunto de datos (delimitados
por el WHERE) y realiza la transformacion indicada en el SET.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Horacio escribio:
No manejo bien los triggers, pero este sp se encarga de todo (se
puede adaptar)

CREATE PROCEDURE zz (@Req as int, @Item as int,@Borrar as int) AS

declare @temp as int
if @Borrar = 1
begin
delete tabla where req=@req and item=@item
end

select @temp = count(item) from tabla where req=@req and item=@item+1

if @temp=1
begin
update tabla set item=item-1 where req=@req and item=@item+1
set @Item = @Item +1
exec zz @req, @Item , 0
end
GO

Saludos

Horacio

PD: ¿Es adecuado usar este tipo de recursividad?
Respuesta Responder a este mensaje
#4 Horacio
25/02/2004 - 14:11 | Informe spam
Hola! gracias por contestar

Se me ocurrió hacer el update de a uno porque yo pensé lo siguiente (erroneamente)
Si los dos campos son clave y no permiten duplicados, quería prevenir ese error
Pero como leí (aprendí) después en otro post, un update es un delete y un insert. En ese caso no se va a dar lo de error por duplicados

Saludo

Horacio
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida