powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Первый тригер
8 сообщений из 8, страница 1 из 1
Первый тригер
    #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
Первый тригер
    #39636636
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык, с правильным триггером никаких проблем не возникнет.

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

Как-то ....

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

Как-то ....

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

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


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