Как получить старое значение поля перед сохранением записи?

Есть задача считать кол-во переносов задачи.
Сделал поле "кол-во переносов" и когда у задачи дата завершения меняется, то +1 к переносам.
Потом может быть будет получена задача выводить список переносов (кто, на какой срок). Поэтому подумал, что может сделать в рамках аудита, но не понятно как в bpm сделать поле с запросом с sql (как в тройке можно было). Такое можно сделать в bpm?

Начал копать в сторону на событие перед сохранением записи. Но не понятно как получить старое значение колонки. Есть ли какое-нибудь свойство OldValue и как его получить?

Если нет, думаю над двумя костылями:
1) После загрузки данных, записывать значение в переменную и сравнивать с ней
2) В скрипте делать запрос к БД к этой активности (перед сохранением запись еще не изменена и там находится старое значение)

Какие есть пути решения?

Нравится

4 комментария

Добрый день, Александр Владимирович!

Для решения Вашей задачи используйте следующие возможности:
1) Создайте деталь с полями:

  • Старая дата начала
  • Новая дата начала
  • Старая дата окончания
  • Новая дата окнончания
  • Активности

Поля "Создал" и "Дата создания" - системные
Колонка связи с объектом Активности - Деталь.Активность=Активность.Id.
2) Создайте бизнес процесс с двумя входами:

  • При добавлении записи "Активность"
  • При изменении записи "Активность" в полях "Дата начала", "Завершение"

Логика следующая:
1) Первая запись будет создаваться при добавлении активности
2) Узнать старую дату начала Вы сможете в поле "Новая дата начала", старую дату окончания - в поле "Новая дата окончания", отсортировав записи на детали по дате создания по убыванию.
3) Количество переносов = (количество записей на детали - 1)

А в объекте Contact в процессе есть следующий метод NamePartColumnChanged, в котором как раз отслеживается старое значение:

return changedColumns.Any(column => {
return
column.Name == namePart &&
column.Value != null &&
!string.IsNullOrEmpty(column.Value.ToString()) &&
!column.Value.Equals(column.OldValue);
});

Так же в событии Saving доступно значение Entity.GetTypedOldColumnValue("FieldName"), которое можно записать в параметр, а потом в событии Saved уже сравнивать с текущим значением

Владимир, данный вариант предполагает хорошие навыки программирования. Мой вариант подойдет для пользователей, которые не владеют программированием.

Показать все комментарии