Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер на обновление  [new]
artemtprv
Member

Откуда:
Сообщений: 3
Подскажите пожалуйста! Как переделать триггер чтобы работал при обновлении сразу нескольких строк?
полагаю проблема в переменных, но в виду отсутствия опыта не могу реализовать иначе.
Вразумите меня пожалуйста)
--3. Создать триггер, который при изменении количества товара на складе формирует запись в таблицу расходов 
--с сегодняшней датой и суммой расхода, равной (сумма товара * количество добавившегося товара) 

insert into expense_items values ('Закупка товаров')

if object_id ('u_warehouse1', 'trigger') is not null
 drop trigger u_warehouse1; 
  go
    create trigger u_warehouse1 on dbo.warehouse
    for update 
  as
   begin           
	declare @u_quantity_before_add int, @u_quantity_after_add int, @u_new_amount decimal(18,2), @u_iid int, @u_amount	decimal (18,2)
	select @u_quantity_before_add=quantity from deleted 
	select @u_amount=amount from deleted 
	select @u_quantity_after_add=quantity from inserted 
	select @u_iid=iid from inserted
	select @u_new_amount=(@u_quantity_after_add-@u_quantity_before_add)*@u_amount	
	  print 'Начальное количество товара на складе '+convert(varchar, @u_quantity_before_add)	  
	  print 'Количество товара после изменения '+convert(varchar,@u_quantity_after_add)	 
	  print 'Добавляемый расход'+ convert(varchar,@u_new_amount)
	  
	insert into dbo.charges values (@u_new_amount, GETDATE(), 1)		
	  print 'Информация успешно добавлена в таблицу расходов!'	  
	  commit transaction
   end


	 select * from charges
	 select * from expense_items
	 select * from warehouse
	 update warehouse set quantity=97 where iid=8


К сообщению приложен файл (SQLQuery1.sql - 5Kb) cкачать
24 май 17, 12:19    [20507312]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление  [new]
мегамозг
Member

Откуда: Екатеринбург
Сообщений: 71
artemtprv, используй агрегаты в переменных

set @total0 = (select sum(quantity*amount) from deleted); --было
set @total2 = (select sum(quantity*amount) from inserted); --стало
24 май 17, 12:53    [20507521]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
deleted d inner join inserted i on i.iid = d.iid
24 май 17, 12:57    [20507538]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление  [new]
aleks2
Guest
Дедушка
deleted d inner join inserted i on i.iid = d.iid

Дедушки и так понимают.

    create trigger u_warehouse1 on dbo.warehouse
    for update 
  as
  begin           
	 
	with i as ( select * from inserted )
	   , d as ( select * from deleted )
	   , x0 as ( select u_quantity_before_add = d.quantity
	                  , u_amount = d.amount
					  , u_quantity_after_add = i.quantity
					  , i.iid
	              from i inner join d on i.iid = d.iid
	          )
	   , x as ( select *, u_new_amount = ( u_quantity_after_add - u_quantity_before_add ) * u_amount from x0 )
	insert into dbo.charges ( amount, charge_date, expense_item_id )
	  --output inserted.*
	  select u_new_amount, GETDATE(), iid from x;
	  		
   end
24 май 17, 13:07    [20507592]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
artemtprv,

триггер здесь каким боком? Напишите процедуру для получения и процедуру для выдачи товара.
24 май 17, 17:42    [20508940]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление  [new]
artemtprv
Member

Откуда:
Сообщений: 3
Большое всем спасибо, выручили
28 май 17, 16:23    [20518173]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на обновление  [new]
artemtprv
Member

Откуда:
Сообщений: 3
Владислав Колосов, это задание не я придумал
28 май 17, 16:24    [20518174]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить