Вопрос

Доброго времени суток!

Необходимо запустить N подпроцессов из основного процесса и каким-то образом ожидать выполнения всех подпроцессов.

Буду благодарен любым идеям.

UPD-1. Изначально не известно сколько будет подпроцессов, поэтому такого рода схема не подойдет

У меня такой же вопрос

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

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

что то вроде такого -http://prntscr.com/ocm1ol

Вот наглядный пример, создал 3 БП, в них добавил разные таймеры и посмотрим как идет обработка в главном БП
http://prntscr.com/ocmaqq - Главный
http://prntscr.com/ocmaxg - 1 мин задержки
http://prntscr.com/ocmb6t - 2 мин задержки
http://prntscr.com/ocmbg8 - 3 мин задержки

Запускаем основной и смотрим диаграму:
http://prntscr.com/ocmc05
http://prntscr.com/ocmc9u
http://prntscr.com/ocmck4 - завершился (диаграма выполнения основного без изменения - http://prntscr.com/ocmcso)
http://prntscr.com/ocmda0

Нигрескул Алексей,

Обновил описание вопроса

Если процессы создаёте кодом, то можно их количество записать в определённое поле, а в конце дочернего процесса отнимать от значения единицу. На изменение поля на ноль в основном процессе повесить сигнал.

Зверев Александр,

А где создавать это поле? И как сделать обработчик сигнала?

В каком-то объекте, подходящем по логике, с которым по смыслу связаны эти процессы. Обработчик — сигнал на изменение поля в объекте.

Зверев Александр,

То есть нужно в дочернем процессе сначала считать эту колонку селектом затем сделать update? НО если эти дочерние процессы завершаться секунда в секунду, то подсчет не будет верным. Как быть тогда?

Уменьшать и считывать старое значение можно в том же запросе.

Зверев Александр,

Гарантируется ли при использовании этого запроса правильный подсчет одновременно завершающихся подпроцессов?

Этот способ не является стандартным. Как такое делать штатно, описал выше для фиксированного числа процессов Алексей. Тут же все гарантии будет давать разработчик, то есть Вы. По идее, если всё в одном SQL-запросе, то мешать не будет.

Зверев Александр,

Зверев Александр пишет:Уменьшать и считывать старое значение можно в том же запросе.

Через такой запрос не генерится сигнал 

Действительно, в таком случае используйте не Update, а ESQ. Синхронизацию в этом случае нужно предусмотреть самостоятельно. Либо же менять при помощи Update, а в следующем шаге менять другое поле по ESQ или посылать сигнал иным образом.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

БП продажи
Задача: Создать N-счетов, для каждого созданного счета создать задачу, переводить продажу в состояние "Завершена" только после завершения всех задач, если хотя бы одна задача с отрицательным результатом - отменять продажу.

Решил обернуть это все в подпроцесс, которому на вход передаю количество счетов(вводится пользователем), а результат будет храниться в параметре подпроцесса. В элементе "script" создаю нужное кол-во сущностей. Вопрос - как теперь заставить БП ожидать все созданные задачи?

У меня такой же вопрос

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

Вам нужен элемент "Слияние" (треугольник) в редакторе БП.

Я бы точно мог его использовать, если бы количество задач было заранее известной константой. я бы нарисовал, допустим, 10 задач и направил бы это в слияние - отлично. Но я не знаю сколько будет задач, так как это указывает пользователь для каждого договора в процессе выполнения БП

Добрый день!

Занимался когда-то похожей задачей.
нашел сервисы процесса (во вложении).
Суть в том, чтобы проверять количество завершенных и не завершенных подпроцессов.
services.rar
сервисы для версии 3.3.1.148 (MSSQL)

Спасибо за ответы, уже натолкнули коллеги на решение - В элементе "Скрипт" создать в цикле все задачи и перейти в следующий элемент "Скрипт", где запросом проверять статус задач и по результатам выставлять текущему WorkflowItem(наш элемент "Скрипт") параметр IsCompleted в true или false. Запускать этот элемент каждый раз когда изменяем задачу данного БП.

Войдите или зарегистрируйтесь, чтобы комментировать
Публикация

 Задача:
При завершении подпроцесса возможны варианты окончания, взависимости от результата, которых основной процесс также может развиваться по двум и более ветвям.

Тестовый пример диаграмм процесса и подпроцесса дан в приложенных файлах. Идея не моя она была дана в топике http://community.terrasoft.ua/forum/topic/3566#comment-17027. В том же топике она и была разобрана, но так как обсуждение длинное и по большей части связанное с моей неопытностью в разаработке, то здесь приведу краткий алгоритм реализации и грабли на которые наступал я.
 Для передачи результатов завершения подпроцесса была выбрана модель которую предложила Екатерина Мельникова: для передачи информации о результате завершения подпроцесса необходимо создать связанные параметры.
1.Для этого в палитре свойств диаграммы подпроцесса TestSub открываем свойство «Объект» и параметр ResultIDSubProcess с типом «Строка».(Рекомендую кроме «Имени» и типа ничего не трогать)
2. В палитре свойств диаграммы основного процесса Test открываем свойство «Объект» и параметр ResultFromProcess с типом «Строка».
3.Нажимаем кнопку связи объектов и выбрав в нижнем левом окне подпроцесс — задаем свойства его параметра ResultIDSubProcess — назаначив ему тип Исходящий(т.е. Передающий свое значение) и связав с параметром диаграммы ResultFromProcess.
 Для присваивания значения параметру подпроцесса, мы используем способ предложенный В.Андрусиком: создание в конце каждой ветки объекта типа «Скрипт», где мы присваиваем значение парметру подпроцесса ResultIDSubProcess(далее значение в процесс предается по связям назначенным нами в интерфейсе «Связи объектов»). Я использовал просто строковые значения «Yes» и «No». 
Функции обработки вызываются на событии «OnExecute» объекта типа «Скрипт» в подпроцессе. Для присваивания значений в скрипте подпроцесса я использовал два варианта(это совершенно необязательно, просто эксперементировал). При использовании функций WFGetParamValue(Diagram,NameParam) -получить значение параметра по имени или WFSetParamValue(Diagram,NameParam,Type) — присвоить значение параметра по имени, обязательно добавлять в раздел «Использовать скрипты» в скрипте диаграммы скрипт «scr_WorkflowUtils».
 В основном процессе для анализа значений параметра процесса ResultFromProcess добавляем объект «Выбор» и пишем скрипт для извлечения значения параметра и его анализа.
P.S. В скриптах процесса и подпроцесса есть еще скрипты, в которых тоже передаются значения параметров, для заполнения значений Контрагента и Контакта в карточке Задачи, по технологии предложенной в топике: http://community.terrasoft.ua/forum/topic/927. 

Поделиться

1 комментарий

Прикрепил файлы ;-). Версия TS CRM - 3.3.0.49 под MS SQL 2005.

Войдите или зарегистрируйтесь, чтобы комментировать