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

Откуда:
Сообщений: 57
Есть 3 таблицы:
Поставки(Код_наименования, Номер_задания, Группа_инженера, Наименование, Обозначение, Количество_плановое)
Поставщики(Код_поставщика, Код_наименования, Поставщик, Город)
Приход(Код_счета, Код_поставщика, Количество, Цена_фактическая)

мне нужно получить таблицу(из нее потом будет просходить экспорт в эксель), к примеру update_501(Группа_инженера, Наименование, Обозначение, Количество),
которая будет содержать уникальные обозначения по группе инженера 501, а в поле Количество сумма из значений поля Количество таблицы Приход по каждому обозначению.

Сначала формирую ее так
Insert dbo.update_501(Наименование, Обозначение, Группа_инженера)
select Наименование ,Обозначение, Группа_инженера
from Поставки
where (I.Группа_инженера = 501)
group by Наименование ,Обозначение, Группа_инженера


у меня возникла проблема с триггером, который должен добавлять в update_501 записи с "Обозначение", которых еще там нет.

ALTER trigger [update_pki_501] ON [dbo].[Поставки]
After Insert

as
begin
Set nocount on;
if (not(exists(select * from [INSERTED])))
return;

Insert dbo.update_501(Наименование, Обозначение, Группа_инженера)
select I.Наименование
	  ,I.Обозначение
	  ,I.Группа_инженера
from Inserted I
where (I.Группа_инженера = 501) and (update_501.Обозначение <> I.Обозначение) 
end


Эта конструкция
(update_501.Обозначение <> I.Обозначение)
не годится.
Подскажите как правильно?

И хотя бы идею, как сделать чтобы в поле Количество накапливалась сумма для данного Обозначения?
22 авг 12, 14:45    [13049569]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
Версию сервера не огласили, а то merge было бы уместнее...

ALTER trigger [update_pki_501] ON [dbo].[Поставки]
After Insert
as
begin
Set nocount on;
if (not(exists(select * from [INSERTED])))
return;

Insert dbo.update_501(Наименование, Обозначение, Группа_инженера)
select I.Наименование
	  ,I.Обозначение
	  ,I.Группа_инженера
from Inserted I
where (I.Группа_инженера = 501)
 and not exists(select * from dbo.update_501 x where x.Группа_инженера=I.Группа_инженера and x.Обозначение = I.Обозначение) 
end
22 авг 12, 14:57    [13049674]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
этот код не нужен
if (not(exists(select * from [INSERTED])))
return;


триггер срабатывает, когда что-то добавляется. Поэтому в INSERTED всегда есть записи.
22 авг 12, 15:04    [13049740]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
trew
триггер срабатывает, когда что-то добавляется. Поэтому в INSERTED всегда есть записи.

Наивный.
22 авг 12, 15:09    [13049777]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
trew
этот код не нужен
if (not(exists(select * from [INSERTED])))
return;


триггер срабатывает, когда что-то добавляется. Поэтому в INSERTED всегда есть записи.
Что-то новенькое!
А если так:
INSERT T(F) SELECT NULL WHERE 2*2=5;
?
Тоже есть записи?

Вот зачем там скобок накручено мама не горюй?
Это действительно непонятно.
22 авг 12, 15:11    [13049806]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
iap
Вот зачем там скобок накручено мама не горюй?
Это действительно непонятно.
А это похоже, что просто копипастятся примеры триггеров от RubinDm
22 авг 12, 16:11    [13050362]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2, спасибо.
Со скобочками действительно было взято оттуда.
А как мне сумму посчитать, реально ли это вообще в том виде, в котором я запланировал?
23 авг 12, 08:43    [13053009]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
frz
aleks2, спасибо.
Со скобочками действительно было взято оттуда.
А как мне сумму посчитать, реально ли это вообще в том виде, в котором я запланировал?

Все можна. Единственно непонятно: нафега тебе считать именно а триггере и, ваще, нафега здесь триггер?
23 авг 12, 08:46    [13053015]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
qwerty112
Guest
trew
этот код не нужен
if (not(exists(select * from [INSERTED])))
return;


триггер срабатывает, когда что-то добавляется. Поэтому в INSERTED всегда есть записи.

маи грабли :)
если у вас на самом деле так - "в INSERTED всегда есть записи" - это баг не патченного сервера
посмотрите эту тему AFTER INSERT UPDATE(COUNT SERVICES)
23 авг 12, 08:55    [13053039]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2,
это все для выгрузки в эксель, поля спецификация(аналогичное) и приход будут заполняться спустя какое-то время после выгрузки остальных полей(их больше чем в таблице апдейт_501). Я и подумал, что может накапливать их а потом после выгрузки в эксель устанавливать null, а в экселе уже будет макрос который будет раскидывать нужные значения в спецификации и прихода по обозначениям. Может я не прав.

qwerty,
тему смотрел, но у меня возникли проблемы со связыванием таблиц, как не сделаю, либо не туда добавляется либо ошибки
23 авг 12, 09:17    [13053110]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
frz
aleks2,
это все для выгрузки в эксель, поля спецификация(аналогичное) и приход будут заполняться спустя какое-то время после выгрузки остальных полей(их больше чем в таблице апдейт_501). Я и подумал, что может накапливать их а потом после выгрузки в эксель устанавливать null, а в экселе уже будет макрос который будет раскидывать нужные значения в спецификации и прихода по обозначениям. Может я не прав.

Ты не прав.
23 авг 12, 10:13    [13053313]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2
Ты не прав.


А как тогда можно осуществить, то что я написал?
23 авг 12, 10:41    [13053493]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
frz
aleks2
Ты не прав.


А как тогда можно осуществить, то что я написал?


Прямой расчет во View, если очень много данных Indexed View.
23 авг 12, 10:54    [13053591]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2

Прямой расчет во View, если очень много данных Indexed View.


А чем плох вариант с триггером?
Опыта у меня немного, поэтому не очень представляю каким образом это осуществить с view. С триггером мне хотя бы понятно, что в таблицу для выгрузки выбираются добавленные значения.
23 авг 12, 11:13    [13053767]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
frz
aleks2
Прямой расчет во View, если очень много данных Indexed View.


А чем плох вариант с триггером?
Опыта у меня немного, поэтому не очень представляю каким образом это осуществить с view. С триггером мне хотя бы понятно, что в таблицу для выгрузки выбираются добавленные значения.


Что произойдет с данными, которые будут вставлены между моментом выгрузки в эксель и моментом очистки таблицы?
23 авг 12, 11:18    [13053819]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2

Что произойдет с данными, которые будут вставлены между моментом выгрузки в эксель и моментом очистки таблицы?

Наверное что-то нехорошее, если вы сакцентировали внимание на этом моменте)
Я видимо задаю неверные вопросы, но это связано с тем, что не имею достаточно опыта чтобы оценить.
23 авг 12, 12:09    [13054362]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2, можешь подсказать как формировать представление по тем условиям, которые я написал? понимаю, тут приветствуется постинг сперва своих наработок, но у меня совершенно нет идей.
23 авг 12, 14:10    [13055476]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
aleks2
Guest
create view dbo.MyUpdate
with schemabinding
as
select Наименование ,Обозначение, Группа_инженера, SUM( Количество ) as [Количество сумма ], COUNT_BIG(*) as Cnt
from Поставки
group by Наименование ,Обозначение, Группа_инженера

go

create unique clustered index IX_MyUpdate on dbo.MyUpdate  (Наименование ,Обозначение, Группа_инженера);


go
-- данные для "экспорта в эксель"
-- если прочие Группа_инженера <> 501 не нужны - фильтр можно перенестьи в определение view
select * from dbo.MyUpdate with(noexpand) where Группа_инженера = 501
23 авг 12, 14:23    [13055567]     Ответить | Цитировать Сообщить модератору
 Re: проблема с триггером  [new]
frz
Member

Откуда:
Сообщений: 57
aleks2,
спасибо!
23 авг 12, 14:42    [13055680]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить