Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2016, 22:09   #1
don_zaresh
 
Регистрация: 10.02.2016
Сообщений: 9
По умолчанию Триггер на вставку

Здравствуйте!
Товарищи, помогите с триггером на вставку значений. Скриншот физической модели базы данных в приложении.

Четыре таблицы.
Таблица invoice - это расходная накладная, которая оформляется на выбранного клиента

Таблица product - это товар, который имеет срок годности.

Таблица production - это производство, точнее партии. Хотелось бы организовать просто склад, но приходится извращаться с партиями, чтобы учесть срок годности. Соответственно, при продаже товар выбирается и списывается из конкретной партии, срок годности которой не вышел.
Иными словами, один и тот же товар может быть в N-ом количестве партий с разными сроками годности

Таблица selling - это список товаров в одной накладной. Первичный ключ этой таблицы составной. Когда мы продаем товар, то вбиваем его так: в накладную с id=X добавить товар с id=Y из партии с id=Z. Это позволяет вбивать в одну накладную один и тот же товар, просто из разных партий


Теперь сам триггер. Сначала я проверяю условие на количество в партии. Если количество в партии меньше продаваемого товара, то надо откатить транзакцию.
Если все нормально, то записываем номер накладной, код товара и код партии, а также проданное количество sell_quantity. На это количество должно уменьшиться количество в партии, то есть production_quantity:=production_qua ntity - sell_quantity


Теперь сама проблема. Триггер в Microsoft SQL Server прописывается. Но когда пытаюсь добавить товар:

INSERT INTO selling
(id_invoice, id_product, id_consigment, sell_quantity)
VALUES (здесь указываю верные значения. проверял много раз)

выдает ошибку
процедура i_trigger_ogren_insert, строка 8
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =,!=,<,<=,>,>= или используется в качестве выражения

Значит напортачил в триггере. Пожалуйста, подскажите, что в коде надо исправить?
Код:
CREATE TRIGGER i_trigger_ogren_quantity
	ON selling 
	FOR INSERT
AS
DECLARE @x INT, @y INT, @z INT, @a INT
IF @@ROWCOUNT=1
BEGIN
      IF NOT EXISTS(SELECT *  FROM inserted
      WHERE inserted.sell_quantity<= (SELECT production.production_quantity FROM production, selling
			WHERE production.id_consigment = selling.id_consigment AND production.id_product = selling.id_product)
           BEGIN
           ROLLBACK TRAN
           PRINT 
           'Количество вводимого товара превышает количество в партии. Операция отменена'
            END
	    ELSE

	BEGIN
            SELECT @y=i.id_product, @x=i.sell_quantity, @z = i.id_consigment, @a=i.id_invoice
            FROM selling A, inserted i
            WHERE A.id_product=i.id_product AND A.id_consigment=i.id_consigment AND A.id_invoice = i.id_invoice

             UPDATE production
             SET production_quantity=production_quantity-@x
             WHERE id_product=@y AND id_consigment=@z
       END	

END

На всякий случай прикладываю триггер на удаление товара из накладной (при этом вернуть удаляемое количество обратно в партию). Он работает без проблем

Код:
CREATE TRIGGER d_trigger_quantity
	ON selling 
	FOR DELETE
AS
IF @@ROWCOUNT=1 
BEGIN
  DECLARE @idcons INT, @quan INT

  SELECT @idcons=id_consigment, @quan=sell_quantity
  FROM deleted
     UPDATE production
     SET production_quantity=production_quantity + @quan
     WHERE id_consigment=@idcons
END
Изображения
Тип файла: jpg скриншот.jpg (50.3 Кб, 85 просмотров)

Последний раз редактировалось don_zaresh; 19.09.2016 в 22:15.
don_zaresh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос на вставку формулы Kapkom Microsoft Office Excel 2 28.06.2016 17:39
переделать с С++ на ассм. вставку AlexVI Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 19.07.2014 12:10
Запрет на вставку, на специальную вставку Аслан Абдрахманов Microsoft Office Excel 11 11.02.2014 10:21
Макрос на вставку строк dirih Microsoft Office Excel 7 28.06.2013 16:19
макрос на вставку строк hakervanya Microsoft Office Excel 11 25.09.2012 19:30