Коллеги, мне необходимо реализовать БП, где триггер - добавление обращения в очередь, см. скриншот
К сожалению такой тригер не ловится системой. Кто нибудь знает почему и что с этим можно сделать?
Нравится
Татьяна, на вопрос «почему» ответить несложно: вся логика наполнения этой таблицы реализована в БП «Процесс наполнения очередей единого окна», где вызывают логику функции 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.
А что делать, сказать сложнее. Возможно, сделать свой процесс, который тоже запускается по таймеру и анализирует наполнение этой таблицы, как-то помечая те, которые уже просмотрены и их повторно учитывать не нужно. Или переопределить упомянутую базовую логику, чтобы она ещё делала нужное Вам.