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

Откуда: Харьков
Сообщений: 10
Надо чтобы вводимое количество продукции было меньше, чем то, что существует на складе. Код:

create trigger [123]
on Чеки for insert
as
begin
if exists(select *
from inserted
where inserted.Количество <=(select Поставленная_продукция.Количество
from Чеки,Поставленная_продукция
where Чеки.КодПродукции = Поставленная_продукция.КодПродукции))
begin
rollback tran
print
'отмена поставки:товара нет на складе'
end
end


Ошибка:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression
Подскажите плз, как исправить
15 май 12, 17:07    [12558548]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
free_walker
Member

Откуда: Эта страна
Сообщений: 823
Использовать SUM и GROUP BY в подзапросе
15 май 12, 17:09    [12558557]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Yummy
Member

Откуда: Харьков
Сообщений: 10
Только начинаю разбираться с sql, мог бы кто-нибудь подсказать как нужно изменить код?
15 май 12, 17:17    [12558611]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
select *
from (
	select КодПродукции, sum(Количество) as Количество_В_Чеке 
	from inserted 
	group by КодПродукции
) i
left join (
	select inserted.КодПродукции, sum(Поставленная_продукция.Количество) as Количество_В_Наличии
	from (
		select distinct КодПродукции 
		from inserted
	) i2
	inner join Поставленная_продукция p on p.КодПродукции = i2.КодПродукции
	group by inserted.КодПродукции
) t on t.КодПродукции = i.КодПродукции
where i.Количество_В_Чеке > ISNULL(Количество_В_Наличии, 0)
15 май 12, 17:36    [12558778]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Правда это пол дела. Вам необходимо при добавлении строки в Чеки тут же в Поставленная_продукция что-то делать с Количеством (уменьшать).
15 май 12, 17:40    [12558818]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Yummy
Member

Откуда: Харьков
Сообщений: 10
ambarka_max
Правда это пол дела. Вам необходимо при добавлении строки в Чеки тут же в Поставленная_продукция что-то делать с Количеством (уменьшать).


Выдает ошибку :
The multi-part identifier "inserted.КодПродукции" could not be bound
15 май 12, 17:49    [12558885]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
inserted.КодПродукции заменить на i2.КодПродукции

И еще. Конечно все зависит от конкретной реализации, но по моему, так лучше не делать. Если есть таблица, где хранится свободный остаток по номенклатуре и существуют чеки, как документы которые списывают это наличие, то необходимо ввести состояние чека - проведен/не проведен. Далее делаете 2 процедуры: проведения чека (когда наличие указанное в чеке, списывается из остатка, и чек метится как "проведен") и распроведения (когда наличие указанное в чеке возвращается в остаток и чек метится как "непроведен"). И вот в эти процедуры уже лепите всякие проверки и т.п.
Так же добавить правило: нельзя удалять, редактировать проведенный документ (вот тут триггер может пригодиться). При такой схеме списания наличия будет гораздо меньше проблем.
15 май 12, 17:57    [12558934]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Yummy
Member

Откуда: Харьков
Сообщений: 10
ambarka_max
inserted.КодПродукции заменить на i2.КодПродукции


Заменила, саксес. Но я добавляю количество явно больше чем в наличии, и никакой ошибки не выдает.
15 май 12, 18:07    [12558996]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Yummy
Member

Откуда: Харьков
Сообщений: 10
Работает как отдельный запрос, но мне же надо чтобы был вывод ошибки при попытке добавить кол-во выше поставленого
15 май 12, 18:14    [12559039]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Yummy
Member

Откуда: Харьков
Сообщений: 10
Все, большое спасибо, разобралась.
15 май 12, 18:20    [12559067]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Yummy
Member

Откуда: Харьков
Сообщений: 10
Yummy
Все, большое спасибо, разобралась.

Хотя нет) теперь выводит ошибку, написаную мною при любом добавлении количества, даже если меньше того, что на складе
15 май 12, 18:27    [12559083]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Проверьте, что в триггере испольуется такая конструкция:
if exists( тут текст запроса )
begin
  raiserror ('Проверка сработала бла бла', 16, 1)
  rollback tran
  return
end
16 май 12, 10:57    [12561054]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
ambarka_max
inserted.КодПродукции заменить на i2.КодПродукции

И еще. Конечно все зависит от конкретной реализации, но по моему, так лучше не делать. Если есть таблица, где хранится свободный остаток по номенклатуре и существуют чеки, как документы которые списывают это наличие, то необходимо ввести состояние чека - проведен/не проведен. Далее делаете 2 процедуры: проведения чека (когда наличие указанное в чеке, списывается из остатка, и чек метится как "проведен") и распроведения (когда наличие указанное в чеке возвращается в остаток и чек метится как "непроведен"). И вот в эти процедуры уже лепите всякие проверки и т.п.
Так же добавить правило: нельзя удалять, редактировать проведенный документ (вот тут триггер может пригодиться). При такой схеме списания наличия будет гораздо меньше проблем.

+1
Избавьтесь вообще от тригера, зачем себя мучить?
Проще и понятней будет реализация через процедуры, сопровождать легче.
16 май 12, 12:42    [12562254]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с подзапросомв тригере  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
ambarka_max
Проверьте, что в триггере испольуется такая конструкция:
if exists( тут текст запроса )
begin
  raiserror ('Проверка сработала бла бла', 16, 1)
  rollback tran
  return
end
Есть и другой вариант:
if exists( тут текст запроса )
begin
  rollback tran
  raiserror ('Проверка сработала бла бла', 16, 1)
  return
end
Разница есть. К примеру для TRY/CATCH. Последствия большие.
17 май 12, 10:56    [12567924]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить