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

Откуда: Moscow
Сообщений: 124
Есть таблица номенклатуры счета-фактуры (dbo.tblITEMS_OF_SHIPMENT). На добавление позиции срабатывает триггер, который пересчитывает сумму в шапке счета-фактуры (dbo.tblSHIPMENT).
ALTER TRIGGER [dbo].[trg_tblITEMS_OF_SHIPMENT_RECOUNTSUM_INS] ON [dbo].[tblITEMS_OF_SHIPMENT]
FOR INSERT
AS 
BEGIN
--после вставки новой позиции номенклатуры пересчитываем сумму в шапке отгрузки
	DECLARE @SH_SUM float,
		@SH_ID int
	SET @SH_ID=(SELECT DISTINCT SF_SHID FROM inserted)
	SET @SH_SUM=(SELECT dbo.fnGetShipmentItemsSumWAT(@SH_ID))

	UPDATE dbo.tblSHIPMENT  SET SH_MTRSUM=@SH_SUM WHERE SH_ID=@SH_ID
END
GO
EXEC sp_settriggerorder @triggername=N'[dbo].[trg_tblITEMS_OF_SHIPMENT_RECOUNTSUM_INS]', @order=N'First', @stmttype=N'INSERT'

Постоянно возникает проблема с округлением. Причем, если выполнить тело триггера отдельно, результат получается корректный! Пробовал из триггера вставлять полученное значение в другую таблицу - результат также правильный. А в родительскую таблицу попадает результат +-1 копейка. Тип поля SH_MTRSUM float
Заранее спасибо...
10 авг 09, 17:50    [7519038]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
1. +-1 копейка - это какой знак после запятой в вашем float
2. В вашем триггере не видно никаких вычислений.
3. Триггер неправильный по своей логике. Потому что будет неправильно работать при массовом добавлении записей.
10 авг 09, 17:55    [7519076]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
Sendie
Member

Откуда: Moscow
Сообщений: 124
массового добавления быть не может, точнее пока этим я не заморачивался, база в стадии разработки.
вычисление работает правильно, я написал что отдельно выполняется. Вот функция
ALTER FUNCTION [dbo].[fnGetShipmentItemsSumWAT]
(
	@SH_ID int
)
RETURNS float
AS
BEGIN
	
	DECLARE @ResultVar float
	SELECT @ResultVar=( SELECT sum(round(SF_MTRPRICE_WONDS*SF_MTRNUM,2)*(1+SF_PCENT_NDS/100))
			FROM	dbo.tblITEMS_OF_SHIPMENT
			WHERE
				sf_shid=@sh_id)	
	RETURN @ResultVar
END
10 авг 09, 18:01    [7519102]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вообще-то float и заданная точность вычислений - понятия несовместимые. Имхо
Почему не decimal выбран ?

ЗЫ
Не может быть массового добавления и массовые добавления проверяются/обрабатываются в триггере - это суть разные вещи. Код сразу нужно писать правильно.
10 авг 09, 18:05    [7519119]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Sendie
массового добавления быть не может, точнее пока этим я не заморачивался, база в стадии разработки.
вычисление работает правильно, я написал что отдельно выполняется. Вот функция
ALTER FUNCTION [dbo].[fnGetShipmentItemsSumWAT]
(
	@SH_ID int
)
RETURNS float
AS
BEGIN
	
	DECLARE @ResultVar float
	SELECT @ResultVar=( SELECT sum(round(SF_MTRPRICE_WONDS*SF_MTRNUM,2)*(1+SF_PCENT_NDS/100))
			FROM	dbo.tblITEMS_OF_SHIPMENT
			WHERE
				sf_shid=@sh_id)	
	RETURN @ResultVar
END

вы бы поучились базы проектировать пока не поздно, а? Быть не может! Как-нибудь - обязательно будет. Чего сложного - сразу писать триггер правильно?
update dbo.tblSHIPMENT SET SH_MTRSUM = (SELECT dbo.fnGetShipmentItemsSumWAT(i.SF_SHID))
from inserted i join dbo.tblSHIPMENT t on i.SF_SHID = t.SH_ID
да и функция тут ну ваааапще не нужна...
update dbo.tblSHIPMENT SET SH_MTRSUM = t1.s
from inserted i join dbo.tblSHIPMENT t on i.SF_SHID = t.SH_ID
	join (SELECT sum(round(SF_MTRPRICE_WONDS*SF_MTRNUM,2)*(1+SF_PCENT_NDS/100)) s
		  FROM	dbo.tblITEMS_OF_SHIPMENT
		  group by sf_shid) t1 on t1.sf_shid=i.SF_SHID
а для хранения денежных сумм есть тип money, с фиксированной точкой.
10 авг 09, 18:10    [7519145]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
Sendie
Member

Откуда: Moscow
Сообщений: 124
спасибо за советы.

Функция используется в других местах, поэтому удобно.
Поменял на money, не помогло.
Насчет множественного инсерта согласен, переделал.
10 авг 09, 18:25    [7519203]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
iljy
Member

Откуда:
Сообщений: 8711
Sendie
спасибо за советы.

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


на money поменяли - round уберите. а функция может и удобна, но на проблемы с быстродействием можете нарваться здорово. сделайте ее хотя бы inline table-valued, такие функции оптимизатор умеет разбирать.
10 авг 09, 18:31    [7519232]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
Sendie
Member

Откуда: Moscow
Сообщений: 124
все это, тем не менее, не объясняет, почему в триггере одно, а выполняя его содержимое отдельно получается другое.
10 авг 09, 18:32    [7519234]     Ответить | Цитировать Сообщить модератору
 Re: Неверно отрабатывает триггер  [new]
Sendie
Member

Откуда: Moscow
Сообщений: 124
все ок, всем спасибо. Получил одинаковый результат, по крайней мере в функции и триггере. Пересчитал на калькуляторе...Расхождение с оригиналом осталось, но, видимо, поставщик дал счет-фактуру, в которой округление происходит как-то по-своему :)
10 авг 09, 18:42    [7519275]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить