Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Первый тригер / 8 сообщений из 8, страница 1 из 1
26.04.2018, 11:04
    #39636625
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
Всем привет. Прошу критики листинга, ранее я с триггерами не работал, всегда находил возможность решать задачи другими способами. Сейчас безвыходная ситуация, код клиентского ПО закрыт а контора жмет денег на доработку.

Задача:
При закрытии документа оприходования товара (таблица Receipt, шапка документа, статус закрытого документа "9") определенного типа ("21" или "22") необходимо обновлять данные в связанных документы на отгрузку, связь осуществляется по полю "PoKey". Обновить нужно отгружаемое количество штук для каждого товара, на принятое количество (таблица строк документа отгрузки OrderDetail), в завершении требуется обновить суммарное количество (сумма количества принятого товара) в шапке документа (таблица Orders).
По факту товар в документе оприходования всегда присутствует в документе отгрузки.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
Create trigger dbo.EditDocDetails
       on dbo.Receipt
       after update
as
begin
     if exists ( 
                   select 1
                   from inserted
                   where Status = '9'         -- Статус закрытия документа
                         and Type in ( '21'
                                     , '22'
                                     )
                         and PoKey <> ''      -- номер документа закупки
               )
     begin
          -- обновление строк документа
          Update docdet
                 set OpenQty = newset.QtyReceived
          from dbo.Orders as doc
               inner join dbo.OrderDetail as docdet
                       on doc.StorerKey = docdet.StorerKey
                          and doc.OrderKey = docdet.OrderKey
               inner join ( 
                              select recdet.StorerKey
                                   , recdet.Sku
                                   , recdoc.Pokey
                                   , Sum( recdet.QtyReceived) as QtyReceived
                              from inserted as recdoc 
                                   inner join dbo.ReceiptDetail as recdet ( nolock )
                                           on recdoc.StorerKey = recdet.StorerKey
                                              and recdoc.ReceiptKey = recdet.ReceiptKey
                              where recdoc.Status = '9'         -- Статус закрытия документа
                                    and recdoc.Type in ( '21'   -- тип документа
                                                       , '22'   -- тип документа
                                                       )
                                    and recdoc.PoKey <> ''      -- номер документа закупки
                              group by recdet.StorerKey
                                     , recdet.Sku
                                     , recdoc.Pokey
                           ) as newset
                             on doc.PoKey = newset.PoKey
                                and docdet.StorerKey = newset.StorerKey
                                and docdet.Sku = newset.Sku
          -- обновление документа
          Update doc
                 set OpenQty = newset.QtyReceived
          from dbo.Orders as doc
               inner join ( 
                              select recdet.StorerKey
                                   , recdoc.Pokey
                                   , Sum( recdet.QtyReceived) as QtyReceived
                              from inserted as recdoc 
                                   inner join dbo.ReceiptDetail as recdet ( nolock )
                                           on recdoc.StorerKey = recdet.StorerKey
                                              and recdoc.ReceiptKey = recdet.ReceiptKey
                              where recdoc.Status = '9'         -- Статус закрытия документа
                                    and recdoc.Type in ( '21'   
                                                       , '22'   
                                                       )
                                    and recdoc.PoKey <> ''      -- номер документа закупки
                              group by recdet.StorerKey
                                     , recdoc.Pokey
                           ) as newset
                             on doc.PoKey = newset.PoKey
                                and doc.StorerKey = newset.StorerKey
     end
end



Какие проблемы могут возникнуть с использованием триггеров? Заранее всем спасибо!
...
Рейтинг: 0 / 0
26.04.2018, 11:25
    #39636636
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
Дык, с правильным триггером никаких проблем не возникнет.

А тебе следует, таки, привить себе отвращение к лишним группировкам.
...
Рейтинг: 0 / 0
26.04.2018, 11:40
    #39636648
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
Да вот, не хотелось бы создавать вьюшку и обновлять данные в одном Update, тогда мог бы получить результат обоих агрегатов (по товарам и общий) за одно обращение к таблице inserted
...
Рейтинг: 0 / 0
26.04.2018, 11:51
    #39636654
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
а если существующее закрытое ПО корректирует те же таблицы?
...
Рейтинг: 0 / 0
26.04.2018, 11:55
    #39636658
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
andreymxа если существующее закрытое ПО корректирует те же таблицы? Нет, этого в ней не происходит, документы живут отдельной жизнью друг от друга.
...
Рейтинг: 0 / 0
26.04.2018, 12:19
    #39636686
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
IDVTandreymxа если существующее закрытое ПО корректирует те же таблицы? Нет, этого в ней не происходит, документы живут отдельной жизнью друг от друга.

Как-то ....

Триггер апдейтит все подходящие записи в таблицах, не глядя на то, какие были изменны в данном коннекте.
Если два и более приложений будут работать с документом этот триггер сработает для каждого изменения.
...
Рейтинг: 0 / 0
26.04.2018, 12:42
    #39636699
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
Ролг ХупинIDVTпропущено...
Нет, этого в ней не происходит, документы живут отдельной жизнью друг от друга.

Как-то ....

Триггер апдейтит все подходящие записи в таблицах, не глядя на то, какие были изменны в данном коннекте.
Если два и более приложений будут работать с документом этот триггер сработает для каждого изменения.

Ситуация такова, после закрытия документа оприходования (Статус "9"), ПО не позволяет редактировать документ. Триггер как раз выполнит обновление, в случае наличия статуса закрытия. Проверять именно Статус на его изменение нет смысла, т.е. сравнивать таблицы inserted и deleted.
...
Рейтинг: 0 / 0
26.04.2018, 13:12
    #39636727
ЛиП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Первый тригер
Я бы написал if not exist then return 0
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Первый тригер / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]