Сравнение дат в БП при наступлении события

Уважаемые коллеги!

Прошу Вас помочь решить проблему сравнения дат в бизнес-процессе по наступлению события.
Пытаюсь описать в формуле БП условие ветвления при наступлении события - система выдает ошибку (см. вложенный файл)

Нравится

14 комментариев

Юрий,

1. Ошибка связна с конструкцией условия. В потоке “Время напоминания наступило” следует указать [Param1] == [Param2] (добавить еще один знак “=”).
2. По поводу задачи. Сравнение параметров с типом Дата/Время выполняется с точностью до секунд. Поэтому шанс, что выполнится условие [Дата напоминания] == [Текущая дата/время] стремится к нулю.
Как вариант можно воспользоваться свойством .TotalMinutes - https://msdn.microsoft.com/en-us/library/system.timespan.totalminutes(v… :
- создать параметр процесса [Дата напоминания] – передать значение из чтения данных
- создать параметр процесса [Текущая дата] – указать значение DateTime.Now
- в условном потоке указать [Дата напоминания] .TotalMinutes == [Текущая дата]. TotalMinutes

Большое спасибо, Олег!

Однако, возникла другого типа ошибка:

[Ошибка при выполнении выражения "ProcessSchemaParameter7.TotalMinutes==ProcessSchemaParameter6.TotalMinutes": No property or field 'TotalMinutes' exists in type 'DateTime' (at index 24)..].

(см. также вложенный файл)

Поправочка! Свойство .TotalMinutes есть только у TimeSpan (у DateTime нет) и возвращает значение с типом дробное.
Т.е. необходимо проверить, что [разница 2 параметров].TotalMinutes = 0.
Результат будет выглядеть как на скриншоте.

"Зарицкий Олег" написал: По поводу задачи. Сравнение параметров с типом Дата/Время выполняется с точностью до секунд.

А не может ли произойти такого, что что-то зависнет, и даже это сравнение не сработает.
Возможно, лучшее будет условие

([Дата напоминания] < [Текущая дата/время] ) && ([Напоминание еще не сработало])

Согласен.
При ветвлении процесса всегда лучше добавлять поток по умолчанию. На случай если не выполнится ни одно из условий.

Большое спасибо, коллеги!

К сожалению такая конструкция напоминания неэффективная, процессс зацикливатеся и выполняется практически бесконечно.
Предлагается другая конструкция БП (см. вложенный файл):
1. Вычислить разность дат - между датой напоминания и текущей датой, получим количество секунд.
2. Вставляем в обработку таймера полученное время в секундах и через это время происходит отправка e-mail напоминание ответственному.

Уважаемые коллеги, помогите пжл. правильно написать в формуле БП разность дат - сколько ни пробовал, сколько ни тренировался, ничего не получилось.

"Ифутин Юрий Борисович" написал: Вставляем в обработку таймера полученное время в секундах

в таком варианте всегда возникает вопрос - а что, если дату напоминания поменяют?

"Ифутин Юрий Борисович" написал:Уважаемые коллеги, помогите пжл. правильно написать в формуле БП разность дат - сколько ни пробовал, сколько ни тренировался, ничего не получилось.

1. Создать 2 параметра процесса с типом Дата/Время
2. Замапить значение параметров процесса на чтение данных.
3. В формуле указать ([Param1] - [Param]).TotalSeconds. Учитывать, что тип возвращаемого значения - Дробное.

в таком варианте всегда возникает вопрос - а что, если дату напоминания поменяют?

Чтобы поменять дату напоминания, необходимо снять галочку в напоминании, затем сохранить, а потом еще раз поставить галочку... Для процесса это означает активация нового события от которого и запускается сам процесс... Но вот запущенный процессс, надо как-то тогда отменять...

2. Замапить значение параметров процесса на чтение данных.

Коллеги, подскажите, что значит "замапить" - я этот слэнг пока не понимаю... Если можно, напишите конкретно как это сделать...

Создал параметры дата/время: "Текщуая Дата" и "Дата напоминания ответственному".
Создал параметр дробное число: "Время до напоминания".
В формуле БП написал следующее выражение:
([#Дата напоминания ответственному#]-[#Текущая дтата#]).TotalSeconds
поместил в параметр "Время до напоминания"
В формулу БП "Обработка таймера" написал: [#Время до напоминания#]
При сохранении процесса получил ошибку:
Невозможно преобразовать тип "Decimal" в "Int32" для элемента или параметра "IntermediateCatchTimer1.StartOffset"

И вот так уже второй день - ни фига не получается...

Процес заработал...
Для этого переделал параметр "Время до напоминания" как целое число.
В формуле БП для разности дат написал:
ОкруглитьВниз(([#Дата напоминания ответственному#]-[#Текущая дтата#]).TotalSeconds)

Процесс работает достаточно точно по времени...

Однако, как и предполагал Владимир Соколов, если поменять дату напоминания, предыдущий процесс надо как-то отменять, так как предыдущий процесс работает до первой даты напоминания и также напоминает по e-mail как и измененная дата ...

Как думаете коллеги, как это сделать?

"Ифутин Юрий Борисович" написал:Однако, как и предполагал Владимир Соколов, если поменять дату напоминания, предыдущий процесс надо как-то отменять, так как предыдущий процесс работает до первой даты напоминания и также напоминает по e-mail как и измененная дата ...

В этом процессе сделать Event Gateway, в одной ветке которого ожидать наступления времени по таймеру, а в другой ветке - ожидать сигнала изменения или удаления напоминания.
Если дождались сигнала, то завершать процесс, и таймер будет отменен.

И стартует этот же процесс на добавление/изменение уведомления.

А если рассмотреть другой алгоритм:

1. Фиксируем "Текущую дату1" при запуске 1-го напоминания
2. Фиксируем "Текущую дату2" при запуске 2-го напоминания
3. Если "Текущая дата2">"Текущая дата1" и (Состояние не равно "Завершена" или Состояние не равно"Отменена"), то Процесс№1 отменить

"Ифутин Юрий Борисович" написал:

А если рассмотреть другой алгоритм

Здравствуйте!

Алгоритмов реализации может быть много - главное, чтобы работало.

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