Как получить старое значение поля перед сохранением записи?
Есть задача считать кол-во переносов задачи.
Сделал поле "кол-во переносов" и когда у задачи дата завершения меняется, то +1 к переносам.
Потом может быть будет получена задача выводить список переносов (кто, на какой срок). Поэтому подумал, что может сделать в рамках аудита, но не понятно как в bpm сделать поле с запросом с sql (как в тройке можно было). Такое можно сделать в bpm?
Начал копать в сторону на событие перед сохранением записи. Но не понятно как получить старое значение колонки. Есть ли какое-нибудь свойство OldValue и как его получить?
Если нет, думаю над двумя костылями:
1) После загрузки данных, записывать значение в переменную и сравнивать с ней
2) В скрипте делать запрос к БД к этой активности (перед сохранением запись еще не изменена и там находится старое значение)
Какие есть пути решения?
Нравится
Добрый день, Александр Владимирович!
Для решения Вашей задачи используйте следующие возможности:
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 уже сравнивать с текущим значением
Владимир, данный вариант предполагает хорошие навыки программирования. Мой вариант подойдет для пользователей, которые не владеют программированием.