Коллеги, мне необходимо реализовать БП, где триггер - добавление обращения в очередь, см. скриншот
К сожалению такой тригер не ловится системой. Кто нибудь знает почему и что с этим можно сделать?
Нравится
Татьяна, на вопрос «почему» ответить несложно: вся логика наполнения этой таблицы реализована в БП «Процесс наполнения очередей единого окна», где вызывают логику функции ProcessAutoUpdateQueues из QueuesUpdateUtilities.
Там добавление идёт при помощи Insert, который не вызывает событий:
/// <summary> /// Adds elements from queue with filtration. /// </summary> /// <param name="entitySchemaName">Entity schema name of queue element.</param> /// <param name="entitySelect">Query to queue object with filtration.</param> /// <param name="queueId">Identifier of queue.</param> /// <param name="queueName">Queue name.</param> /// <param name="itemsCount">Count of not handled elements in queue.</param> /// <returns>Added queue items count.</returns> private int AddEntityQueueItemsByFilter(string entitySchemaName, Select entitySelect, Guid queueId, string queueName, int itemsCount) { try { if (itemsCount >= _maximumQueueItemsInQueue) { QueuesUtilities.LogWarn(string.Format(GetResourceValue("QueueMaximumItemsWarning"), queueName)); return 0; } entitySelect.Top(_insertQueueItemTopValue) .Column(new QueryParameter("QueueId", queueId)).As("QueueId") .Column(new QueryParameter("StatusId", _newQueueItemStatusId)).As("StatusId"); var selectCondition = new QueryCondition(); selectCondition.IsNot = true; selectCondition.Exists( new Select(_userConnection) .Column("QueueItem", "Id") .From("QueueItem") .InnerJoin("QueueItemStatus") .On("QueueItemStatus", "Id").IsEqual("QueueItem", "StatusId") .Where(entitySchemaName, "Id").IsEqual("QueueItem", "EntityRecordId") .And("QueueItem", "QueueId").IsEqual(Column.Parameter(queueId)) .And("QueueItemStatus", "IsFinal").IsNotEqual(Column.Parameter(true))); if (!entitySelect.HasCondition) { entitySelect.Where(selectCondition); } else { entitySelect.And(selectCondition); } var insertSelect = new InsertSelect(_userConnection) .Into("QueueItem") .Set("EntityRecordId", "QueueId", "StatusId") .FromSelect(entitySelect); DateTime addedRecordsStartTime = DateTime.Now; int addedRecords = insertSelect.Execute(); if (addedRecordsStartTime.AddSeconds(60) < DateTime.Now) { insertSelect.BuildParametersAsValue = true; QueuesUtilities.LogDebug(string.Format(GetResourceValue("LongInsertQueueItemsMessage"), queueName, _autoUpdateQueuesProcessId.ToString(), insertSelect.GetSqlText())); } return addedRecords; } catch (Exception e) { QueuesUtilities.LogError(string.Format(GetResourceValue("InvokeMethodErrorMessage"), string.Concat("AddEntityQueueItemsByFilter ", queueName), e.Message), e); throw; } }
Аналогично и с удалением из очереди.
Сам процесс запускается по планировщику, задание создаётся в QueuesUtilities в функции UpdateQueuesTrigger.
А что делать, сказать сложнее. Возможно, сделать свой процесс, который тоже запускается по таймеру и анализирует наполнение этой таблицы, как-то помечая те, которые уже просмотрены и их повторно учитывать не нужно. Или переопределить упомянутую базовую логику, чтобы она ещё делала нужное Вам.