Maximiliano y Listaros, les mando el Trigger.

La idea es tengo 2 tablas, una, reg_expedientes (información de expedientes)
y otra reg_expedientes_estados que mantiene el historial de estados de los
expedientes.

 

Yo tengo que controlar el pasaje de expedientes.

 

Y mantengo una cierta redundancia, es decir, el último estado de un
expediente en la tabla historial tiene que coincidir con el estado de la
tabla de expedientes.

 

O digámoslo así, cuando uno modifica el estado en la tabla de expedientes,
yo genero el estado en la tabla historial. Lo mismo si modifico otro dato
que no sea el estado (por ejemplo un usuario distinto o no escribe el mismo
estado pero en otra fecha), entonces lo reflejo en la tabla historial
(actualizando la fecha o el usuario de la tabla historial).

 

Bueno, trato de explicarles lo más detalladamente posible.

Espero me respondan.

 

Atte.

Silvana.-

 

 

 

ALTER       TRIGGER tg_reg_expedientes ON dbo.reg_expedientes AFTER insert,
update AS

--OJO, si en el UPDATE del ASP no se realiza un set fecha_estado=getdate(),
no se graba bien la fecha

 

declare @id_expediente int,          @id_estado int,     @fecha_estado
datetime,            @id_usuario int,     @id_sector int,

                @id_expediente_ult int, @id_estado_ult int,
@fecha_estado_ult datetime, @id_usuario_ult int, @id_sector_ult int,

                @id_expediente_estado int

 

begin transaction

                declare crs cursor for

                select     id_expediente, id_estado, fecha_estado,
id_usuario, id_sector from inserted

 

                open crs

 

                fetch next from crs into @id_expediente, @id_estado,
@fecha_estado, @id_usuario, @id_sector

                

                while @@fetch_status = 0

                begin

                               set @id_estado_ult=-1

                               

--consulto en la vista que tiene el último estado de la tabla historial

                               select
@id_expediente_estado=id_expediente_estado, @id_estado_ult=id_estado,
@fecha_estado_ult=fecha_estado, @id_usuario_ult=id_usuario,
@id_sector_ult=id_sector

                               from vw_reg_expedientes_estados where
[EMAIL PROTECTED] order by id_expediente_estado desc

 

                               --Controlo si difere la modificacion al
estado actual de la tabla historial de estados

                               --o no contiene su correspondiente registro
en la tabla historial de estados

                               if (@id_estado<>@id_estado_ult) or
@id_estado_ult=-1

                                               begin

                                                               if
(@id_estado_ult<>-1)

 
set @fecha_estado=dateadd(ms,10,@fecha_estado) --si es nuevo el registro
inserta la misma fecha

                                                               insert into
reg_expedientes_estados (id_expediente, id_estado, fecha_estado, id_usuario,
id_sector)

                                                               values
(@id_expediente, @id_estado, @fecha_estado, @id_usuario, @id_sector)

                                               end

                               else

                                               begin

                                               if
(@fecha_estado<>@fecha_estado_ult) or (@id_usuario<>@id_usuario_ult) or
(@id_sector<>@id_sector_ult)

                                                               begin

 
update reg_expedientes_estados

 
set          [EMAIL PROTECTED],

 
[EMAIL PROTECTED],

 
[EMAIL PROTECTED],

 
[EMAIL PROTECTED]

 
where [EMAIL PROTECTED]

                                                               end

                                               end

                               print @id_expediente_estado

                               fetch next from crs into @id_expediente,
@id_estado, @fecha_estado, @id_usuario, @id_sector

                end

                close crs

                deallocate crs

commit transaction

 

-----Mensaje original-----
De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Maxi Accotto
Enviado el: viernes, 10 de agosto de 2007 23:53
Para: Silvana Natalia Quiroga
Asunto: [dbms] Triggers

 

jajaj, tampoco!!! vos no tenes que usar cursores, cada vez que armamos

algo con un cursor es porque algo esta mal, ya sea el diseño, el

conocimiento nuestro de tsql, etc. Contanos tus casos y veamos como

sacar esos cursores :)

 

El 10/08/07, Silvana Natalia Quiroga <[EMAIL PROTECTED]> escribió:

> Bueno no me reten!! Jejejejeje.

> 

> Yo me confundí. El no necesita usar cursores porque sólo inserta. En
cambio

> yo, si quiero hacer controles sobre varias tablas y dependiendo de eso

> inserto o no cierta información, ahí sí no me quedaría otra.

> Me entienden?

> Y ahí sería al vicio usar transacciones?

> 

> A ver si aprendo.

> Espero me respondan.

> 

> Silvana.-

> 

> -----Mensaje original-----

> De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Maxi Accotto

> Enviado el: viernes, 10 de agosto de 2007 15:39

> Para: Silvana Natalia Quiroga

> Asunto: [dbms] Triggers

> 

> Hola Silvana, le recomendas usar un cursor? sabes que los cursores son

> el peor enemigo dentro de SQL? sabias que un trigger esta dentro de

> una transaccion y que estas deberian durar el minimo tiempo posible?

> pues es una muy pero muy mala idea usar cursores y peor si estan

> dentro de un trigger, nunca hagas eso.

> Si insertan mas de un registro no hay problema porque hacer

> 

> INSERT INTO TUTABLA

> SELECT CAMPOS FROM INSERTED

> 

> El 10/08/07, Silvana Natalia Quiroga <[EMAIL PROTECTED]> escribió:

> >

> >

> >

> > No queda recursivo porque insertas en otra tabla.

> >

> > Sí te aconsejo usar un cursor y recorrer toda la tabla inserted, por si
se

> > insertaron varios registros de una sola vez.

> >

> > También usar transacciones.

> >

> >

> >

> > Silvana.-

> >

> >

> > ________________________________

> >

> >

> > De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Jesús dos
Santos

> > Enviado el: viernes, 10 de agosto de 2007 15:07

> > Para: Silvana Natalia Quiroga

> > Asunto: [dbms] Triggers

> >

> >

> >

> > Puede ser algo asi??

> >

> >

> >

> > CREATE TRIGGER [nuevocodigo] ON [dbo].[Articulos_ing]

> >

> > FOR INSERT

> >

> > AS

> >

> > insert into articulos_ing

> >

> > select i.ingfecha,i.ingcantidad*3,i.ingkilos,123,i.remito

> >

> > from inserted i where i.codigo=456

> >

> >

> > ________________________________

> >

> >

> > De: [email protected] [mailto:[EMAIL PROTECTED] En nombre de Darío
Salvático

> > Enviado el: viernes, 10 de agosto de 2007 14:09

> > Para: [EMAIL PROTECTED]

> > Asunto: [dbms] Triggers

> >

> >

> >

> >

> > Se puede tranquilamente, mira en el help el uso de las tablas internas

> > deleted e inserted, que se generan automacticamente y contienen los
datos

> en

> > el estado anterior (deleted) y el nuevo estado (inserted), son utililes

> para

> > operar con ellos. Ademas podes usar lose trigger en dos modos, after o

> > instead off, este ultimo te permite realizar accones en 'lugar de '

> >

> >

> >

> >

> >

> > Saludos.

> >

> >

> > -----Mensaje original-----

> > De: [email protected] [mailto:[EMAIL PROTECTED] nombre de Jesús dos
Santos

> > Enviado el: Viernes, 10 de Agosto de 2007 01:21 p.m.

> > Para: [EMAIL PROTECTED]

> > Asunto: [dbms] Triggers

> >

> > Lista, una consulta técnica, quiero saber si se puede hacer por medio te

> un

> > trigger algo que me agregue un registro a una tabla.

> >

> > Quiero que cuando se ingrese un registro con x código en un campo,

> > automáticamente se agregue otro registro con otro codigo y los demas

> datos,

> > es posible esto?

> >

> > Desde ya muchas gracias nuevamente.

> >

> >

> >

> >

> >

> > __________ Información de NOD32, revisión 2442 (20070807) __________

> >

> > Este mensaje ha sido analizado con NOD32 antivirus system

> > http://www.nod32.com

> >

> >

> >

> > __________ Información de NOD32, revisión 2442 (20070807) __________

> >

> > Este mensaje ha sido analizado con NOD32 antivirus system

> > http://www.nod32.com

> 

> 

> --

> -----------------------------------------------------------

> Microsoft MVP en SQL Server

> Mentor asociado en SQLTotalConsulting

>  (excelencia en servicios y consultoria  SQLServer)

> Orador Culminis - Microsoft Influencier

> www.sqltotalconsulting.com

> -----------------------------------------------------------

> 

> 

> __________ Información de NOD32, revisión 2442 (20070807) __________

> 

> Este mensaje ha sido analizado con  NOD32 antivirus system

> http://www.nod32.com

> 

> 

> 

> 

 

 

-- 

-----------------------------------------------------------

Microsoft MVP en SQL Server

Mentor asociado en SQLTotalConsulting

 (excelencia en servicios y consultoria  SQLServer)

Orador Culminis - Microsoft Influencier

www.sqltotalconsulting.com

-----------------------------------------------------------

 

 

__________ Información de NOD32, revisión 2450 (20070810) __________

 

Este mensaje ha sido analizado con  NOD32 antivirus system

http://www.nod32.com

 

Responder a