Шаг 28 - Триггер вставки и общие суммы

Использование триггера на вставку позволяет реализовать расшифровки. Ну стандартная ситуация. Оформляется счет на какую-то сумму. Этот счет имеет номер и имеет общую сумму. Но вместе с этим он имеет и расшифровку выражающуюся в списке оказанных услуг. Хранить нужно и общую сумму по счету и расшифровку. Данная ситуация укладывается в модель один ко многим описанную в "Шаг 116 - Связи один ко многим". Один счет много составляющих. При срабатывании триггера ставки создается временная таблица inserted, в которой находится одна или несколько вставляемых записей. Вот структура таблицы на все услуги, я ее назвал allchet.

Здесь есть ID_CHET, то есть по какому счету услуга, у нее есть имя и цена. И есть таблица chet, где будет храниться счет и его сумма.

Я взял везде Int, чтобы не морочить голову с типами. Итак. При добавлении в таблицу allchet списка нужно добавить в таблицу chet его номер и стоимость. Возможны две ситуации. Первая - это когда заносится первая запись расшифровки, и вторая, когда заносятся дополнительные записи расшифровки. На них нужно реагировать по разному.

CREATE TRIGGER INSERT_NOMER ON dbo.allchet 
FOR INSERT 
AS
DECLARE @summs int
DECLARE @ids int
SELECT @ids=(SELECT IDCHET FROM inserted)
IF ( SELECT COUNT(*) FROM chet WHERE chet.Nomer=@ids) > 0
BEGIN
 SELECT @summs=(SELECT SUM(COUNTPRISE) FROM allchet WHERE allchet.idchet=@ids)
 UPDATE chet SET PRISE=@summs WHERE nomer=@ids
END
ELSE
BEGIN
 SELECT @summs=(SELECT COUNTPRISE FROM inserted)
 INSERT INTO chet (Nomer,Prise) VALUES(@ids,@summs)
END

Здесь я написал, что первое это получить ID счета. Потом проверить, есть ли счета с такими ID. Если да, то получить новую сумму, иначе создать такой счет. Ну, что будем тестировать ? В Access самое простое. Заносим расшифровки:

Смотрим сводную таблицу.

Добавим еще одну запись к расшифровкам для первого счета.

Сработало.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 22.09.2001