Hola!

Registrándote como bakuno podrás publicar, compartir y comunicarte en privado con otros bakuos :D

Regístrame ya!

Ayuda con SQL Server plz!!

®sicKer

Bovino Milenario
Desde
25 May 2007
Mensajes
1.469
Hola bakunos, haber si me pueden ayudar, tengo el siguiente problema:
Tengo una tabla (Pago) con los soguientes campos: alumno, empleado, beca, pago y folio. Quiero hacer un desencadenador que me permita colocar de manera automatica en el campo de pago la cantidad de 1200 cuando en el campo beca se coloca "Si", tegno el siguiente codigo que es lo que e intentado pero no me funciona:

create trigger Yaa
on dbo.Pago
for insert
as
begin
declare @dec char
select @dec=(select(inserted.beca)from dbo.Pago)
if(@dec='Si')

begin
update dbo.Pago
set pago=1200

end
else
begin
raiserror('Error no se pudieron concretar las operaciones',10,1)
rollback transaction
end
end

Ojala me puedan ayudar :vientos:
 
No te falta delimitar el ID que quieres actualizar? por eso no hace nada, porque te falta un WHERE, no? bueno... creo que puede ser una razón del error... porque en esa consulta no solo comparas y al actualizar no dices en cual es.

Bueno, la verdad es que yo trabajo poco con triggers, trabajo mas con cursores y con eso te puedo ayudar mas (que es casi lo mismo).

En fin, es mi observación.

y poqrue lo quieres hacer por SQL? porque no lo haces por codigo en el lenguaje que estas programando?

Mucho msa facil, ya hubieras terminado.

Recuerda... que no siempre tienes esa facilidad... quizá el no tiene la opción de hacerlo de otra forma, porque las rutinas en SQL solo consumen recursos del servidor y si tu haces un cliente, ya no solo consumes recursos del servidor, sino que de cada maquina que ejecuta el cliente.

Cuando en las empresas te obligan a optimizar el rendimiento de los servidores la mejor forma de hacerlo es con cursores y triggers.
 
Pues es cierto te falta el where simplemente le dices que actualice tal dato pero no en donde
Prueba on
update dbo.Pago
set pago=1200
where llavePricipal = algo

el algo debe ser la llave principal del registro que deberia seleccionarse al iniciar el trigger y ser el del registro que se ingreso
 
create trigger Yaa
on dbo.Pago
for insert
as
begin
declare @dec char,
@cod int
select @dec= beca, @cod = id_pago from inserted
if(@dec='Si')

begin
update dbo.Pago
set pago=1200
where id_pago = @cod

end
else
begin
raiserror('Error no se pudieron concretar las operaciones',10,1)
rollback transaction
end
end
 
Create table pagos
(
alumno int not null primary key,
empleado int not null,
beca varchar(2),
pago money,
folio int
);

Create Trigger pago_beca
on pagos
for insert
as
Begin
declare @al int,
@beca varchar(2)
Select @al = alumno, @beca = beca
from inserted

update pagos set pago = 1200
where alumno = @al and @beca='SI'

return
end;

insert into pagos values(1,100,'SI',0,1)
insert into pagos values(2,100,'SI',0,1)
insert into pagos values(3,100,'NO',0,1)
insert into pagos values(4,100,'SI',0,1)
insert into pagos values(5,100,'NO',0,1)

Select *
from pagos
 
La ayuda de los hermanos bacunos es correcta solo yo te recomendaria que declares el trigger con una opcion que te permita asegurarte que el dato este en la tabla primero y esto lo logras con opcion after aqui la estructura de creacion.

CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }

Para tu caso

create trigger Yaa on dbo.Pago AFETER insert

Que con esta declaracion aseguras que primero te ponga los datos en la tabla Pago y despues los actualizas, de otra forma como obtienen los datos de inserted antes de que esten en la tu tabla vas a correr una actualizacion hacia un dato que no existe.

Saludos y suerte con el proyecto
 
Volver
Arriba