Skip to the content.

STREAM

Формирование сообщений из плана обмена с удалением обработанных изменений

DECLARE @Изменение object -- запись таблицы регистрации изменений
DECLARE @Заголовки object -- структура заголовков сообщения
DECLARE @Сообщение object -- структура объекта переноса данных
DECLARE @КодЭтогоУзла string
DECLARE @СчётчикСообщений number = 0
DECLARE @ПустаяСсылка uuid = '00000000-0000-0000-0000-000000000000'

USE 'mssql://server/database'

   -- Единоразовое получение кода этого узла соответствующего плана обмена
   SELECT RTRIM(LTRIM(Код))
     INTO @КодЭтогоУзла
     FROM ПланОбмена.ПланОбменаРИБ
    WHERE Предопределённый <> @ПустаяСсылка

   -- Выборка ссылок и узлов получателей из таблицы регистрации изменений плана обмена
   STREAM TOP 10
          Номенклатура = Изменения.Ссылка
        , Получатели   = STRING_AGG(RTRIM(LTRIM(ПланОбмена.Код)), ',')
     INTO @Изменение
     FROM Справочник.Номенклатура.Изменения AS Изменения
    INNER JOIN ПланОбмена.ПланОбменаРИБ     AS ПланОбмена
       ON Изменения.УзелОбмена = ПланОбмена.Ссылка
    GROUP BY Изменения.Ссылка
    ORDER BY Изменения.Ссылка ASC

   -- Формирование заголовков сообщения
   SELECT key    = UUIDOF(@Изменение.Номенклатура)
        , type   = TYPEOF(@Изменение.Номенклатура)
        , sender = @КодЭтогоУзла
     INTO @Заголовки
   
   -- Формирование объекта переноса данных
   -- Шапка объекта: { Ссылка, Код, Наименование }
   -- Табличная часть "Цены" (последние 3 цены): { Период, Цена }
   SELECT Ссылка       = UUIDOF(Ссылка)
        , Код          = RTRIM(LTRIM(Код))
        , Наименование = SUBSTRING(Наименование, 1, 30)
     INTO @Сообщение
     FROM Справочник.Номенклатура
   APPEND (SELECT TOP 3 Период, Цена
             FROM РегистрСведений.ЦеныНоменклатуры
            WHERE Номенклатура = @Изменение.Номенклатура
            ORDER BY Период ASC) AS Цены
    WHERE Ссылка = @Изменение.Номенклатура

   -- Запись сообщения в исходящую очередь
   -- Сериализация заголовков и данных в формат JSON
   INSERT РегистрСведений.ИсходящиеСообщения
   SELECT НомерСообщения = VECTOR('so_my_sequence')
        , Получатель     = @Изменение.Получатели
        , Заголовки      = JSON(@Заголовки)
        , ТипСообщения   = 'Справочник.Номенклатура'
        , ТелоСообщения  = JSON(@Сообщение)

   -- Удаление регистрации изменений из таблицы регистрации изменений плана обмена
   DELETE Справочник.Номенклатура.Изменения
    WHERE Ссылка = @Изменение.Номенклатура

   -- Счётчик успешно сформированных сообщений
   SET @СчётчикСообщений = @СчётчикСообщений + 1

END

-- Логируем итоговый результат формирования исходящих сообщений
PRINT '[Номенклатура] сформировано: ' + @СчётчикСообщений + ' сообщений'

Наверх