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

Откуда:
Сообщений: 4
Задача такая, при добавления товара в накладную, который уже в ней содержится, при этои не добавлять новый товар а просто прибавлять к количеству уже созданной записи количество.
Для этого реализую триггер, который добавляет к уже существующей записи. Вопрос в следующем как не добавлять в таблицу новую запись. Вот пример триггера.
create trigger AddProductDouble
on Приход for insert
as
declare @BillID int, @ProductID int, @Count int, @summ decimal(6, 2);
select @BillID = Inserted.[№Накладной], @ProductID = Inserted.КодТовара,
@Count = Inserted.Количество, @summ = Inserted.Цена
from Inserted;
update Приход set Количество = Количество + @Count
where [№Накладной] = @BillID and КодТовара = @ProductID
go
Тригер срабатывает правильно, но при этом запись дублируется в таблице.
5 май 12, 12:35    [12512904]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
daytery,

триггер с типом INSTEAD
5 май 12, 12:39    [12512925]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
daytery
Member

Откуда:
Сообщений: 4
Ken@t,

Спасибо за помощь, все получилось. Но при добавлении товара, которого нет в таблице но же не будет добавляться. Поставить условие в триггере на проверку, или же есть другая хитрость?
5 май 12, 13:24    [12513270]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
instead of
Guest
daytery
Ken@t,

Спасибо за помощь, все получилось. Но при добавлении товара, которого нет в таблице но же не будет добавляться. Поставить условие в триггере на проверку, или же есть другая хитрость?

какая хитрость-то?
Вам просто таблицу inserted(вы же знаете что триггер срабатывает на весь стейтмент?) надо смержить с таблицей на которую повешен instead of триггер.
5 май 12, 13:29    [12513306]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
daytery
Member

Откуда:
Сообщений: 4
instead of,

Решил проблему следующем образом:

create trigger AddProductDouble
on Приход
INSTEAD of insert
as
declare @BillID int, @ProductID int, @Count int, @summ decimal(6, 2);
select @BillID = Inserted.[№Накладной], @ProductID = Inserted.КодТовара,
@Count = Inserted.Количество, @summ = Inserted.Цена
from Inserted;
if exists(select * from Приход where [№Накладной] = @BillID and КодТовара = @ProductID)
begin
update Приход set Количество = Количество + @Count, Цена = Цена + @summ
where [№Накладной] = @BillID and КодТовара = @ProductID;
end
else
begin
insert into Приход
values(@BillID, @ProductID, @Count, @summ)
end
go
Проверяю если уже есть запись то обновляю, иначе добавляю новую.
Такой подход нормален или можно решить задачу по другому?
5 май 12, 13:35    [12513352]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
daytery,

Вы не решили проблему, а набросали себе граблей. В псевдотаблицах inserted и deleted может быть более одной записи. В этом случае ваш триггер сработает непредсказуемо.
5 май 12, 13:45    [12513422]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
daytery
Member

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

А как тогда решить?
5 май 12, 13:49    [12513449]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
daytery
А как тогда решить?
Руководствуясь примерами из BOL, написать триггер правильно?
5 май 12, 14:06    [12513576]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры в MS SQL.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
daytery
invm,

А как тогда решить?
Нужно не использовать переменные, а просто писать запросы, которые вставят и изменят записи в таблице Приход.

И ипользуйте тег SRC при оформлении сообщений, удобнее будет читать.

update p 
set Количество = p.Количество + i.Количество, 
    Цена = p.Цена + i.Цена
from Приход p
	join Inserted i
		on i.[№Накладной] = p.[№Накладной]
		and КодТовара = p.КодТовара
5 май 12, 14:12    [12513616]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить