Уважаемые коллеги!
Прошу Вас помочь решить проблему сравнения дат в бизнес-процессе по наступлению события.
Пытаюсь описать в формуле БП условие ветвления при наступлении события - система выдает ошибку (см. вложенный файл)
Нравится
Юрий,
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)..].
(см. также вложенный файл)
"Зарицкий Олег" написал: По поводу задачи. Сравнение параметров с типом Дата/Время выполняется с точностью до секунд.
А не может ли произойти такого, что что-то зависнет, и даже это сравнение не сработает.
Возможно, лучшее будет условие
([Дата напоминания] < [Текущая дата/время] ) && ([Напоминание еще не сработало])
Согласен.
При ветвлении процесса всегда лучше добавлять поток по умолчанию. На случай если не выполнится ни одно из условий.
Большое спасибо, коллеги!
К сожалению такая конструкция напоминания неэффективная, процессс зацикливатеся и выполняется практически бесконечно.
Предлагается другая конструкция БП (см. вложенный файл):
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 отменить
"Ифутин Юрий Борисович" написал:А если рассмотреть другой алгоритм
Здравствуйте!
Алгоритмов реализации может быть много - главное, чтобы работало.