Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

Откуда:
Сообщений: 21
Ребят,есть проблема. В БД имеется несколько таблиц, в одной (pokupka) есть поля id_check(не Primary_Key) Количество, Цена и Стоимость(вычисляемое поле как Цена*Количество), а во второй (buy_list) id_check (Primary_Key) ,Дата_покупки и Сумма_по_чеку. Необходимо извлечь Стоимость из pokupka, найти общую сумму по чеку и вывести ее в таблицу buy_list в поле Сумма_по_чеку. Написал для этого триггер, но работает он неправильно(( Почему-то выдает одно и то же число (4000) . Препод сказал, что сумму можно посчитать, введя запрос в свойство вычисляемого поля для Сумма_по_чеку, но и это не получается сделать( В таблицах inserted и deleted полей Цена и Количество нет,ошибка.. Помогите пожалуйста(( СУБД:MSSQL Server 2008 R2

Триггер для вычисления суммы:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [summing] ON [dbo].[buy_list]
AFTER INSERT,update,delete
AS 
BEGIN
SET NOCOUNT ON;
declare @new_price money
declare @new_count int
declare @new_id_check int
select @new_price=Цена, @new_count=Количество, @new_id_check=id_check from pokupka
update buy_list set Сумма_по_чеку = Сумма_по_чеку + (select sum(@new_price*@new_count) from pokupka where @new_id_check=id_check)
end
13 ноя 14, 18:29    [16842237]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Aleksandr1008,

прочитайте хелп по триггерам
там есть таблички deleted и inserted
именно из inserted надо извлекать новые значения
13 ноя 14, 19:11    [16842482]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

Откуда:
Сообщений: 21
leov,
если попытаться извлечь данные из inserted, то я не смогу обратиться к полям Цена и Количество..
14 ноя 14, 02:00    [16843618]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Aleksandr1008
leov,
если попытаться извлечь данные из inserted, то я не смогу обратиться к полям Цена и Количество..
Прилетит волшебник на голубом вертолете и покарает за обращение к этим полям, что ли?
14 ноя 14, 02:18    [16843641]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8879
Гавриленко Сергей Алексеевич
Aleksandr1008
leov,
если попытаться извлечь данные из inserted, то я не смогу обратиться к полям Цена и Количество..
Прилетит волшебник на голубом вертолете и покарает за обращение к этим полям, что ли?

Неа. Просто триггер не на ту таблицу. Наверняка, чо...
PS Если по условию задачи, триггер "не на ту таблицу", то по идентификатору операции вычисляем сумму из других таблиц.
PPS По-моему, преп хочет показать КАК НЕ НАДО ПИСАТЬ...
PPPS ИМБО, есличо.
14 ноя 14, 04:38    [16843708]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

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

триггер на ту таблицу, но значения выдает не те,что требуется...забил на триггер, в спецификации вычисляемого столбца указываю формулу select
sum(Цена*Количество) from buy where buy.id_check=id_check
, но при сохранении выдает ошибку

таблица "checks"
- Не удалось изменить таблицу.
Вложенные запросы в данном контексте не разрешены. Допускаются только скалярные выражения.

Но в виде запроса он считает сумму по всем id_check. Как заставить работать эту формулу только для текущего id_check?
14 ноя 14, 07:57    [16843838]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

Откуда:
Сообщений: 21
Гавриленко Сергей Алексеевич,

не покарает, но говорит что в этой таблице таких полей не существует
14 ноя 14, 07:58    [16843839]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Aleksandr1008
Гавриленко Сергей Алексеевич,

не покарает, но говорит что в этой таблице таких полей не существует
Подсказка - в триггере можно обращаться более, чем к одной таблице.
14 ноя 14, 10:25    [16844385]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Вообще изврат помещать в триггер бизнес-логику. Триггер должен служить целям поддержания целостности и достоверности - это его прямое назначение.
Но если препод сказал - тут не поспоришь
14 ноя 14, 11:51    [16845025]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Aleksandr1008
Препод сказал, что сумму можно посчитать, введя запрос в свойство вычисляемого поля для Сумма_по_чеку, но и это не получается сделать
Чувствуется, что сам этот уважаемый аксакал не доучился в своё время.
Ученик лезет на форум, а не обращается к преподавателю за разъяснениями - это о многим говорит.

Думаю, в жизни надо было бы попробовать реализовать решение через индексированное представление.
А не пересчитывать то и дело поле таблицы.
14 ноя 14, 11:58    [16845080]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
реальный кейс, когда сначала создался buy_list, а потом добавилась еще одна покупка в него я думаю даже не рассматривается.
Я не говорю уже о просто апдейте задним числом цены товара в pokupka.
p.s. Если уж триггер - то однозначно на pokupka.
14 ноя 14, 12:58    [16845663]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Не знаю на счет препода, но автор - точно нихера не понял.
Надо сделать так.

Короче при любом изменении состава покупки нужно пересчитывать сумму в чеке.

create trigger tiud_pokupka on pokupka
for insert, update, delete
AS
BEGIN

	update bl
	set
		bl.[Сумма_по_чеку] = p.new_sum
	from bay_list bl
	cross apply(select sum(p.[Количество]) new_sum
				from pokupka p with(nolock)
				where
						p.id_check = bl.id_check) p
	where
			bl.id_check in (select distinct i.id_check from inserted i)

END
14 ноя 14, 14:01    [16846280]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jaffar
Надо сделать так.

При изменении одной записи пересчитывать все ?
14 ноя 14, 14:03    [16846291]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Glory,
при изменении состава чека(ов) - пересчитывать все чеки, для которых что-то было изменено в pokupki.
17 ноя 14, 08:11    [16856234]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jaffar
при изменении состава чека(ов) - пересчитывать все чеки, для которых что-то было изменено в pokupki.

Чтобы сервер не простаивал что ли ?
17 ноя 14, 09:12    [16856367]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Glory
Jaffar
при изменении состава чека(ов) - пересчитывать все чеки, для которых что-то было изменено в pokupki.

Чтобы сервер не простаивал что ли ?



А вы что предлагаете?
рассчитывать сумму чека как bl.[Сумма_по_чеку] = bl.[Сумма_по_чеку] + sum(i.кол-во) - sum(d.кол-во) ?
17 ноя 14, 10:22    [16856731]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Jaffar
А вы что предлагаете?
рассчитывать сумму чека как bl.[Сумма_по_чеку] = bl.[Сумма_по_чеку] + sum(i.кол-во) - sum(d.кол-во) ?

разумеется
17 ноя 14, 10:25    [16856754]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Jaffar
Glory
пропущено...

Чтобы сервер не простаивал что ли ?



А вы что предлагаете?
рассчитывать сумму чека как bl.[Сумма_по_чеку] = bl.[Сумма_по_чеку] + sum(i.кол-во) - sum(d.кол-во) ?
Для этого придуманы indexed view
IMHO
17 ноя 14, 10:37    [16856848]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
iap
Jaffar
пропущено...



А вы что предлагаете?
рассчитывать сумму чека как bl.[Сумма_по_чеку] = bl.[Сумма_по_чеку] + sum(i.кол-во) - sum(d.кол-во) ?
Для этого придуманы indexed view
IMHO


так то оно так,
только вот что делать если чек - является помимо суммы самостоятельным объектом, со своими атрибутами?
17 ноя 14, 11:21    [16857148]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Jaffar
iap
пропущено...
Для этого придуманы indexed view
IMHO


так то оно так,
только вот что делать если чек - является помимо суммы самостоятельным объектом, со своими атрибутами?
Не вижу противоречия
17 ноя 14, 11:22    [16857160]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

Откуда:
Сообщений: 21
не понятно,о чем вы говорите...преподаватель сказал чтобы сам разбирался-я написал триггер,но не могу понять,почему он выдает какую-то левую цифру...можете помочь хотя бы исправить ошибки,а не осуждать человека?
26 ноя 14, 12:54    [16907354]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aleksandr1008
можете помочь хотя бы исправить ошибки,

Ваш триггер выдает "левую инфу" потому, что делает рассчеты по всей таблице, а не по измененным записям.

Aleksandr1008
а не осуждать человека?

вы считаете, что здесь все собрались с единственной целью поосуждать вас ?
26 ноя 14, 13:00    [16907403]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

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

а как тогда по измененным записям посчитать? мне необходимо вывести общую сумму по каждому id_check,а не общую сумму...что надо изменить? и по поводу обсуждения,препод сказал разбираться сам,а я инфу толковую найти не могу,вот и прошу помощи у других людей..
26 ноя 14, 13:07    [16907456]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aleksandr1008
а как тогда по измененным записям посчитать?

Об этом вам сообщили в первом же ответе 16842482 две недели назад
26 ноя 14, 13:09    [16907479]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление общей суммы(триггер)  [new]
Aleksandr1008
Member

Откуда:
Сообщений: 21
Об этом вам сообщили в первом же ответе 16842482 две недели назад[/quot]

и вот что происходит в этом случае...

К сообщению приложен файл. Размер - 13Kb
26 ноя 14, 13:15    [16907528]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить